[Spring Boot] DTO vs VO vs Entity

2023. 5. 14. 18:30·개발/Spring Boot
728x90
반응형

1. DTO (Data Transfer Object)

DTO란 데이터 전송 객체이다.

말그대로 데이터를 전송하기 위한 객체로 사용된다.

class colorDTO{
    private int red;
    private int blue;
    private int green;

    public colorEntity(int red, int blue, int green) {
        this.red = red;
        this.blue = blue;
        this.green = green;
    }
    
    public int getRed() {
        return red;
    }

    public int getBlue() {
        return blue;
    }

    public int getGreen() {
        return green;
    }

    public void setRed(int red) {
        this.red = red;
    }

    public void setBlue(int blue) {
        this.blue = blue;
    }

    public void setGreen(int green) {
        this.green = green;
    }
}

DTO는 getter와 setter를 가질 수 있다.

내부에 로직은 담지 못한다.

 

DTO의 핵심 역할은 레이어간 데이터를 전송하는 것이다.

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

DTO에서 setter를 제거한다면 데이터가 이동할때 불변성을 보장할수도 있게 된다.

 

2. VO (Value Object)

VO는 값을 표현하기 때문에 불변성을 보장한는 객체이다.

객체를 생성시 객체마다 고유한 메모리주소를 받는다.

이 메모리 주소가 다르다면 서로 다른 객체라고 한다.

하지만 VO는 메모리주소로 비교하는게 아닌 객체가 가지고 있는 값만을 가지고 비교한다.

getter를 가질수 있지만 값의 불변성을 위해 setter를 가지진 못한다.

내부에 로직을 담을 수 있다.

https://www.youtube.com/watch?v=z5fUkck_RZM&t=1s

값만을 비교하기 위해서는 위와 같은 과정을 거친다.

따라서 equals와 hashCode를 오버라이드 해줘야 한다.

class colorVO{
    private int red;
    private int blue;
    private int green;

    public colorEntity(int red, int blue, int green) {
        this.red = red;
        this.blue = blue;
        this.green = green;
    }
    
    public int getRed() {
        return red;
    }

    public int getBlue() {
        return blue;
    }

    public int getGreen() {
        return green;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        colorVO colorVO = (colorVO) o;
        return red == colorVO.red && blue == colorVO.blue && green == colorVO.green;
    }

    @Override
    public int hashCode() {
        return Objects.hash(red, blue, green);
    }
    
    public int sumRedBlue(){
        return red+blue;
    }
}

3. Entity

Entity는 데이터베이스와 1:1로 매핑되어있는 객체이다.

데이터베이스에 값을 넣을때, 가져올때 사용한다.

getter를 가질 수 있다.

내부에 로직을 담을 수 있다.

객체의 일관성을 보장하기 위해 setter 보단 아래 보이는 update나 Builder패턴을 많이 이용한다.

@Entity
public class Color {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   privae Long id;
  
   @Column(nullable = false)
   private int red;
  
   @Column(nullable = false)
   private int blue;
    
   @Column(nullable = false)
   private int blue;
  
   public Color update(int red, int blue, int green) {
      this.red = red;
      this.blue = blue;
      this.green = green;
      return this;
   }
}

 

4. DTO vs VO vs Entity

DTO VO Entity
레이어간 데이터 전송용 객체 값을 나타내는 객체 DB 매핑용 객체
getter/ setter  getter getter
로직 포함 불가 로직 포함 가능 로직 포함 가능

 

참고

https://www.youtube.com/watch?v=z5fUkck_RZM&t=1s 

https://www.youtube.com/watch?v=J_Dr6R0Ov8E&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=67&t=2s 

 

728x90
반응형

'개발 > Spring Boot' 카테고리의 다른 글

[Spring Boot] 어노테이션 정리  (0) 2023.05.17
[Spring Boot] Setter vs Constructor vs Builder  (0) 2023.05.16
[Spring Boot] Controller, Service, Repository  (0) 2023.05.16
[Spring Boot] DI 와 IoC는 무엇일까?  (1) 2023.05.11
[Spring Boot] mysql 연결 삽질기  (0) 2023.04.16
'개발/Spring Boot' 카테고리의 다른 글
  • [Spring Boot] Setter vs Constructor vs Builder
  • [Spring Boot] Controller, Service, Repository
  • [Spring Boot] DI 와 IoC는 무엇일까?
  • [Spring Boot] mysql 연결 삽질기
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    React
    30일챌린지
    하이퍼레저
    컨테이너
    mysql
    CSS
    명령어
    erc20
    도커
    js
    node
    ERC721
    node.js
    go언어
    블록체인
    html
    nodejs
    30일 챌린지
    go
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[Spring Boot] DTO vs VO vs Entity
상단으로

티스토리툴바