티스토리 뷰

DTO : 데이터 전달용 객체  /  VO : 값 표현용 객체
  DTO VO
용도 레이어 간 데이터 전달 값 그 자체 표현
동등 결정 속성값이 모두 같아도 동일한 객체 X 속성값이 모두 같으면 동일 객체
가변 / 불변 setter 존재 시 가변 / 없으면 불변 불변
로직 getter/setter 외 로직 가질 수 없음 getter/setter 외 로직 가질 수 없음

● DTO(Data Transfer Object)

- 데이터를 전달하기 위해 사용하는 객체(데이터 전달 바구니)

- 정확히 말해 계층 간 데이터를 전달하기 위해 사용하는 객체이다.

Web Layer와 Service Layer 사이에서 데이터를 주고 받기 위해 DTO에 데이터를 담아 전달한다.

[DTO의 특성]
- method는 오직 getter/setter 만 갖는다.
- 다른 (비즈니스)로직은 갖지 않는다. 이는 DTO가 순수하게 데이터 전달만을 위한 객체이기 때문이다.
public class CrewDto {
    private String name;
    private String nickname;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }

    public String getNickname() {
        return nickname;
    }
    
    public void setNickname(String nickname) {
        this.nickname = nickname;
    }
}

- 위와 같이 DTO가 setter method를 가지면 데이터가 변경(오염)될 가능성이 있으므로 아래와 같이 생성자를 이용해 각 필드(멤버변수)의 값들을 초기화해 불변객체로 만들 수 있다.

public class CrewDto {
    private String name;
    private String nickname;
    
    public CrewDto(String name, String nickname) {
        this.name = name;
        this.nickname = nickname;
    }
    
    public String getName() {
        return name;
    }

    public String getNickname() {
        return nickname;
    }
}

VO(Value Object)

- 값 그 자체를 표현하는 객체이다.

- 쉽게말해 5만원 지폐는 각 지폐의 고유번호가 달라도 똑같은 가치(값)를 갖는데 VO도 이와 동일한 개념의 객체이다.

- 즉, 객체의 주소값이 달라도 그 안의 값이 같으면 동일한 객체라고 보는 것이다.(값으로만 비교되는 객체)

public class Money {
    private final int value;
    
    public Money(int value) {
    	this.value = value;
    }
    
    public int getHalfValue() {
    	return value / 2;
    }
}

- VO class인 Money class는 값 그 자체를 표현하기 때문에 setter method가 없다. = 불변객체

- 생성자를 통해서만 값을 초기화해줘야한다.

- DTO가 getter/setter 외의 다른 method를 가질 수 없는 것과 달리 VO는 getHalfValue method와 같이 특정한 로직을 가질 수 있다.


- 일반적인 객체는 equals, hashCode method로 비교할 때 모두 불일치(서로 다르다)로 나오지만 VO는 그러면 안 된다.

- VO는 객체의 주소값과 상관 없이 값이 같으면 동일한 객체로 판단돼야 한다.(객체를 속성값으로만 비교)

- 따라서 VO는 equals, hashCode method를 모두 오버라이딩 해 값 자체만 비교할 수 있도록 수정해야 한다.


cf) 아래 영상을 보고 정리했다.

https://youtube.com/watch?v=z5fUkck_RZM&feature=sharea

 

cf2) 아래 글에 Entity에 대한 글도 볼 수 있다.

https://tecoble.techcourse.co.kr/post/2021-05-16-dto-vs-vo-vs-entity/

 

DTO vs VO vs Entity

DTO와 VO는 분명히 다른 개념이다. 그런데, 같은 개념으로 생각해서 사용하는 경우가 많다. 왜일까? ⌜Core J2EE Patterns: Best Practices and Design Strategies⌟ 책의 초판에서는 데이터 전송용 객체를 로 정의

tecoble.techcourse.co.kr

'Backend > Spring' 카테고리의 다른 글

#9 유저 생성 API  (0) 2023.08.11
#8 GET API의 DTO와 POST API의 DTO가 차이가 나는 이유  (0) 2023.08.09
#6 POST API  (0) 2023.07.31
#5 GET API with DTO  (0) 2023.07.30
#4 HTTP, API, URL  (0) 2023.07.29
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함