본문 바로가기
개발/Java || Spring

Entity, DTO 그리고 VO

by leedonggeun 2023. 3. 15.

Entity와 DTO, 그리고 VO는 뭐가 다른 걸까?

학과에서 처음 개발 언어를 학습할 때부터 막연히 사용해 오던 VO(Value Object).
여태까지는 그냥저냥 사용해 왔었다. 회사에서도 객체는 vo로 퉁치고, DTO, Entity는 딱히 사용하는 걸 못 봤기 때문이다.

하지만, 최근 Spring Boot에 대해 학습을 하다 보니 항상 마주하던 녀석들이었다.
그동안 나는 왜 이 녀석들을 제대로 학습하지 않았을까?

1. Entity

Entity란, 데이터베이스의 특정 테이블과 1:1로 일치하는 클래스이다.

Entity테이블에 존재하는 컬럼만을 속성으로 가져야 한다. 상속을 받거나, 구현체가 돼서는 안 된다.
또한, 절대 컨트롤러의 Request/Response에서 사용해선 안된다.
- Spring 3-tier의 Persistence Layer에서 사용된다.

@Builder
public class Money {
  int id;
  int price;
}

 

2. DTO (Data Transfer Object)

DTO란, 계층 간 데이터를 주고받을 때 사용되는 객체이다.
값을 유연하게 변경(가변성, 할 수 있으며, 

DTO는 데이터베이스에서 받아온 Entity를 변환하여 Business Layer 및 Presentation Layer로 전달할 때 사용된다.
즉, 컨트롤러 혹은 서비스단에서 활용된다.

💡DTO는 비즈니스 로직을 가질 수 없으며, Getter / Setter 만을 가질 수 있다.
     (혹은 정렬/직렬화 등 데이터 표현을 위한 로직만)
@Getter
@Setter
public class MoneyDTO {
  int id;
  int price;
}

2-1. 왜 DTO를 사용해야 하는가?

비즈니스를 하다 보면 요구사항에서 가장 자주 변경되는 것은 Presentation Layer이다.
하지만 이 요구사항에 맞춰 테이블 구조(Entity)를 변경하는 것은 굉장히 많은 비용이 소모된다.
이를 참조하는 다른 클래스 및 다른 로직에서도 모두 수정을 해주어야 하는 엄청난 오버헤드가 발생할 것이다.

이를 위해 다른 클래스로부터 독립적이고 자유로운 변환이 가능한 DTO를 생성하여 활용하게 된 것이다.

 

3. VO (Value Object)

VO는 말 그대로 값 객체라는 의미

VO는 그야말로 객체 그 자체를 의미한다.

예를 들어, 만원권이 있다고 치자. 우리는 모두가 만원이 있다고 말을 한다. 특정한 객체에게 의미부여 하지 않는다.
만원 이라는 화폐 가치에 중점을 두는 것이다. (물론 0000년도 화폐 이런식으로 프리미엄이 붙는 일도 있지만 무시하자.)

💡 VO는 Getter / Setter 뿐 아니라, 추가적인 속성을 함께 가질 수 있으며 상속 등에 사용이 가능하다.
@Setter
@Getter
public class MoneyVO {
  int id;
  int price;
  
  // id는 신경쓰지 않는다. 오직 값 자체에 대해서만 일치하는지를 본다.
  @Override
  public boolean equals(Object object) {
    if (this == object) return true;
    
    MoneyVO money = (MoneyVO) object;
    return this.price == money.price;
  }
  
  @Override
  public int hashCode() {
    return Objects.hash(value);
  }
}

 

4. 마치며...

그동안 어렴풋이 기억하던 개념에 대해 정리해놓으니 보기가 좋고 생각보다 더 정리가 잘 된 것 같다.
회사에선 아직 VO만 쓰지만... 리팩토링해나가며 Entity, DTO, VO를 잘 나누어 쓸 수 있도록 노력해봐야겠다.

댓글