🍃 𝗦𝗽𝗿𝗶𝗻𝗴 𝗕𝗼𝗼𝘁

[Spring] DTO, VO, Model 의 차이

비타민찌 2022. 9. 6. 02:02
728x90

공통점으로는 Spring MVC에서 데이터 관리 및 비즈니스 로직을 처리하는 Model 부분. (DAO, DTO, Service..)

 

1. DTO(Data Transfer Object)

데이터 전송 객체. 순수하게 데이터를 담아 계층 간으로 전달하는 객체다.

로직을 갖고 있지 않은 순수한 데이터 객체이며, 

데이터 '전달' 용도로만 사용하기 때문에 메서드로 getter/setter 만 갖는다.

 

public class UserDTO {
    
    private String name;
    private String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
   
}

 

이를 통해 보내는 쪽에서는 setter를 이용하여 값을 담아 전달하고, 받는 쪽에서는 getter를 이용하여 값을 꺼내 쓰게 된다.

이때 setter의 경우 변조 가능성이 있기 때문에

아래와 같이 생성자로 값을 넣어주도록 하게 하면 전달하는 과정에서 변조가 불가능하다.

public class UserDTO {

    private String name;
    private String id;

    public UserDTO(String name, String id) {
        this.name = name;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public String getId() {
        return id;
    }

}

 

 

2. VO(Value Object)

VO는 값 그 자체를 나태는 객체이다.

DTO와 다르게 로직을 포함할 수 있으며, VO의 경우 특정 값 자체를 표현하기 때문에

불변성 보장을 위해 생성자를 사용해야 한다.

 

서로 다른 이름을 갖는 VO 인스턴스라도 모든 속성 값이 같다면 두 인스턴스는 같은 객체인 것이 핵심이다.

예를 들어 모두 똑같은 자동차가 색깔만 다르다고 하더라도 이를 별개의 객체로 보는 것이 아니라 하나의 객체(자동차)로 보는것과 같다.

//생성자를 이용한 불변 객체
public class CarVO {

    private final String color;

    public CarVO(String color) {
        this.color = color;
    }
    
}

그렇기 때문에 두 객체의 주솟값이 다르다.

이 때문에 값 만 비교하기 위해서 equals()와 hashCode()를 오버 라이딩(재정의) 해주어야 한다. 

 

즉 VO는 값 그 자체를 나타내기 때문에 setter 같은 성격의 변조 가능성이 있는 메서드가 존재하면 안되며,

두 객체의 '필드 값이 같다면' 모두 같은 각체로 만드는 것이 핵심이다.

 

728x90