Contents

DTO vs VO

DTO

Data Transfer Object의 약자로 계층(Layer) 간 데이터를 전달하는 객체이다.
조금 더 쉽게 말하면, 데이터를 담아서 전달하는 바구니라고 할 수 있다.

Controller는 View와 도메인 Model의 데이터를 주고 받을 때 별도의 DTO 를 주로 사용한다. 도메인 객체를 View에 직접 전달할 수 있지만, 민감한 도메인 비즈니스 기능이 노출될 수 있으며 Model과 View 사이에 의존성이 생기기 때문이다.

DTO는 데이터 접근 메서드(Getter, Setter), 생성자 외에 기능을 갖지 않는다. (정렬, 직렬화 등 데이터 표현을 위한 기능은 가질 수 있다.)
데이터의 캡슐화를 통해 유연한 대응이 가능하여 데이터 요청 수의 감소 효과가 있다.

VO

Value Object의 약자로 값을 자체로 의미를 갖는 객체이다.
변하지 않는 값을 갖는 객체로 값이 변하지 않음을 보장 하여 코드의 안정성을 높인다.
서로 다른 이름을 가진 VO의 인스턴스가 모든 속성이 같다면 동일한 객체라고 판단한다.
이를 위해 VO 클래스는 equals와 hasCode를 오버라이딩 해야 한다.
DTO와 달리 데이터 접근 메서드 이외의 로직을 포함할 수 있다.

공통점과 차이점

공통점

레이어 간 데이터를 전달할 때 사용 가능하다.

차이점

구분 DTO VO
용도 레이어 간 데이터 전달 값 자체 표현
동등 결정 속성값이 모두 같다고 해서 같은 객체 X 속성값이 모두 같으면 같은 객체
가변/불변 setter존재 시, 가변
setter 비 존재 시 불변
불변
로직 데이터 접근(getter, setter) 이외의 기능을 갖지 않음 데이터 접근 이외의 특정한 비즈니스 로직을 가질 수 있음

참고

https://backtony.github.io/interview/2021-11-13-interview-3/