본문 바로가기
👨‍🏫일문일답

도메인 모델, 엔티티, DTO, VO 차이 정리

by 캔 2023. 12. 13.

각 객체들의 의미를 살펴보고 어떤 차이가 있는지 알아보자.

 
각 객체들의 관계를 그림으로 나타내 보았다. 기본적으로 도메인 모델, 엔티티, DTO, VO는 객체(Object)이다. 일단 크게는 도메인 모델 객체, DTO, VO로 나눠 볼 수 있다.
 

도메인 모델 객체

도메인 모델 객체(domain model object)는 어떤 도메인에 속하는 모델 객체를 가리킨다. 도메인은 해결하고자 하는 문제가 속하는 "영역"을 의미하는데, 온라인 쇼핑몰이나 여행 예약 사이트 등 서비스 종류를 도메인으로 볼 수 있다. 이 도메인은 다시 회원, 상품, 주문, 예약 등 하위 도메인으로 분해될 수 있다. 이처럼 도메인 자체는 영역 또는 범위를 의미할 뿐이고 도메인 모델은 이러한 도메인에서 사용되는 모델을 말하는데, 모델이란 현실 세계의 개념이나 대상을 단순하고 구조적으로 표현한 것을 말한다. 이러한 도메인 모델을 객체 지향 언어의 객체를 사용하여 표현한다면 그것이 도메인 모델 객체이다. 흔히 말하는 도메인 모델이나 도메인 객체라는 용어도 이 도메인 모델 객체를 가리킨다고 이해하면 된다. 도메인 모델 객체는 해당 도메인의 비즈니스 로직이나 요구사항을 포함한다.
 

엔티티

엔티티(entity)는 DB의 테이블이나 도큐먼트를 표현하는 객체이다. 테이블(도큐먼트)이 객체에, 칼럼들이 필드들에 대응된다. 즉, 엔티티는 DB를 모방하고 연결하는 객체이다. 특정 도메인에서 사용되는 데이터 모델과 대응되는 객체이므로 도메인 객체의 일종이다.
 

DTO

DTO(Data Transfer Object)는 MVC의 모델과 뷰/컨트롤러 사이에서 데이터 전송을 위해 사용하는 객체이다. 모델과 뷰/컨트롤러 간 의존도를 낮추기 위해 사용된다. DB에서 조회된 값들을 담아서 전달하는 역할을 한다. 데이터 필드에 대한 조회 및 수정을 위해 필드와 getter와 setter로 구성되며, 그 외에 메서드는 포함하지 않는 것이 바람직하다. 그 외 다른 로직은 도메인 모델 객체가 처리하도록 하자.
 

VO

VO(Value Object, 값 객체)는 값 자체를 나타내는 객체이다. 예를 들면, 은행이나 커머스 도메인에서 금액을 값으로 나타내는 Amount 객체로 만들어 사용할 수 있다. 이렇게 사용하면 해당 개념이나 대상에 대한 행위/동작/연산을 새로 정의할 수 있다. VO의 경우, 개별 인스턴스가 값 그 자체를 나타내기 때문에 그 값을 변경하지 못하게 하기 위해 불변인 필드로만 구성되고 setter는 사용하지 않는다. 이러한 VO는 객체의 한 형태이기 때문에 지금까지 살펴본 모든 객체들을 값 객체로 만들 수 있기는 하다. 하지만 엔티티의 경우 update 등을 위해 필드의 값이 변경되어야 하는 상황이 있으므로 VO로 사용하지 않는다.