도서

도메인 주도 개발 시작하기 - 1

Meluu_ 2026. 6. 14. 21:18

최근 프로젝트를 하면서 DDD를 탑다운으로 해보았다.

하지만 구현해보면서 무슨 느낌인지 알것같지만, 계속된 검증을 통해서 DDD를 하고 있지않다는 것을 알게되었다.

 

따라서 오늘부터

'도메인 주도 개발 시작하기 : DDD 핵심 개념 정리부터 구현까지' 

해당 도서로 원리부터 이해해보려고한다. 

해당 책은 입문서로 가볍게 읽기 좋다고 후기들을 봤다.

간단하게 어떤식인지 알아보고 더 깊게 공부하기 위해서는 Eric Evans저자의 DDD를 읽어봐야할 것 같다.

 

책에서 배운 내용을 간략하게 정리한다.


 

도메인 : 소프트웨어로 해결하고자 하는 문제 영역

한 도메인은 다시 하위 도메인으로 나눌 수 있음

특정도메인을 모두 구현할 필요 없고 외부 시스템을 사용할 수도 있다.

 

도메인 모델 : 특정 도메인을 개념적으로 표현, 도메인 자체를 이해하기 위한 개념 모델

개념 모델을 이용해 바로 코드 작성이 불가능하기에 구현기술에 맞는 구현 모델이 따로 필요

구현 모델이 개념 모델을 최대한 따르도록

 

모델을 표현하는데 있어 특정 다이어그램에 한하지 않음

필요하다면 어떤 다이어그램, 객체등으로 표현

 

도메인 모델 패턴

일반적인 아키텍처는 네 개 영역으로 구성

표현(presentation), 응용(application), 도메인(domain), 인프라스트럭처(infrastructure) 

 

위에서 본 도메인 모델이 도메인 이해를 위한 모델

 

도메인 모델

아키텍처 상의 도메인 계층을 객체 지향 기법으로 구현하는 패턴

 

도메인 계층은 도메인의 핵심 규칙을 구현함

즉, 도메인의 상태 변화나 규칙, 제약등은 도메인 내에서 처리해야함

 

 

도메인 모델 도출

 

모든 도메인 모델 구성의 기초는 요구사항에서 출발함 

- 회원 가입이 가능해야함

- 신고된 유저라면 로그인이 불가능해야함

- 정지된 유저라면 게시글 조회가 불가능해야함

 

등과 같은 요구사항을 통해서 도메인 모델을 도출할 수 있다.

특히 상태에 따른 규칙이 핵심이라고 본다. (본인 생각)

 

엔티티와 벨류

도출한 모델은 크게 엔티티와 밸류로 구분

 

엔티티 

엔티티는 식별자를 가짐

이는 절대 변경되지 않는다.

 

equals() 와 hascode()를 식별자로만 판단하게 구현가능

 

엔티티의 식별자 생성

또한 식별자 생성시 다음 중 한 가지 방식으로 생성

  • 특정 규칙에 따라 생성
  • UUID나 Nano ID와 같은 고유 식별자 생성기 사용
  • 값을 직접 입력
  • 일련번호 사용 (시퀀스나 autoincrement)

알고 있겠지만 autoIncrement는 db 저장 전까지는 식별자를 엔티티가 가질 수 없다.

 

밸류 타입

예를 들어 받는 사람과 받는 사람의 주소에 대한 데이터를 가질때 

 받는 사람과 주소는 개념적으로 하나다.

 

때문에 Receiver('받는 사람')이라는 도메인 개념으로 표현할 수 있다.

따라서 받는 사람과 주소를 Receiver 클래스로 만들어 밸류타입으로 사용한다.

 

밸류 타입은 코드의 의미를 더 잘 이해할 수 있도록 돕고

값 타입 자체가 의미를 가진다. 

 

때문에 실수를 줄일 수 있고, 가독성도 증가한다.

 

set/get은 최대한 지양

특히 set은 도메인 규칙의 의미를 알 수 없고 단순히 값 변경이기때문에 적합하지 않으며, 

실수를 유발할 수 있다.  (참조 투명성)

 

불변 밸류 타입

또 책에서 불변 밸류 타입을 사용시 자연스럽게 밸류 타입에는 set 메서드를 구현하지 않는다고 한다.

값 변경시 변경된 데이터를 갖는 새로운 뱔류 객체를 생성하는 방식을 선호하는데

이는 안전한 코드를 작성할 수 있다.

 

즉, 불변 밸류 타입은 setter로 내부 값을 바꾸지 않고, 값이 달라질 때마다 새 객체를 만든다.
그래서 공유 참조로 인한 예상치 못한 변경을 막고, 같은 값은 항상 같은 의미와 결과를 갖게 만들어서 코드가 안전해진다.

 

 

도메인 용어와 유비쿼터스 언어

간단히 말해서

전문가, 관계자, 개발자가 도메인과 관련된 공통의 언어를 만들고 이를 대화, 문서, 도메인 모델, 코드 등 모든 곳에서 같은 용어를 사용한다