Java2EE Framework/프레임워크 개념

퍼시스턴스 영역의 패턴 DTO 와 DAO

본클라쓰 2010. 5. 5. 13:51

 

DTO(Data Transger OBject)와 DAO(Data Access Object)는 퍼시스턴스 영역에서 사용되는 자바빈을 뜻하면 특정 패턴을 통해 구현되는 자바빈입니다.

 

 

 

DTO(Data Transfer Object)

 

DTO는 VO(Value Object)로 바꿔 말할 수 있는데 계층간 데이터 교환을 위한 자바빈즈을 말한다. 여기서 말하는 계층간의 컨트롤러, 뷰, 비즈니스 계층, 퍼시스턴스 계층을 말하며 각 계층간 데이터 교환을 위한 객체를 DTO 또는 VO라고 부른다.

 

대표적인 DTO로는 폼데이터빈, 데이터베이스 테이블빈 등이 있으며, 각 폼요소나, 데이터베이스 레코드의 데이터를 매핑하기 위한 데이터 객체를 말한다. 즉, 폼 필드들의 이름을 그대로 가지고 잇는 자바빈 객체를 폼 필드와 그대로 매핑하여 비즈니스 계층으로 보낼 때 사용하나다. 이런 객체를 DTO라고 부르며 VO(Value Object) 패턴이라고도 한다. VO 패턴은 데이터 전달을 위한 가장 효율적인 방법이지만, 클래스 선언을 위해 많은 코드가 필요하다는 단점이 있다.

 

일반적인 DTO는 로직을 갖고 있지 않다. 순수한 데이터 객체이며 속성과 그 속성에 접근하기 위한 getter, setter 메소드만 가진 클래스를 말한다. 여기에 추가적으로 toString(), equals(), 등의 Object 클래스 메소드를 작성할 수 있다. 즉, 계층 간에 데이터 전달에 사용하는 데이터 객체들을 말한다.

 

 

데이터 전송에 사용할 수 있는 패턴의 종류

  1. DTO: 데이터 객체를 통한 데이터 전달
  2. HashMap: Map 객체를 통해 Key와 Value로 데이터 전달
  3. RowSet: 데이터베이스 Row를 그대로 전달하는 방법

 

▲ DTO 클래스 예제

public class user {

    String id;

    String pass; 

  

    public String getId() { return id; } 

    public String getPass() { return pass; } 

    public String setId(String id) { this.id = id; } 

    public String setPass(String pass) { this.pass = pass; }  

}

 

 

 HashMap 예제

import java.util.*;

 

HashMap hm = new HashMap();

 

hm.put("key1", "value1");

hm.put("key2", "value2"); 

 

System.out.println("HashMap size : " + hm.size() );

 

Set set = hm.keySet();

Object hmkeys[] = set.toArray();

 

String key = (String)hmkeys[0] ;

hm.get(key);

 

 

HashMap은 HashTable을 기반으로 인터페이스의 구현 객체입니다.  HashMap 객체는 키와 값을 가진 집합을 말하며, 중복을 허용하지 않습니다. 즉, 한개의 키에 한개의 값이 매칭됩니다. java.util.* 패키지에 있습니다.

  

 

 

DAO(Data Access Object)

 

DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트를 말한다. 보통 JDBC를 통해 구현된 객체이며 데이터베이스의 하나의 테이블에서 수행할 수 있는 CRUD를 전담하는 객체를 말한다.

 

DAO 클래스 예제)

public int deleteArticle(int articleId, String writer) throws Exception {
    // JDBC 변수 선언
    Connection conn=null;
    PreparedStatement pst=null;
    ResultSet rs=null;
    int result=0;
  
    // 데이터베이스 테이블에서 얻는 작성자를 저장하기 위한 변수
    String dbwriter="";
  
    try{
        conn=getConnection();
   
        // 테이블에서 인수num값을 통해 글쓴이를 검색하는 쿼리문
        String sql="select writer from board where num=?";
        pst=conn.prepareStatement(sql);
        pst.setInt(1, articleId);
        rs=pst.executeQuery();

        // 검색 결과가 존재한다면 if문 수행
       if(rs.next()){
           // 테이블에서 받은 글쓴이를 dbwriter에 저장
           dbwriter=rs.getString("writer");
    
              // dbwriter와 인자 writerd의 문자열을 비교하여 같은 경우 if문 수행
              if(dbwriter.equals(writer)){
                  pst=conn.prepareStatement("delete from board where num=?");
                  pst.setInt(1, articleId);
                  pst.executeUpdate();
        }
    }
   
    result=1;
   
   }catch(Exception e){
       e.printStackTrace();
   }finally{
      if(rs!=null) try{ rs.close(); }catch(SQLException e){}
      if(pst!=null) try{ pst.close(); }catch(SQLException e){}
      if(conn!=null) try{ conn.close(); }catch(SQLException e){}
   }
  
  return result;
  
 }

 

 

 

※ 참고

데이터 객체는 클래스명 뒤에 VO라고 붙이고, DAO 객체는 클래스명 뒤에 DAO라고 붙입니다. 이는 각 계층을 구분하기 위해 클래스명을 짓는 방법일 뿐입니다.