DAO는 실제 DB에 접근하는 객체를 뜻한다.
프로젝트의 Service 모델과 실제 DB를 연결하는 역할을 한다.
JPA에서는 DB에 데이터를 CRUD하는 Repository 객체들이 DAO 역할을 한다고 볼 수 있다.
DTO는 데이터를 Transfer(이동)하기 위한 객체이다. Client가 Controller에게 요청을 보낼 때도 RequestDto의 형식으로 데이터가 이동하고, Controller가 Client에게 응답을 보낼 때도 ResponseDto의 형태로 데이터를 보내게 된다.
Controller와 Service, Repository 계층 사이에 데이터가 오갈 때도 데이터는 DTO의 형태로 이동하게 된다.
DTO는 로직을 갖고 있지 않는 순수한 데이터 객체이며, 일반적으로 getter/setter 메서드만을 가진다. 하지만 DTO는 단순히 데이터를 옮기는 용도이기 때문에 굳이 Setter를 이용해 값을 수정할 필요 없이, 생성자만을 사용하여 값을 할당하는 것이 좋다.
View Layer와 DB Layer의 역할을 분리
Entity 객체의 변형을 방지
View와 통신하는 DTO 클래스의 잦은 변동
View(클라이언트)와 통신하는 DTO 클래스, 예를 들어 ResponseDTO, RequestDTO는 요구사항에 따라 자주 변경된다.
어떤 요청에서는 특정 값이 추가될 수도 있고, 특정 값이 없을 수도 있다.
따라서 Entity 클래스와 분리하여 관리해야 한다.
도메인 모델링의 보호
예를 들어 Entity 클래스의 특정 컬럼들을 조합하여 특정 포맷을 출력하고 싶은 경우, Entity 클래스에 표현을 위한 필드나 로직이 추가되면 객체 설계를 망가뜨릴 수 있다. 따라서 DTO에 표현을 위한 로직을 추가해서 사용하는 것이 Entity의 도메인 모델링을 지킬 수 있다.
DAO는 DB에 접속, 명령 전송을 전담하는 클래스이고, DTO는 특정 테이블의 정보를 레코드 단위로 정의해놓은 클래스이다.
예를 들어 DB에 어떤 학교의 학과번호, 학과명, 학생수를 관리하기 위한 테이블이 있다.
테이블 이름 : DEPARTMENT
컬럼 항목 : ID, NAME, NUM
그리고 아래와 같이 3개의 레코드가 저장되어 있다.
ID | NAME | NUM |
---|---|---|
1 | Computer Science | 483 |
2 | Biotechnology | 213 |
3 | Mathematics | 154 |
이 때, 레코드를 하나의 자료형으로 다루기 위해 정의한 클래스를 DTO라고 한다.
public class DepartmentDTO {
private int id;
private String name;
private int num;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
이에 반해 DAO는 이 DTO에 정보를 저장하기 위해 DB와의 연결만을 전담하는 클래스이다.
값 오브젝트로써, 값을 위해 쓰이며, Read-Only의 특징을 가진다.
다만, DTO와의 차이는 DTO는 데이터를 계층간 교환(Transfer)하는 데 의미가 있고, VO는 읽기만 가능한 read-only 속성을 가진 객체로서 데이터 그 자체에 의미를 두고 있다는 점이다. 즉, VO는 setter가 없다.
예를 들어 DB의 Employee 라는 테이블에 id, name, age 컬럼이 있다고 할 때
@Entity
// JPA를 사용할 경우, @Entity 어노테이션을 붙여 해당 클래스가 Entity 클래스임을 명시
public class Employee {
@Id
private Long id;
private String name;
private int age;
이에 대응하는 Entity 클래스 Employee는 위와 같은 필드들만 가져야 한다.
Controller는 클라이언트의 요청을 DTO의 형태로 받아 Service의 기능을 호출하고, 적절한 응답을 DTO의 형태로 반환하는 역할을 한다. 즉, 요청과 응답을 관리하는 계층이라고 생각하면 된다.
Service 계층은 DTO를 통해 받은 데이터를 이용해 비즈니스 로직을 처리하고, DAO(혹은 Repository)를 통해 DB에 접근하여 데이터를 관리하는 역할을 한다.
JPA를 사용하면 Repository를 통해 DB에 실제로 접근할 수 있다. Service와 DB를 연결해주는 역할을 하며, Service 계층에서 Repository를 이용하여 데이터를 관리할 수 있다.