누군가 나한테 DTO 알아하면, "응 사용한적 있어" 라고 답한다. DAO는 알아라고 하면, "DB 접근할 때 사용하는 거라는 데 아직 사용해본 적은 없는 것 같다"라고 한다. VO는? "그건 뭔지 몰라"라고 한다. 따라서 이번 포스팅을 통해 DAO, DTO, VO의 정확한 개념에 대해 공부하려 한다.
DTO
Data Transfer Object의 약자로, 계층 간의 데이터 교환을 하기 위해 사용하는 객체이다.
계층 간??
- MVC 패턴 : Controller와 View가 도메인 Model의 데이터를 주고 받을 때 DTO 사용
- Layered Architecture : 각 계층 간의 데이터 교환시 DTO 사용
DTO 특징
- 순수 데이터 객체
- 오직 getter/setter 메서드만 갖는다.
- setter를 사용하는 것보다는 생성자를 사용하는 것을 추천!
- 생성자를 사용하는 것보다 Builder 패턴을 사용하는 것을 추천!!!
- 다른 로직을 갖지 않는다.
Entity와 DTO 분리
Entity 클래스는 DB의 테이블에 존재하는 Column들을 필드로 가지는 객체로, DB의 테이블과 1대 1로 대응되며, 테이블이 가지지 않는 칼럼을 필드로 가져서는 안된다.
@Entity
public class Person {
private String name;
private int age;
}
Entity와 DTO를 분리하는 이유
- 관심사의 분리 : Entity와 DTO의 정의만 둘은 다르다는 것을 알 수 있다. DTO의 관심사는 데이터의 전달이고, Entity의 관심사는 실제 데이터베이스와 관련된 중요한 역할을 하며 내부적으로 EntityManager에 의해 관리되는 객체이다.
- Entity의 내부 값이 변경되면, EntityManger의 flush가 동작하여 변경을 감지하고 이를 DB에 반영한다. 따라서 Entity 클래스를 외부에 노출하고 데이터 교환에 사용하는 것은 위험하다.
- Entity는 DB의 테이블의 칼럼을 필드로 가지고 있기 때문에, 데이터 교환시 원하는 데이터만을 주고받는 것은 어려울 수 있다. 따라서 원하는 데이터만을 주고 받을 수 있게 DTO를 만드는 것을 추천한다.
DAO
Data Access Object의 약자로, 실제 DB에 접근하는 객체이다.
- 프로젝트의 서비스 모델과 실제 데이터베이스를 연결하는 역할
- Layered Architecture에서 DB의 데이터를 CRUD 하는 Repository 객체같은 것 같지만 다르다고 한다. (참고 : Repository vs DAO)
VO
Value Object의 약자로, 값 자체를 표현하는 객체
- Read-Only 속성을 가진다.
- 자바에서 단순히 값 타입을 표현하기 위해 불변 클래스를 만들어 사용한다.
- getter 기능만 있다.
DTO vs VO
DTO는 가변의 성격을 가진 클래스이며 데이터 전송을 위해 존재한다. 반면에 VO는 값 그 자체의 의미를 가진 불면 클래스를 의미한다.
참고문헌
https://m.blog.naver.com/cjhol2107/221757079506
https://www.youtube.com/watch?v=z5fUkck_RZM&list=PLE0hRBClSk5Lcgv3c-I3PH-1LGkv96oYN&index=47