DTO와 VO에 관하여
프리코스 1주차 과정중, MVC를 적용하는 과정에서 DTO와 VO에 대해 알게 되었다.
둘다 얼핏보면 기능이 비슷해 보였고 차이점도 모호해서 매번 헷갈려 하는 자신을 발견하였다.
그래서 이번 기회에 DTO와 VO에 대해 간단하게나마 작성해보려고 한다.
DTO? VO? 그게 뭔데?
DTO는 Data Transfer Object를 줄인말로 말그래도 데이터를 옮기는 객체라는 뜻이다. 말 그대로 Data를 옮기는것에 주 목적을 가진다.
VO는 Value Object를 줄인말로 값을 표현하는 객체라는 뜻을 가진다. 말 그대로 클래스의 상태값을 표현하는 객체라고 볼수 있겠다.
미리 보기 편하게 표로 정리
DTO(Data Tranfer Obejct) | VO(Value Object) | |
기능 | 레이어(Layer)간의 데이터를 전달함. | |
주 목적 | 속성값을 전달. | 속성값을 표현. |
로직 | getter/setter 이외의 로직은 들어가지 않는다. |
getter/setter 이외의 로직이 들어가도 된다. |
객체간 동일 판정 | 속성값이 서로 동일해도 다른 객체로 취급 |
속성값이 동일하면 같은 객체로 취급 (equals(),hasCode() 수정 필요) |
공통점
둘다 공통적으로 Layer간의 데이터를 전달해주는 기능을 가진다. 즉 DTO의 이름과 같은 역할을 가진다고 볼수있다.
Q. 그럼 둘다 막 사용해도 되는거 아니야?
그랬으면 좋겠지만, 안된다고 볼수 있다.
많은 사람들이 같은 목적을 가진 두개를 분류하는 이유가 있을것이고 이름도 다르게 설정한 이유가 있고
실제로 두 객체간에 차이점이 다수 존재한다.
차이점
DTO
DTO는 이름처럼 데이터를 전달하는 것을 주 목적으로 하는 객체라고 볼수 있다.
특징으로서는 getter와 setter를 제외한 어떠한 로직을 가지지 않는다는 점이다.
말 그래도 속성값을 설정하고 그 값을 다른 Layer로 전달해주는것을 주 목적을 가지고 있는 것이다.
여기서 setter는 생성자로 변경할수도 있다. 이럴 경우에는 속성값이 불변하게 된다.
VO
VO는 DTO처럼 데이터를 전달하는 목적을 가지지만, 주 목적은 내부의 속성값 자체를 표현하는 것이다.
DTO와는 다르게 getter,setter외의 로직을 가질수 있다는 점이 있다. 즉 클래스 내부에서 속성값을 통한 여러 연산이 가능하고 이를 반환해줄수 있다는 점이 DTO와의 큰 차이점이라고 볼수 있다.
또한 DTO와 다르게 속성값은 항상 불변이어야 한다. 즉 VO에서는 setter대신 생성자로 속성값을 넣어주어야 한다.
또한 VO는 속성값 자체에 대한 로직이기에 속성값이 동일한 두 객체를 서로 같은객체라고 취급을 하게 된다.
이를 기능상으로 구현하려면 클래스 내에서 equals()와 hasCode() 메서드를 오버라이드해서 새로 설정해줘야 한다.
그래서 어느때 뭘 써야하는데?
둘중에 어느걸 사용해야 할지는 매 상황에 따라 달라진다고 볼수 있다.
만약 데이터를 전달해야 하는 과정에서
1. 속성값만 사용하는 경우(ex.웹상에서 request,response 값 전달) 라면 DTO를 구성해서 사용하면 될것이고,
2. 속성값에 추가적인 로직을 구성해서 값을 반환해야 한다라고 하면 VO를 구성해서 사용하면 된다.
참고자료
1. https://www.youtube.com/watch?v=z5fUkck_RZM ( [10분 테코톡] 인비의 DTO vs VO )