Back-End/Spring Boot

[Spring] DAO, DTO, VO의 개념과 차이점

koh1018 2022. 12. 14. 20:52
반응형

DAO (Data Access Object)

: DB의 data에 접근하기 위한 객체로 실제로 DB에 접근하는 객체이다. 프로젝트의 서비스 모델과 실제 DB를 연결하는 역할을 하며, JPA에서는 DB에 데이터를 CRUD하는 Repository 객체들이 DAO라고 볼 수 있다.

(좀 더 찾아보니 DAO와 REPOSITORY에 의도와 인터페이스의 메소드 시그니처에 유사성이 존재하지만 그렇다고 해서 둘을 동일한 패턴으로 취급하면 안된다고 한다. 아래 김영한 님의 말씀을 인용해 적어둔다.)

repository := dao (비슷함)
이 둘은 거의 같다고 생각하셔도 무방합니다. 좀 더 깊이있게 차이를 설명하면, repotiroy는 엔티티 객체를 보관하고 관리하는 저장소이고, dao는 데이터에 접근하도록 DB접근 관련 로직을 모아둔 객체입니다. 둘다 개념의 차이일뿐 실제로 개발할 때는 비슷하게 사용됩니다.

 

출처 : https://www.inflearn.com/questions/111159/domain%EA%B3%BC-repository-%EC%A7%88%EB%AC%B8

 

 

DTO (Data Transfer Object)

: 계층 간 데이터 교환을 하기 위해 사용하는 객체로, 로직을 가지지 않는 순수한 데이터 객체이다. 따라서 일반적으로 DTO는 순수한 데이터 객체로써 속성과 그 속성에 접근하기 위한 getter, setter 메소드만 가진 클래스이다. (여기에 추가적으로 toString(), equals()등의 Object 클래스 메소드를 작성할 수 있다.)

DB에서 꺼낸 데이터를 저장하는 Entity를 가지고 만드는 일종의 Wrapper라고 볼 수 있는데, Entity를 Controller와 같은 클라이언트단과 직접 마주하는 계층에 직접 전달하는 대신 DTO를 사용해 데이터를 교환한다.

 

 

 

VO (Value Object)

: 값 오브젝트로써 값을 위해 쓰인다. Read-Only의 특징을 가진다.

다만 DTO와의 차이는, DTO는 데이터를 계층간 교환(Transfer)하는데 의미가 있고, VO는 읽기만 가능한 read-only 속성을 가진 객체로서 데이터 그 자체에 의미를 두고 있다는 점이다. 즉, VO는 setter가 없다.

 

 

 


 

 

유저가 입력한 데이터를 DB에 넣는 과정

1. 유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어 전송한다.

2. 해당 DTO를 받은 서버가 DAO를 이용해 DB로 데이터를 집어넣는다.

 

 

 

DAO vs DTO

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와의 연결만을 전담하는 클래스이다.

 

 

 

DTO vs VO

DTO는 가변의 성격을 가진 클래스이며 데이터 전송을 위해 존재한다.(getter/setter)
그에 반해 VO는 값 그 자체의 의미를 가진 불변 클래스(Read-Only)를 의미한다.(getter만 존재)

DTO는 인스턴스 개념이라면 VO는 리터럴 개념이다.
즉, DTO는 Layer간의 통신 용도로 오고가는 객체이고, VO는 특정한 비즈니스 값을 담는 객체이다.

 

 

반응형