Leon Chaewon Kong's dev blog

[TIL] DAO, DTO, Entity, VO 정리해보기

DAO, DTO, Entity, VO 정리해보기

DAO, DTO, Entity, VO는 Spring에서 일반적으로 사용되지만, Nest.js에서도 일부 사용되는 개념이다. 이들 개념을 정리해본다.

Nest.js는 Spring MVC와 유사한 면이 많다.

사용하는 용어들도 어느 정도 그러한 것 같다.

실제로 Nest.js를 사용하려다 보니, 데이터의 스키마나 인터페이스를 어떤 형태로 관리해야 할지 궁금함이 생겼다.

즉, Spring에서 사용되는 DAO, DTO, Entity, VO와 같은 개념이 궁금해졌다.

DAO

Data Access Object를 줄인 말이다. DB의 데이터에 접근하고 이를 다루는 객체다. SQL을 사용하여 DB에 접근한 뒤, CRUD API를 제공한다.

Entity

Entity는 영속화될 수 있고 식별가능한 (예를들어 ID혹은 유니크한 복합키가 존재하는) 객체를 의미합니다.

Entity는 영속화될 수 있고 식별가능한 객체로 DB의 테이블과 매칭될 클래스이다(1:1 대응은 현실적으로 되지 않는다. DB를 객체지향스럽게 표현하는 것에는 한계가 있기 때문이다).

DTO

계층 간 데이터 교환을 위한 객체다. 데이터의 전송과 계층의 분리를 돕는다.

getter/setter를 갖는다.

DB에서 service로, controller로, client로 데이터를 주고받을 때, 데이터를 담는 컨테이너(객체)다.

class UserDto {
  name: string;
  id: string;
  age: number;
}

VO

Read Only. 특정한 비즈니스 값을 담는 객체다. 담긴 데이터 그 자체에 의미를 둔다(DTO는 계층 간 전송/교환이 핵심).

entity나 domain의 특정 개념(일부)을 표현하고, 식별성이 존재하지 않는다.

VO는 특정 개념을 나타내기 위함입니다. 예를들자면 상품 entity안에 할인률, 판매가, 할인가격 등등 price에 대한 필드들이 있고 그 안에 고유한 개념이 담겨져 있다면 그것을 Price VO로 분리함으로써 좀더 명확하게 도메인에 대한 개념을 표현하고 다른 코드에서도 Price라는 개념을 통해 객체를 캡슐화하여 사용할 수 있습니다. price.할인가계산() 같은 용도로 사용할 수 있겠네요. 이렇게 되면 계산할때마다 상품 외부의 객체가 상품 내부의 필드를 가져와서 계산하지 않아도 되어 캡슐화를 높이고 다른 곳에서 price라는 개념을 사용할때에도 정해진 price VO를 사용함으로서 로직이 흩어지는 일없이 한곳으로 모아 응집도를 높일 수 있습니다.

@devcrema 님 답글 발췌.

References