728x90

스프링을 공부하면서 VO가 있다는 것은 알았지만, DTO만 사용했기 때문에 DTO와 VO의 차이가 무엇인지에 대해 궁금했다.

생각이 난 김에 DTO와 VO의 차이에 대해 간단히 알아보려고 한다.

DTO와 VO를 혼용해서 쓰는 경우가 많다.

→ 왜? core J2EE Patterns이라는 책에서 데이터 전달용 객체를 VO로 정의하다가 TO (현재는 데이터를 의미하는 D를 붙여 DTO로 사용)로 바꾸었기 때문

DTO (Data Transfer Object)

데이터 전달용

계층 간 데이터 교환을 위해 사용하는 객체. DTO에 데이터를 담아 전달한다.

데이터를 담은 private변수들과 이 변수들을 조작할 수 있는 getter&setter 메서드로 구성되어 있다.
-> 다른 로직들은 담고 있지 않다! 왜? 순수하게 데이터 전달만 하기 때문에

따라서 한마디로 말해서 데이터를 담을 수 있는 바구니 라고 생각하면 편할 것 같다.

 

VO (Value Object)

값 표현용

말 그대로 값을 가진 객체
데이터를 가지고 있다는 것에서 보면 DTO와 유사하지만, VO의 큰 특징은 값이 같으면 같은 객체라고 보는 것이다. (주소가 아닌 값 자체를 비교함)

Company com1=new Company("SSAFY");
Company com2=new Company("SSAFY");

com1.hashCode();
com2.hashCode(); // com1과 com2의 해시값이 동일하다 -> com1과 com2은 같은 객체이다 

또한, VO는 값 자체를 표현하게 때문에 불변해야 한다. 따라서 read-only한 속성을 가지고 있다. 한번 값을 설정하면 중간에 값을 변경할 수 없다.
VO는 getter 메서드와 함께 비지니스 로직도 포함할 수 있지만, setter 메서드는 가지지 않는다.

결론 

분류 DTO VO
역할 계층 간 데이터 교환을 위한 객체 값을 표현하기 위한 객체
상태 변경 여부 변경 가능 read-only
로직 포함 여부 getter/setter외의 다른 로직 없음 로직 포함 가능

+) 참고

 

728x90
복사했습니다!