DTO와 VO는 둘 다 RDBMS의 record에 대응되지만

DTO는 데이터 전송용 mutable 객체이고 비즈니스 로직을 포함하지 않는다
VO는 값 그 자체로 의미를 지니는 immutable 객체이며 로직을 포함할 수 있다

 

주소, 이름, 돈도 단순히 문자열이 아닌 비즈니스 로직에 대한 책임이 있는 VO가 될 수 있으며

주소는 나라, 시, 도, 구, 상세 주소가 포함된 캡슐화된 로직과 객체

돈은 통화, 수치 로직이 포함된 객체가 될 수 있다.

 

그리고 이러한 VO 자체가 DTO가 될 수도 있다.

다만 DTO는 데이터 전송용 객체로 비즈니스 로직에 대한 책임이 없으므로, DTO가 VO라고 보기는 힘들다

 

DTO(Data Type Object): 계층간 데이터 교환을 위한 객체(Java Beans)

 

여기서 계층은 Controller, View, Business Layer, Persistent Layer 등을 의미

 

DTO는 로직을 가지지 않는 순수한 데이터 객체로 getter, setter 메소드만 가진 클래스를 의미한다.

public class PersonDTO {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

 

** DTO와 데이터 자동화처리

 

자바는 다양한 프레임워크에서 데이터 자동화처리를 위해 리플렉션 기법을 사용한다.

예를 들어, View에 있는 form에서 name 필드 값을 프로퍼티에 맞춰 넘기면, name속성의 이름이랑 매칭되는 프로퍼티에 자동으로 DTO가 인스턴스화 되어(프레임워크 내부에서 setter가 실행됨) PersonDTO를 자료형으로 값을 받을 수 있다.

 

참고로 자바의 프로퍼티(데이터)는 멤버변수 name, age로 결정되는 것이 아니라 getter/setter로 표현된다.

 

 

VO(Value Object): 특정 비즈니스 데이터를 담는 Immutable한 객체 

 

DTO와 비교했을 때 VO는 Immutable한 특성이 있으며 주로 같은 시스템 내에서 사용된다.

 

** DB Entity vs VO

 

DB entity는 식별자를 가지고 있고 식별자로서 동등성을 비교하지만

VO는 객체주소가아닌 값으로 동등성을 구별한다.

 

즉, VO 내부에 선언된 속성(필드)의 모든 값들이 같아야 똑같은 객체라고 할 수 있다.

따라서 Object 클래스의 equals()와 hashCode()를 오버라이딩 하여

서로 다른 이름을 갖는 VO 인스턴스라도 같은 객체라고 할 수 있다.

 

 

[참고 사이트]

https://lemontia.tistory.com/591

https://okky.kr/article/588264

'~2022 > Java' 카테고리의 다른 글

[Java] HashMap, HashTable, ConcurrentHashMap  (0) 2021.10.25
[Java] HashMap, TreeMap, LinkedHashMap  (0) 2021.10.25
[Java] Atomic Class  (0) 2021.10.12

+ Recent posts