Java
DTO: Data Transfer Object
정의
계층 간 데이터 교환을 하기 위해 사용하는 객체(Java Beans)
목적
- 계층간 데이터 전송시, Entity를 반환하면
- Entity의 모든 상태(값)가 노출됨
- 보안 문제 발생 가능
- Entity 구현을 캡슐화하여 보호
- 화면마다 사용하는 Entity의 값은 다르므로 필요한 정보만 제공
- 단일 책임 원리에 따라 DTO로 화면과 데이터 분리
- 모델과 뷰의 결합도 감소
- Entity 구현을 캡슐화하여 보호할 수 있다.
- Entity는 도메인의 핵심 로직, 속성을 갖고 있으며, 실제 DB 테이블에 대응되는 클래스이므로 함부로 변경되지 않도록 보호되어야 한다.
- Validation 코드와 Entity 속성 코드를 분리할 수 있다.
- Entity에는 모델링을 위한 어노테이션이 사용되는데, validation 코드가 함께 들어가면 복잡해진다.
특징
로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)
예시
- 유저가 입력한 데이터를 DB에 넣는 과정
- 유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어서 전송합니다.
- 해당 DTO를 받은 서버가 DAO를 이용하여 데이터베이스로 데이터를 집어넣습니다.
- 클라이언트에 데이터 전송시 Entity 대신 DTO를 줌
비교군과의 차이
- DTO
- 레이어간 데이터 전송용
- Entity 객체를 보호하기 위함
- 값 변경 상관 없음
- VO
- 값 자체 표현용
- 값 변경 불가능
- 동등성 비교임
분류 | DTO | VO | Entity |
정의 | 레이어간 데이터 전송용 객체 | 값 표현용 객체 | DB 테이블 매핑용 객체 |
상태 변경 여부 | Y/N | N | Y/N |
로직 포함 여부 | N | Y | Y |