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

면접 질문

  • DTO가 무엇인가요?
  • DTO의 특징에는 무엇이 있을까요?
  • DTO를 사용하는 목적이 무엇인가요?
  • DTO VS VO