데이터베이스의 data에 접근하기 위한 객체이며 데이터베이스 접근을 하기 위한 로직과 비즈니스 로직을 분리하기 위해 사용한다.
사용자는 자신이 필요한 interface를 DAO에게 던지고 DAO는 이 interface를 구현한 객체를 사용자에게 편리하게 사용할 수 있도록 반환한다.
DAO는 데이터베이스와 연결할 Connection까지 설정되어 있는 경우가 많다.
그래서 현재 쓰이는 MyBatis 등을 사용할 경우 커넥션풀까지 제공되고 있기 때문에 DAO를 별도로 만드는 경우는 드물다.
VO라고도 표현하며 계층 간 데이터 교환을 위한 자바 빈즈(Java Beans)이다.
데이터베이스 레코드의 데이터를 매핑하기 위한 데이터 객체를 말한다. DTO는 보통 로직을 가지고 있지 않고 data와 그 data에 접근을 위한 getter, setter만 가지고 있다.
정리하면 DTO는 Database에서 Data를 얻어 Service나 Controller 등으로 보낼 때 사용하는 객체를 말한다.
자바는 property가 문법적으로 제공되지 않는다.
자바에서는 property라는 개념을 사용하기 위해 지켜야 할 약속이 있다.
setter/getter에서 set과 get 이후에 나오는 단어가 property라고 약속하는 것이다.
public class PersonDTO {
private String name;
public String getName() {
return name;
}
}
그래서 위 클래스에서 프로퍼티는 name이다.
중요한 것은 프로퍼티가 멤버 변수 name으로 결정되는 것이 아닌 getter/setter 에서의 name이다.
즉 멤버 변수는 아무렇게 지어도 영향이 없고 getter/setter로 프로퍼티(데이터)를 표현하는 것이다.
VO는 DTO와 혼용해서 쓰이긴 하지만 미묘한 차이가 있다.
VO는 값 오브젝트로써 값을 위해 쓰인다. 자바는 값 타입을 표현하기 위해 불변 클래스를 만들어 사용하는데, 불변이라는 것은 read only 특징을 가진다.
DTO와 VO의 공통점으 넣어진 데이터를 getter를 통해 사용하므로 주 목적은 같으나 DAO는 가변적인 성격을 가진 클래스이며(setter 활용) 그에 반해 VO는 불변의 성격을 가졌기에 차이점이 있다.