우아한테크코스 6기

DTO와 VO에 관하여

스키(ski) 2023. 10. 25. 22:32

프리코스 1주차 과정중, MVC를 적용하는 과정에서 DTO와 VO에 대해 알게 되었다.

둘다 얼핏보면 기능이 비슷해 보였고 차이점도 모호해서 매번 헷갈려 하는 자신을 발견하였다.

 

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 )