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는 특정한 비즈니스 로직을 가질수 있습니다.
728x90
728x90