DTO 와 VO는 무엇인가?

김국민·2025년 3월 27일

DTO란??

Data Transfer Object의 약자로 데이터를 전달하기 위해 사용하는 객체이다
계층간 데이터를 전달하기 위한 객체로 데이터를 담는 바구니 정도로 생각하면 되겠다

레이어드 아키텍처에서 계층간 데이터 전달시 DTO를 사용하여 전달한다


DTO Example

class ExampleStudentDto{
    
    private String name;
    private int age;
    private String major;
    
    public ExampleStudentDto(String name, int age, String major){
        this.name=name;
        this.age = age;
        this.major = major;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getMajor() {
        return major;
    }

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

    public void setAge(int age) {
        this.age = age;
    }

    public void setMajor(String major) {
        this.major = major;
    }
}

DTO는 오직 getter/setter 메서드만을 가지며 다른 로직을 가질 수 없다.
setter 메서드를 삭제하고 생성자로 초기화를 하면 불변객체가 되어 계층간 데이터 전송시 데이터가 변하지 않음을 보장하여 안전하다.


왜 DTO를 사용하여 전달할까?
왜 데이터를 전송하는 객체를 따로 만들어야할까..??

또 다른 데이터를 담는 객체를 생각하면 엔티티가 있을 수 있다.
엔티티는 데이터베이스 테이블과 맵핑되는 클래스이다.
엔티티를 기준으로 테이블이 생성된다.

뷰레이어는 요구사항이 자주 변경되는 부분인데 만약 계층간 데이터 이동을 엔티티로한다면 뷰에 맞춰서 엔티티 클래스를 계속 변경해야 하고 데이터베이스의 구조를 변경해야 할 수도 있다.

DTO를 사용하여 데이터 전송을 하게 된다면 데이터 변환, 캡슐화, 성능 최적화, 불변성 보장 등의 이유로 안전하고 효율적인 데이터 전송이 가능해진다


VO란?

vo 는 Value Object의 약자로 값 그 자체를 표현하는 객체이다
조금 더 이해하기 쉽게 말하자면 특정 값이나 개념을 표현할 때 primitive type을 대신해서 사용하는 객체이다

예를 들어

int money = 10000;

돈을 표현할 때 정수형 타입으로 표현할 수 있겠다

이것을 VO로 표현한다면

VO는 money를 객체로 만들어 값 자체로 표현한다

class Money{
    private final int value;

    Money(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
    //이외 다른 로직도 가능
    
}


Money money = new Money(10000);

VO는 값 자체를 표현해야 하기 때문에 불변객체여야한다
그래서 setter메서드는 없고 생성자를 통해 값을 초기화 하여한다
또 VO는 getter 이외에 다른 로직을 포함 할 수 있다

또 VO는 값으로 비교를 해야하기 때문에 equals메서드와 hashcode메서드를 오버라이드 해 값으로 비교할 수 있게 해야한다

    @Override
    public boolean equals(Object obj) {
        if(this == obj) return true;
        if(!(obj instanceof Money)) return false;
        Money money = (Money) obj;

        return money.value == this.value;
    }

    @Override
    public int hashCode() {
        return Objects.hash(value);
    }

비교해보기

profile
개발지망생

0개의 댓글