Backend/Java

DTO(Data Transfer Object) vs VO(Value Object)

Seyun(Marco) 2020. 11. 16. 21:53
728x90

DTO vs VO

DTO == VO (?)

  • 많은 글들이 DTO와 VO는 같은 것으로 적어놓은 글들이 많습니다.
  • 그러나 명확하게 DTO와 VO는 다른 것입니다. 아래 DTO와 VO에 대해 정리하면서 둘의 차이점을 명확하게 알아보도록 하겠습니다.

DTO(Data Transfer Obejct)

DTO란?

  • 레이어 간 데이터를 전달하는 객체입니다.
  • 예를 들면 시험을 볼때 ORM 카드를 이용해 정답을 입력하여 제출하게 되는데 즉, 시험지와 채점도구 사이의 정답(데이터)를 전달하기 위해 ORM 카드를 사용한다고 생각했을때 ORM 카드를 DTO라고 할 수 있습니다.

특징

  • 데이터 접근 메서드를 가지게 됩니다.
  • 직렬화 등 데이터 표현을 위한 기능을 가질수는 있습니다.
  • 또한 클라이언트에서의 값에 대한 Validation 체크 기능도 가능합니다.(Spring Boot Validation)
  • 데이터 캡슐화를 통해 유연한 대응이 가능합니다.
    • 이에 따라 데이터 요청 수 감소 효과가 있습니다.
    • 예를들어 학생과 학과가 있는데 클라이언트 에서는 두 개 다 필요하다고 생각해봅시다.
    • 실제 DTO가 없다면 학생을 불러오는 API, 학과를 불러오는 API 2번의 API를 호출해야 합니다.
    • 그러나 캡슐화를 이용해 DTO를 만들게 되면 필요한 학생 정보, 학과 정보의 상태만 넣어서 보내주면 되기 때문에 한번의 API로 처리할 수 있다는 장점이 있습니다.

VO(Value Obejct)

VO란?

  • 도메인에서 한 개 또는 그 이상의 속성들을 묶어서 특정 값을 나타내는 객체입니다.
  • 값을 가지는 객체라고 설명합니다.

특징

  • 값 자체로 의미를 가지는 객체입니다.
  • DTO와 가장 큰 차이점은 변하지 않는 값을 가지는 객체라는 의미입니다.
    • 이러한 특징을 통해 불변성을 보장하며 코드의 안정성과 생산성을 높이게 됩니다.
  • 불변성을 통해 값이 같다면 동일한 객체로 바라볼 수도 있습니다.
    • 각 객체를 비교하는 데 사용되는 ID가 필요 없게 됩니다.
    • 같은 객체인지 판단하기 위해 각 속성들의 값을 비교하게 됩니다.
    • 따라서 equals()와 hashcode() 메서드를 재정의를 해줘야 합니다.

공통점과 차이점

공통점

  • 레이어 간 데이터를 전달할 때 사용 가능
  • VO는 불변을 보장하지 때문에 데이터 전달 용도로 사용이 가능합니다.

차이점

  • DTO는 값이 변할 수 있지만, VO는 값이 변하지 않습니다.
  • DTO는 레이어 사이에서 사용이 되지만 VO는 모든 레이어에서 사용이 가능합니다.
  • DTO는 dto1 ≠ dto2 이며, vo는 vo1 == vo2 입니다.
  • DTO는 데이터 접근, validation 로직을 제외하고는 기능을 가지고 있지 않지만 VO는 특정한 비즈니스 로직을 가질수 있습니다.

[10분 테코톡] 👨🏻‍💻👨🏻‍💻지노&비모의 DTO vs VO

728x90
728x90