MVC구조에 대한 예습 마무리로 DTO와 VO에 대한 글을 써 보려고 한다. DTO와 VO를 지금까지 같은 개념으로 생각하고 있었다. 하지만 알아보니, 둘은 확실히 다른 개념이다. 이렇게 많은 사람들이 혼동하는 이유는 Core J2EE Patterns: Best Practices and Design Strategies 책에서 정의를 1판과 2판에서 다르게 했기 때문이라고 한다. 그게 아니더라도 기능이 비슷해서 혼동하는 경우도 많은것 같다. 과연 둘의 차이가 무엇인지 확실히 알아보도록 하자.
데이터 전달용
DTO는 데이터를 전달하기 위해서 사용한다. 예를 들어, Web Layer에 해당하는 Controller와 Service Layer에 있는 Service사이에 데이터를 전달할 때, View와 Controller사이에 데이터를 전달할 때 사용한다. getter/setter 메서드만을 가진 순수하게 데이터를 전달하기 위한 객체이다. 그렇기 때문에 다른 비즈니스 로직은 포함하지 않는다.
setter를 이용하면 DTO를 가변객체로 활용할 수 있다. setter를 통해 값을 변경하는 것이 가능하기 때문이다. 하지만 setter가 아닌 생성자를 통해서 값을 초기화한다면 불변객체로 활용이 가능하다. setter를 이용하면 데이터가 중간에 변조 될 수 있는 가능성이 존재한다. 그러니 데이터가 변조되지 않게 하기 위해서는 불변객체로 활용하는것이 좋다.
요청이나 응답값을 전달할때는 Entity Class가 아닌 DTO Class를 이용해서 받아야 한다.
Entity
실제 DB테이블과 매핑되는 클래스이다. Entity를 통해 테이블이 생성되고 스키마가 변경되기때문에 Entity를 요청이나, 응답값을 저달하는 클래스로 사용해서는 안된다.
데이터 표현용
VO객체들은 주소가 달라도 값이 같으면 동일한 것을 여긴다. VO는 또 불변객체여야 한다. 만약 값을 변경할 수 있다면 AliasingBug가 일어날 수도 있다. 때문에 setter를 통해 값을 초기화하는 것이 아닌, 생성자를 통해서만 값을 초기화하도록 구현해야한다. setter/getter외에 다른 로직을 포함 할 수 있다.
https://youtu.be/z5fUkck_RZM
https://tecoble.techcourse.co.kr/post/2021-05-16-dto-vs-vo-vs-entity/
https://martinfowler.com/bliki/AliasingBug.html
http://wiki.c2.com/?ValueObject