JAVA/Java

DTO와 VO 그리고 Entity

dodop 2021. 12. 13. 17:31

 

 

출처 구글

계층간 데이터를 주고 받을 때, 소통하는 계층에 따라서 값을 전달하는 객체의 형태는 달라진다. 

 

 

DTO

출처 구글

Data Transfer Object로서 계층간 데이터 교환을 위하여 사용하는 객체 이다. DB의 데이터를 Service나 Controller (즉, Presentation Layer)와 주고 받을 때 사용된다. Client와 바로 접해있는 View 계층에서는 정보가 자주 변경되기 때문에 변경이 이루어 질때마다 바로 DB와 연결된 Entity를 변경하고자 한다면 이와 의존관계에 놓인 많은 다른 클래스에도 영향을 미치기 때문에 영향받지 않고 자유롭게 변경 가능한 DTO를 사용하게 된다. 이는 로직을 가지고 있지 않은 순수한 데이터 객체 이며 getter / setter 메서드 만 을 가진다. Controller Layer에서는 ResponseDTO의 형태로 Client에게 전달한다. 

 

@Getter
@Setter
public class ActivityCreateDTO {

    private String name;

    private Integer score;

    private String description;

    private String imageUrl;

    public ActivityCreateDTO(String name, Integer score, String description) {
        this.name = name;
        this.score = score;
        this.description = description;
    }
}

DTO에서도 setter를 사용하지 않고 대신 생성자를 사용하면 객체의 불변성을 유지할 수 있다. 

 

 

 

 

VO

Value Object는 불변의 특정 값객체 로 VO의 핵심 역할은 필수적으로 equals()와 hashcode()를 오버라이딩 하는 것이다. equals()와 hashcode()를 오버라이딩 함으로서 VO끼리는 서로 다른 인스턴스라도 같은 값을 가지고 있다면 같은 인스턴스로 취급하게 된다. VO 내부에 선언된 모든 속성값들이 VO객체마다 같은 값을 가져야 똑같은 객체로 판별할 수 있다. VO는 getter / setter 이외에 다른 로직을 지닐 수 있다. 

 

public class Card {
    private final String shape;
    private final int number;

    public Card(String shape, int number) {
        this.shape = shape;
        this.number = number;
    }

    public String getShape() {
        return shape;
    }

    public int getNumber() {
        return number;
    }

    @Override
    public boolean equals(Object c) {
        if (this == c) return true;
        if (c == null || getClass() != c.getClass()) return false;
        Card Card = (Card) c;
        return number == card.number && Objects.equals(shape, card.shape);
    }

    @Override
    public int hashCode() {
        return Objects.hash(shape, number);
    }

 

 

 

Entity

Entity는 실제 데이터베이스와 연관되는 핵심 으로 이를 기준으로 테이블이 생성되고 스키마가 변경된다. Entity는 id를 통해서 구분되며 비지니스 로직을 지닐 수 있다. setter를 통해 가변객체로 활용될 수도 있다

@Getter
@Setter
public class Activity {

    private Integer id;

    private String name;

    private Integer score;

    private String description;

    private String imageUrl;
    
    public Activity() {
    
    }
    
    public Activity(Integer id, String name, Integer score, String description) {
        this.id = id;
        this.name = name;
        this.score = score;
        this.description = description;
    }
}

 

 

 

 

세 객체 비교
  DTO VO Entity
정의 Layer간 데이터 전송 객체 값 표현 객체 DB 테이블 연관 객체
상태 변경 가능 여부 가변 또는 불변 객체 불변 객체 가변 또는 불변 객체
getter/setter 외의
로직 포함 가능 여부
X O O

 

 

 

 

(참고한 사이트)

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

https://hyeon9mak.github.io/DTO-vs-VO/

 

DTO vs VO

3대450(이었던) 킹갓인비의 2월 25일 DTO vs VO 테코톡을 정리해보자!

hyeon9mak.github.io

https://www.techie-knowledge.co.in/2018/06/layered-application-development-in-j2ee.html

 

Layered Application Development in J2EE

A blog about computer science , developer and engineer and for reasercher

www.techie-knowledge.co.in

https://velog.io/@gillog/Entity-DTO-VO-%EB%B0%94%EB%A1%9C-%EC%95%8C%EA%B8%B0

 

Entity, DTO, VO 바로 알기

본 게시글은 작성자 본인의 학습을 위함이라 부족한 점이 많습니다.선생님들의 따뜻한 조언과 피드백 부탁드립니다! 감사합니다! 🙇‍♂️스프링 부트 프로젝트를 진행하면서 JPA를 사용하게

velog.io

https://youngjinmo.github.io/2021/04/dto-vo-entity/

 

DTO와 VO 그리고 Entity의 차이

본 포스팅은 우아한Tech에 올라온 라흐님의 발표영상 DTO vs VO 영상을 보고 정리한 포스팅이다. 넥스트 스텝에서 클린코드 과정을 이수하면서 DTO와 VO의 차이를 제대로 이해못하고 미션을 수행하

youngjinmo.github.io