DTO(Data Transfer Object)와 VO(Value Object)는 둘 다 데이터를 담는 객체입니다. 그러나 목적과 사용 방법이 다릅니다.
DTO는 계층 간 데이터 전송을 목적으로 사용합니다. 따라서 DTO는 데이터만을 담고 있고, 로직은 포함하지 않습니다.
3-Tier Layered Architecture로 Layer를 분리하는 경우 다음과 같이 분리할 수 있습니다.
① Presentation Layer(Controller)
② Service Layer(Service)
③ Persistence Layer(Repository)
3-Tier Layered Architecture에서는 각 Layer간 데이터 교환이 이루어지게 됩니다. 한 개의 데이터만 주고받을 때는 DTO가 필요하지 않지만, 대개 여러 개의 데이터를 주고받게 됩니다. 이때 DTO를 사용하게 됩니다.
DTO는 여러 개의 데이터를 묶어서 필요한 곳에 전달하거나 호출을 결과로 받는 방식으로 사용합니다. 대부분 Java Beans 형태로 구성합니다.
DTO 작성 시 따라야 하는 Java Beans 규약은 다음과 같습니다.
① 생성자가 없거나 반드시 파라미터가 없는 생성자 함수를 가지는 형태
② 속성(filed)은 반드시 private로 작성
③ getter/setter 제공
@Getter
@Setter
public class DTO {
private Long id;
private String name;
VO는 도메인 객체의 값을 나타내는 객체입니다. 즉 VO는 데이터베이스의 엔티티를 자바 객체로 표현한 것입니다. VO는 데이터 자체를 의미하므로 getter만 이용하는 경우가 대부분입니다. 따라서 VO는 read-only 속성을 가집니다.
@Getter
@Builder
@ToString
public class TodoVO {
private Long tno;
private String title;
private LocalDate dueDate;
private boolean finished;
}
이 외에도 VO는 불변 객체이므로(@Setter가 없으므로) 값이 변하지 않는다는 성질이 있다.(추가 작성)