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