본문 바로가기

Backend/DDD

[DDD] 도메인 주도 개발 시작하기(밸류 타입과 엔티티)

728x90

개요

도출된 모델은 크게 엔티티와 밸류로 구분할 수 있다. 
이 둘의 차이를 명확하게 아는 것은 도메인을 구현하는 데 있어 중요하다.
 
책을 보면서 두 모델의 관계와 특징에 대해 헷갈렸던 부분들과 이해한 결과에 대해 기록해 보려고 한다.

식별자와 동등성 비교

엔티티와 밸류 타입의 가장 큰 차이점은 식별자 여부와 동등성 비교 방식이다. 먼저 이 부분에 대해 어떻게 다른지 보자.

엔티티

먼저 엔티티는 식별자를 가진다. 식별자는 객체마다 고유하기 때문에 각 엔티티는 서로 다른 식별자를 가진다.
때문에 엔티티의 동등성 비교는 식별자를 이용해 수행된다.
 

밸류 타입

밸류 타입은 한 개 이상의 데이터가 개념적으로 완전한 하나일 때 이용한다. 즉 여러 데이터의 조합을 하나의 값으로 보는 것이다.
때문에 밸류 타입의 동등성 비교는 내부 데이터 값 비교로 수행된다. 내부 데이터의 값이 모두 같으면, 두 밸류 타입은 같다고 본다.
 
여기까지 보면 굉장히 쉽다. 엔티티는 식별자를 가지고, 밸류 타입은 객체를 그저 하나의 값으로 보는 것이다.
하지만 위 내용만으로 모델을 설계할 때 밸류 타입인지 엔티티인지 판단하기는 쉽지 않다. 판단을 위해선 두 모델이 각각 어떤 특징을 가졌으며, 다른 차이점을 알아야 한다.
 
책에서는 두 모델의 가장 큰 차이점에 대해 다음과 같이 말한다.

이 두 모델의 가장 큰 차이점은 도메인 모델의 엔티티는 데이터와 함께 도메인 기능을 함께 제공한다는 점이다.

도메인 기능

위에서 말하는 도메인 기능이란 뭘까? 이를 이해하기 위해선 먼저 밸류 타입의 불변성을 이해해야 한다.

밸류 타입의 불변성

밸류 타입은 하나의 값이다. 따라서 모델은 밸류 타입을 값으로 사용할 것이다. 만약 이 값이 자율적으로 수정된다면 밸류 타입을 이용하는 모델은 혼란에 빠질 것이다. 때문에 밸류 타입이 한 번 생성되게 되면, 절대 내부 데이터를 수정해선 안 된다.
만약 밸류 타입을 이용하는 모델이 다른 밸류 타입(값)이 필요하다면, 수정이 아닌 다른 내부 데이터를 가진 밸류 타입(값)으로 교체해야 한다.
 
밸류 타입의 불변성을 이해했다면, 도메인 기능이 엔티티와 밸류 타입을 구분한다는 말을 이해할 수 있다.
밸류 타입은 도메인 기능을 가진다고 해도 오직 불변성을 지키기 위한 기능만을 가진다. 비즈니스 로직이나 규칙에 따라 값을 수정하는 등의 기능을 수행할 수 없다.
 
하지만 엔티티는 데이터와 함께 기능을 제공한다. 주문 엔티티로 예를 들어보자. 주문 엔티티는 주문에 관련된 데이터를 제공하지만, 주문 항목을 추가하거나 주문을 처리하거나 배송지 주소를 변경하는 등의 도메인 기능도 수행한다. 그리고 이 기능은 단순히 데이터의 불변을 지키기 위함이 아닌 비즈니스에 필요한, 주문이라는 엔티티에 부여한 역할을 수행하기 위한 기능이다.
 
따라서 특정 모델이 할당된 역할을 위해 비즈니스에 필요한 로직을 수행하는 것이 아닌 단순히 별도의 테이블에 저장된다고 해서 이를 엔티티로 분리해선 안 된다.(내가 한 실수다..)
 
일반적으로 애그리거트에서 루트 애그리거트를 뺀 나머지 구성요소는 대부분 밸류 타입이다. 루트 엔티티 외에 엔티티가 존재한다면, 진짜 엔티티가 맞는지 의심해 봐야 한다. 이때 위 조건을 참고해 보자.
그래도 엔티티가 맞다면, 자신만의 독자적인 라이프 사이클을 가지는지 생각해 보자. 구분되는 애그리거트일 가능성이 높다.
 
절대 루트 엔티티 외에 엔티티가 존재할 수 없다는 것은 아니다. 비즈니스 요구사항에 의해 그럴 수 있지만, 일반적으로는 대부분 밸류 타입일 가능성이 높으니 신중하게 판단하자.
 

마무리

책을 참고해 제가 이해한 것에 대한 기록입니다. 잘못된 부분에 대한 지적이나 피드백 모두 환영입니다. 감사합니다.
 

참고

도메인 주도 개발 시작하기 - 예스24

가장 쉽게 배우는 도메인 주도 설계 입문서!이 책은 도메인 주도 설계(DDD)를 처음 배우는 개발자를 위한 책이다. 실제 업무에 DDD를 적용할 수 있도록 기본적인 DDD의 핵심 개념을 익히고 구현을

www.yes24.com

 

728x90

'Backend > DDD' 카테고리의 다른 글

[DDD] 도메인 주도 개발 시작하기(1)  (0) 2024.07.07