Skip to content

데이터 Model 세분화

Heesung Youn edited this page Feb 9, 2022 · 2 revisions

Entity, VO, DTO

Entity

Entity 클래스는 실제 DataBase의 테이블과 1 : 1로 매핑 되는 클래스이다

DB의 테이블내에 존재하는 컬럼만을 속성(필드)으로 가져야 한다.

Entity 클래스는 상속을 받거나 구현체여서는 안되며, 테이블내에 존재하지 않는 컬럼을 가져서도 안된다.

🚦 주의 사항

  • Domain Model 객체는 Persistent만을 위해서 사용해야 한다.
  • 일관성을 위해서 Entity는 값을 수정하지 않는다. (Immutable)

DTO

DTO(Data Transfer Object)는 데이터 전송(이동) 객체라는 의미를 가지고 있다

즉, DB의 데이터가 Presentation Logic Tier로 넘어올때는 DTO로 변환되어 오고가는 것이다.

로직을 갖고 있지 않는 순수한 데이터 객체이며, getter/setter 메서드만을 갖는다.

Controller Layer에서 Response DTO 형태로 Client에 전달한다.

🚦 주의 사항

  • DTO는 Logic을 가지지 않는 순수한 데이터 객체이다.

VO

VO(Value Object)는 말 그대로 값 객체라는 의미를 가지고 있다.

VO 내부에 선언된 속성(필드)의 모든 값들이 VO 객체마다 값이 같아야, 똑같은 객체라고 판별한다.

🚦 주의 사항

  • 수정이 불가능한 Immutable 객체이다.

  • 객체의 모든 값이 같다면 동일한 객체다.

  • DTO와 VO 차이점

    VO는 DTO와 동일한 개념이지만 read only 속성을 갖는다.VO는 특정한 비즈니스 값을 담는 객체이고, DTOLayer간의 통신 용도로 오고가는 객체를 말한다.

  • 참고 링크

    https://velog.io/@gillog/Entity-DTO-VO-바로-알기 https://parkadd.tistory.com/53

A. 세분화를 하는 이유

  1. Entity와 DTO를 분리해서 관리해야 하는 이유는 DB Layer와 Application Layer 사이의 역할을 분리 하기 위해서다.
  2. 만약 모든 Layer에서 동일한 model을 사용한다면 Response의 양식이 변경될 때 마다 Model이 변경된다. 하지만 이 Model는 가장 하단 Layer인 Persistence Layer에서 의존하기 때문에 결국 Model의 변경은 모든 Layer에 영향을 주게 된다. Client에 요청이 들어올 때마다 model을 수정하는 것은 시스템에 큰 영향을 끼치기 때문에 이로부터 방어할 필요가 잆다. 그 방법이 Client와 소통하는 model과 DB에서 사용하는 Model을 분리하는 것이다. 이때 Client와 소통하는 객체를 DTO로 정의하고, DB에서 사용하는 객체를 Model으로 정의한다. 이로서 Client에서 변경이 요청이 들어오는 경우 DTO에서만 변경이 일어나며, Persistance Layer는 안정성을 얻을 수 있다.

B. Afume에서 정의

image

Model

Sequelize에서 이미 약속된 폴더명을 사용해야 하기 때문에 Model은 DB Entity를 가리키는 것으로 정의한다. models 폴더 : Sequelize DB Entity에 대한 정의 models_moongos: Mongoose DB Entity에 대한 정의

🚦 Model

  • Model는 Persistence Layer에서만 사용한다.

DTO

Layer간에 통신을 위하여 사용하는 데이터 객체이다.

🚦 DTO 규칙

  • DTO Class는 Method를 가지지 않는다.
  • /dto 폴더 아래 위치한다.
  • DTO를 Suffix로 사용한다.

VO

Value Object이며 Service Layer에서 Logic을 수행하기 위한 객체이다.

🚦 VO 규칙

  • VO는 Ready Only 객체이다. 즉 Immutable하다.
  • 객체의 모든 값이 같다면 동일한 객체이다.

Request/Response

Layer간의 Transfer를 담당하는 것이 아닌, Client와 Server의 Transfer를 당당한다. Request는 Client → Server 방향에서 사용되는 DTO이다. Response는 Server → Client 방향에서 사용되는 DTO이다.

이는 Swagger의 Definition과 동일해야 한다.

이를 /request, /response 폴더 아래에 Class로 정의한다.

🚦 Request, Response 규칙

  • Suffix를 각각 Request, Response를 붙여준다.
  • data field 만 가지며 method를 가지지 않는다.
  • Presenter Layer에만 의존한다.