benelog / blog

https://blog.benelog.net 에 배포되는 소스
https://blog.benelog.net
MIT License
5 stars 4 forks source link

VO vs DTO #27

Open benelog opened 5 years ago

benelog commented 5 years ago

'VO'를 'DTO'의 의미로써 쓰는것을 지향하는 배경은 아래와 같습니다.


getter/setter만 있는, 값을 실어나르는 VO라고 칭하는 사람이 있는데 이는 DTO로 칭하는 것이 혼란의 여지가 적습니다. Core J2EE Patterns 라는 책의 초판에서 그 의미로 VO가 정의되어 있었지만, 혼동의 여지가 있어서 2판부터는 TO(Transfer Object)로 바뀌었었습니다. VO는 DDD나 ORM의 맥락에서는 다른 의미로 사용되고 있습니다. 아래 자료들에서 VO와 TO의 정의를 확인할 수 있습니다.

위의 자료들에 따르면 Value Object는 값에 의해 동등성이 판단되는 객체입니다. 날짜, 돈 등의 객체는 VO의 대표적인 예로 자주 제시됩니다.

Getter/Setter만 가진 객체를 VO라고 생각한다면 ORM이나 DDD(Domain Driven Development)의 맥락에서 나오는 VO 용어를 접할 때 혼란이 올 것입니다. Java의 스펙 제안 문서인 JEP 169: Value Objects 에도 VO는 getter/setter만 가진 객체를 의미하지 않습니다.

benelog commented 5 years ago

GoF 중의 한분인 Ralph Johnson 이 2009년도에 한국에 와서 특강을 한적이 있다. 그때 참석을 했었는데, VO라는 패턴에 대해서 어느 분이 질문을 한 것이 기억이 난다. Ralph Johnson는 VO를 마틴파울러와 같은 방식으로 설명을 했다.

https://martinfowler.com/bliki/ValueObject.html

그런데 세미나에 참석하신 어느 분이 한국에서 많이 통용되는 getter/setter를 가진 객체가 VO가 아닌가하는 질문을 하셨었다. Ralph Johnson은 Core J2EE Patterns 초판에서 그 의미로 VO가 정의되어 있었지만, 혼동의 여지가 있어서 2판 부터는 TO(Transfer Object)로 바뀌었다고 설명을 했다. 지금도 그 상태로 유지되어 있는듯하다.

http://www.oracle.com/technetw…/…/transferobject-139757.html

위키페디아를 봐도 VO는 getter/setter만 있는 객체를 의미하지 않는다.

https://en.wikipedia.org/wiki/Value_object

Java9에 제안되 JEP 169를 봐도, Value Objects는 getter/setter만 있는 객체라는 의미로 쓰이지 않았다.

http://openjdk.java.net/jeps/169

암튼 VO라는 용어가 혼란의 여지가 많기에 getter/setter만 있는 객체와 '값객체'로서의 엄밀한 VO를 구분해서 써야 한다고 생각한다. 역할과 맥락에 따라 DTO, Model객체, 엔티티 객체라고도 부를 수 있기는 한데, 한 객체가 여러가지 역할을 할 수 있기도해서, 명확한 경계가 있지는 않기는하다. 그래도 퉁쳐서 VO라고 하면, 다른 맥락의 VO와 혼동의 여지가 더 커진다.

암튼 근래에 교육과정 만드는데 참고하려고 Java 웹개발 관련 인터넷 강의를 몇개 찾아봤다. 공통적으로 Core J2EE Patterns 초판의 의미로 VO를 쓰고 있다. 우리 나라에서 나온 Java웹개발 관련 책들의 목차를 보아도 그런 경우가 많은듯하다.

인터넷 자료를 보면, 유독 우리나라에서만 그런 경향이 강하지 않나 하는 의구심이 든다. 아마 대형 SI업체에서 J2EE 초창기에 보급한 용어가 아닐까 하는 추측이 든다.

남에게 영향을 주는 책을 쓰거나 동영상을 찍는다면, 용어를 어떻게 쓸지를 더 많이 고민해야 할 것이다. VO라는 용어를 쓰더라도 '한국 SI에서는 VO가 DTO/Entity 등의 다양한 맥락을 아우르는 의미로 많이 쓰이기에, 이 강의에서는 VO라고 칭하겠다. 하지만 나중에 DDD나 ORM, java9의 명세를 볼때는 그 의미가 아닐수도 있다는 점을 의식하고 Google에서 Value object를 한번 검색해보기 바란다.. '정도의 설명을 덧붙이는것은 필요했다고 생각한다.

강사나 저자가 VO에 대해서 검색 조차도 해보지 않았다면, 용어 선택에 대해서는 충분한 고민을 하지 않은 강의일 가능성이 높다.