본문 바로가기

[JAVA] DAO, DTO, VO 차이 본문

공부/프로그래밍

[JAVA] DAO, DTO, VO 차이

demonic_ 2018. 7. 1. 09:30

DAO 정의

Data Access Object 의 약자로 데이터베이스의 data에 접근하기 위한 객체입니다.

DataBase 접근을 하기 위한 로직과 비지니스 로직을 분리하기 위해 사용합니다.


DAO의 경우는 DB와 연결할 Connection 까지 설정되어 있는 경우가 많습니다.

그래서 현재 많이 쓰이는 Mybatis 등을 사용할 경우 커넥션풀까지 제공되고 있기 때문에 DAO를 별도로 만드는 경우는 드뭅니다.



DAO 클래스 예제

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TestDao {

    public void add(TestDto dto) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "root");

        PreparedStatement preparedStatement = connection.prepareStatement("insert into users(id,name,password) value(?,?,?)");


        preparedStatement.setString(1, dto.getName());
        preparedStatement.setInt(2, dto.getValue());
        preparedStatement.setString(3, dto.getData());
        preparedStatement.executeUpdate();
        preparedStatement.close();
        
        connection.close();

    }
}





DTO 정의 
DTO(Data Transfer Object) 는 계층간 데이터 교환을 위한 자바빈즈를 의미합니다. 

여기서 말하는 계층간의 의미는 Controller, View, Business Layer, Persistent Layer 등을 말하며 각 계층간 데이터 교환을 위한 객체를 의미합니다. 

DTO는 로직을 가지지 않는 순수한 데이터 객체이고 getter, setter 메소드만 가진 클래스를 의미합니다. 


DTO 클래스 예제
public class PersonDTO {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
위의 클래스를 보면 getter/setter 가 존재합니다. 
여기서 중요한건 Property(프로퍼티) 개념인데, 자바는 Property가 문법적으로 제공되지 않습니다.

자바에서 프로퍼티라는 개념을 사용하기 위해 지켜야 할 약속이 있습니다. 
setter/getter 에서 set과 get 이후에 나오는 단어가 property라고 약속하는 것입니다. 
그래서 위 클래스에서 프로퍼티는 name과 age 입니다. 
중요한 것은 프로퍼티가 멤버변수 name, age로 결정되는 것이 아닌 getter/setter에서의 name과 age임을 명심해야 합니다. 
즉 멤버변수는 아무렇게 지어도 영향이 없고 getter/setter 로 프로퍼티(데이터)를 표현한다는 것이다. 

자바는 다양한 프레임워크에서 데이터 자동화처리를 위해 리플렉션 기법을 사용하는데, 데이터 자동화 처리에서 제일 중요한 것은 표준규격입니다. 예를들어 윗 클래스 DTO에서 property가 name, age라면 name, age의 키값으로 들어온 데이터는 리플렉션 기법으로 setter를 실행시켜 데이터를 넣을 수 있습니다. 
중요한 것은, 우리가 setter를 요청하는 것이 아닌 프레임워크 내부에서 setter가 실행된다는 점입니다.(눈에 보이지않음) 

그래서 layer간(특히 서버 -> View로 이동 등)에 데이터를 넘길때에는 DTO를 쓰면 편하다는 것이 이런이유 때문입니다. View에 있는 form에서 name 필드 값을 프로퍼티에 맞춰 넘겼을 때, 받아야 하는 곳에서는 일일히 처리하는 것이 아니라 name속성의 이름이랑 매칭되는 프로퍼티에 자동적으로 DTO가 인스턴스화 되어 PersonDTO를 자료형으로 값을 받을 수 있습니다. 그래서 key-value 로 존재하는 데이터는 자동화 처리된 DTO로 변환되어 쉽게 데이터가 셋팅된 오브젝트를 받을 수 있습니다.




VO 정의 

VO(Value Object) 는 DTO와 혼용해서 쓰이긴 하지만 미묘한 차이가 있습니다.

VO는 값 오브젝트로써 값을 위해 쓰입니다. 자바는 값 타입을 표현하기 위해 불변 클래스를 만들어서 사용하는데, 불변이라는 것은 readOnly 특징을 가집니다.


이러한 클래스는 중간에 값을 바꿀 수 없고 새로 만들어야 한다는 특징이 있습니다..

예를들어 Color클래스를 보면 Red를 표현하기 위해 Color.RED 등을 사용하며 getter기능만이 존재합니다.




비슷한 VO와 DTO 를 구분하자.


DTO와 VO의 공통점은 넣어진 데이터를 getter를 통해 사용하므로 주 목적은 같습니다. 그러나 DTO의 경우는 가변의 성격을 가진 클래스 입니다(setter 활용). 그에반해 VO는 불변의 성격을 가졌기에 차이점이 있습니다. 

2 Comments
댓글쓰기 폼