키워드 : Entity, DTO, DAO, VO
얼핏 보면 비슷해 보이는 개념이지만 코드를 작성하다 보면 이들을 구분하여 사용해야 하는 순간이 온다.
나는 수요조사 form 작성부터 통신 판매로 이어지는 웹 프로젝트를 하던 도중 Entity와 DTO 사용에 대한 고민을 하게 되어 이와 같은 내용을 정리하게 되었다.
Entity
- Entity 단어 그 자체의 의미는 '개체'다.
- DB에서 entity는 논리적 구성요소로, 정보의 단위며 표현하려는 유무형 정보의 객체라는 의미를 가진다.
- Springboot의 entity 클래스는 DB와 대응을 하는 부분으로 entity 클래스의 요소들이 DB의 table에 매칭된다.
@Entity 에너테이션이 붙은 클래스에서 도메인 모델을 정의하고 이를 JPA가 DB의 table에 매핑한다.
- Entity의 변경은 연관된 모든 클래스에 영향을 주기 때문에 변경을 지양한다. (이러한 이유로 view의 다양한 요청에 따른 값의 전달 등의 경우 Entity가 아닌 DTO를 통해 한다.)
DTO (Data Transfer Object)
- DTO는 데이터 전달을 위한 객체로 계층(Controller, Service, Repository)간 데이터 전송에 사용된다.
- 데이터 전달만을 목적으로 하고 있기 때문에 DTO의 경우 다른 로직을 가지고 있지 않다.
- Getter, Setter 메서드를 통해 데이터를 주고 받는다.
DAO (Data Access Object)
- DAO는 DB의 데이터에 access하기 위한 객체다.
- Entity 객체는 영속성 컨텍스트(Persistence Context)에 의해 관리되기 때문에 Entity가 직접 DB에 접근하여 데이터를 조회하고 수정하면, 트랜잭션과 영속성 컨텍스트의 일관성이 깨질 위험이 있다. 따라서 이 경우에 DAO를 통해 데이터베이스에 접근한다.
VO(Value Object)
- 값을 표현하기 위한 객체로 불변 객체가 원칙이다.
- 주로 특정 연산에서 일시적인 데이터 저장 용도로 사용한다.