CORE
HOME > JAVA > J2SE > CORE
2018.07.30 / 11:44

DTO, VO 차이

summerman
추천 수 39

안녕하세요?
여쭤볼께 있어서요...
일반적으로 데이터를 전송할 때 set, get 메쏘드를 가진 DTO에 데이터를 넣어서
전송하거든요. 아니면 스트럿츠 액션 폼 쓴다던가 하거든요.
그냥 클래스에 set, get 메쏘드 넣어서 만든 클래스 DTO...
이것이 제가 알고 있고 개발할 때 쓰는 DTO 구요...
정의를 찾아보면 데이터를 전송할 때 사용되는 오브젝트(패턴??)이라고 하는데요.
이번에 학교에서 시험 보는데 DTO, POJO, VO 의 설명이에요...
근데 위키데피아를 봐도 DTO 도 VO 라 부른다고 나와 있고,
POJO 도 DTO 로도 사용 가능한 객체라고 나오는데
결론은 다 똑같은거 아닌가요? 물론 POJO는 직렬화 구현하고,
toString, equals, hashCode 메쏘드를 구현해야 되는것 같긴 하던데 말이지요.
이 3가지가 어떤 차이점이 있다면 좀 쉽게 설명 좀 부탁드립니다.
감사합니다.



일단.. DTO, VO는 따로 떼 놓고..
POJO는 Plain Old Java Object 라고 부릅니다. 원래는 Java Language Specification을 제외한 어떤 규칙에도 제약받지 않는 녀석(그러니까, 기본 Java Spec에 있는 것을 제외한 특정 클래스를 상속 받거나, 인터페이스를 구현하거나, Annotation을 지정하는..)을 POJO라 그러는데, 사실 이렇게 만들기는 힘들어서, 심각한 수준의 제약만 아니면 POJO-compliant라고 하긴 합니다. (결국, DTO나 VO같은 특정 부분에 사용되는 것을 지칭하는게 아닙니다.)

DTO랑 VO는.. 사실 좀 역사가 복잡합니다. ;;

Core J2EE Patterns 라는 책에서는... Value Object랑 Transfer Object를 동일한 뜻으로 사용합니다만(http://java.sun.com/blueprints/corej2eepatterns/Patterns/TransferObject.html).. 반대로 Martin Fowler는 저서 Patterns of Enterprise Application Architecture에서 약간 다른 의미로 이야기 합니다. DTO(http://martinfowler.com/eaaCatalog/dataTransferObject.html)는 메소드 호출 횟수를 줄이기 위해 데이터를 담고 있는 녀석으로, VO(http://www.martinfowler.com/eaaCatalog/valueObject.html)는 값이 같으면 동일 오브젝트라고 볼 수 있는 녀석으로 표현을 하고 있죠.

예를 들자면

DTO a = new DTO(1);
DTO b = new DTO(1);

이라고 했을때, a != b 이지만,

VO a = VO(1);
VO b = VO(1);

이라고 했을때 a == b 라고 정의하는 형태라고 보시면 됩니다.

개인적으로는, 구분의 용이성과 용도가 갈리는 경우가 분명히 존재한다는 면에서, 마틴 파울러의 정의에 한표를 던집니다만.. ;;
사실 저거 구분하는것도 일이라.. 보통은 동일한 의미로 사용합니다.