엔티티, DTO 및 VO

엔티티, DTO 및 VO의 차이점은 무엇입니까?

VO(Value Object)는 부서에서 개발 언어를 처음 배울 때부터 막연하게 사용되어 왔다.


지금까지는 그것만 사용했습니다.

개체를 회사에서 vo라고도 부르며 DTO와 Entity를 사용하지 않았기 때문입니다.

그러나 최근에 Spring Boot에 대해 알게 되었을 때, 그들은 내가 항상 직면했던 것들이었습니다.


그동안 이 녀석들을 제대로 공부하지 못한 이유는 무엇일까요?

1. 실체

법인데이터베이스의 특정 테이블과 1:1로 매칭되는 클래스입니다.

법인~이다 테이블에 존재하는 열만 재산으로 가지고 있어야 합니다.

상속하거나 구현할 수 없습니다.


또한 컨트롤러의 요청/응답에 사용해서는 안됩니다.


– 3단 스프링 지속성 계층에 사용

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

2. DTO(데이터 전송 객체)

DTO레이어 간의 데이터 교환에 사용되는 개체입니다.


값을 유연하게 변경(가변성,

DTO데이터베이스에서 받은 엔터티를 변환하여 비즈니스 계층과 프레젠테이션 계층으로 전달할 때 사용합니다.


즉, 컨트롤러 또는 서비스 단계에서 사용됩니다.

DTO비즈니스 논리를 가질 수 없습니다.

getter/setter만 가질 수 있습니다.


(또는 정렬/직렬화와 같은 데이터 표현 논리)
@Getter
@Setter
public class MoneyDTO {
  int id;
  int price;
}

2-1 왜 DTO를 사용합니까?

비즈니스에서 가장 일반적인 요구 사항은 변경입니다.

프레젠테이션 슬라이드오전.
그러나 이 요구 사항을 충족하기 위해 테이블(엔티티) 구조를 변경하는 것은 비용이 많이 듭니다.


이와 관련된 다른 모든 클래스 및 로직에서 수정해야 하는 막대한 오버헤드가 있습니다.

또한 독립적이며 다른 클래스로부터 자유롭습니다.

바꾸어 말할 수 있는 DTO가 생성되어 사용되었습니다.


3. VO(가치의 대상)

음성문자 그대로 가치 객체의미

VO는 문자 그대로 개체 자체를 의미합니다.

10,000원짜리 지폐가 있다고 가정해 봅시다.

우리는 모두 만 원이 있다고 말합니다.

특정 개체에 의미를 부여하지 않습니다.


10,000원의 화폐 가치에 초점이 맞춰져 있습니다.

(물론 0000년의 통화는 그런 프리미엄을 가질 수 있지만 무시하자.)

음성게터/세터와 추가 속성을 가질 수 있으며 상속에 사용할 수 있습니다.

@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를 잘 리팩토링해서 사용하도록 하겠습니다.