WEB/Spring

[Spring]DTO와 VO의 모호한 사용, 확실하게 사용하기

MoonSta 2023. 1. 30. 17:35

 개발을 하면서 데이터를 담을 객체로 DTO와 VO를 사용하게 됩니다. DTO와 VO에 대한 이론적인 차이는 알고 있었지만, 스스로 조차 혼용해서 사용하고 있었고 확실하게 용도에 맞게 사용하는 것이 맞다고 생각하여 이번 포스팅에서 정리하려고 합니다.

DTO와 VO의 차이

 


 

DTO(Data Transfer Object)란?

DTO는 Layer 간 데이터 전송을 목적으로 하는 객체이다.  오로지 getter, setter 메서드만 가지고 있으며, 애초에 전송 목적을 위한 객체이기 때문에 이외에 메서드는 가질 수 없다. 

 

public class TestDto {
    
    private String name;
   
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
   
}

 


 

DTO(Data Transfer Object)의 불변성

객체 지향에선 데이터의 보존을 위해 가변성을 지양하는 모습을 확인할 수 있다. 따라서 DTO(Data Transfer Object)에서도 setter 메서드를 제외하고 생성자를 통해 변하지 않는 불변 객체로 만들 수 있다. 

 

// 불변 DTO
public class TestDto {
    
    private String name;
   
    public String getName() {
        return name;
    }
    
    public TestDto(final String name) {
        this.name = name;
    }
}

 


 

VO(Value Object)란?

 VO도 DTO와 마찬가지로 데이터를 담을 객체로서 사용된다. 하지만 DTO의 용도와 다르게 그 자체로의 값을 나타낸다. 따라서 불변의 속성을 가지며, 불변성을 위해 생성자를 사용해야 한다. 또한 getter, setter 이외에 메서드를 가질 수 있으며 즉, 비즈니스 로직을 포함 가능하다.

 

public class TestVo {
    privat final String name;
    
    public TestVo(String name) {
        this.name = name;
    }
}

 


 

그렇다면 VO를 DTO로 사용해도 되는 것이 아닌가?

 당연히 getter, setter 외에 비즈니스 로직을 가질 수 있는 VO를 DTO로 사용해도 된다. 그리고 이렇게 혼용되어 사용되고 있는 프로그램들은 이미 많다. 하지만 이름에서부터 알 수 있듯이 두 개의 용도가 다르기에 명확하게 구분해 놓고 사용하는 것이 좋을 것으로 판단된다.