1.1 도메인이란
- 도메인(domain)은 개발자 입장에서 구현해야 할 소프트웨어의 대상을 뜻한다. 즉, 소프트웨어로 해결하고자 하는 문제 영역이다.
- 하나의 도메인은 하위 도메인들로 구성이 가능하다.
- 여러 하위 도메인들이 서로 연동하여 하나의 완전한 기능을 제공한다.
- 도메인 안에 모든 기능들은 구현하지 않아도 된다.(외부 영역과의 연결, 기능화하지 않는 소규모 작업 등)
- 하위 도메인은 항상 정해진대로 구성되지 않는다. 상황에 따라 달라질 수 있다.
1.2 도메인 전문가와 개발자 간 지식 공유
- 개발 및 코딩 시작 전에 요구사항을 올바르게 이해하는 것이 중요하다.(아닐 경우, 시간 및 비용 증가)
- 개발자가 도메인 전문가 만큼의 도메인 지식을 갖춰야 한다.
- "Garbage in, Garbage out"(잘못된 값이 들어가면 잘못된 결과가 나온다)
개발자도 도메인 지식이 필요하다
1.3 도메인 모델
- 도메인을 설명하기 위한 도메인 모델을 작성해야 한다.
- 도메인 모델은 도메인 자체를 이해하기 위한 개념 모델이다.
- 도메인 모델은 용도나 상황에 적합한대로 객체 기반 모델, 상태 다이어그램 기반 모델, 그래프 기반 모델 등으로 가능하다.
1.4 도메인 모델 패턴
- 애플리케이션의 아키텍쳐는 일반적으로 1.presentation 2.application 3.domain 4.infra 라는 계층들로 구성된다.
- domain 계층은 도메인의 핵심 규칙을 구현하며, 이러한 규칙들을 객체 지향 기법으로 구현하는 패턴이 도메인 모델 패턴이다.
- 도메인 모델은 개념 모델과 구현 모델로 구성된다.
- 프로젝트 초기에는 개념 모델로 도메인을 설계하고, 그 이후에는 개발하면서 구현 모델을 작성한다.
- 개발자는 소프트웨어를 개발하면서 더욱 도메인에 대한 이해가 높아진다. 그러므로, 개념 모델은 개요 수준으로만 작성하고 구현 모델은 이를 점진적으로 발전시켜 나간다.
용도에 맞는 모델을 작성하자
1.5 도메인 모델 도출
- 요구사항을 분석해야 도메인의 핵심 요소, 규칙, 기능들을 도출할 수 있다. 이를 토대로 도메인 모델링에 활용한다.
- 도메인 모델은 한번에 완성해 나아가는 것이 아니라, 요구사항에 대한 이해도에 따라 달라질 수 있고 개선되면서 나아간다.
- 요구사항 이해도를 높이기 위해서는 도메인에 대한 지식을 학습하거나 전문가와 논의하는 것도 방법이 된다. 이러한 노력은 도메인 모델의 완성도를 높인다.
- 코드를 보고 소프트웨어를 분석하기에는 많은 시간과 비용이 들 수 있다.
- 전반적인 기능이나 코드보다 상위 수준의 설명들로 구성한 문서가 소프트웨어를 파악하기에 좋다.
- 문서를 보고 전반적인 구조를 파악하고 세부적인 내용은 코드를 보는 것이 좋다.
도메인 모델은 요구사항에서 나온다
1.6 엔티티와 밸류
- 엔티티는 도메인 모델 안에서 식별자와 밸류를 가지고 있는 하나의 객체이다.
- 식별자는 항상 고유한 값으로 구성되어 엔티티 객체들을 구분할 수 있다.
- 식별자는 도메인의 특징과 기술에 따라 시점과 구현 방식이 달라진다.(특정 규칙, UUID, 직접 입력, 시퀀스나 auto increment 등)
- 밸류는 개념적으로 완전한 하나를 표현할 때 사용한다.
- 밸류로 엔티티를 설명할 수 있는 요소가 된다.
- 밸류의 데이터는 안전한 코드를 작성하기 위해 직접적으로 변경하지 않는 불변으로 구현하는 것이 좋다.(생성자 활용)
- 엔티티와 밸류를 제대로 구분해야만 도메인을 올바르게 설계하고 구현할 수 있다.
- 엔티티의 식별자 타입을 밸류 타입의 사용에 따라 의미를 잘 드러낼 수 있다.
- get/set 메소드 사용을 줄이자. 위에서 언급한 불변을 구현해야 도메인의 컨셉과 방향을 지킬 수 있다.
- DTO에서도 동일하다. 불변을 활용하자.
불변을 활용하여 엔티티와 밸류를 설계하자
1.7 도메인 용어와 유비쿼터스 언어
- 최대한 도메인 용어를 사용해서 코드를 짜야한다.(해석하는 과정이 줄어든다)
- enum을 활용하자.
- 도메인 용어는 항상 의미에 부합하고 어울리는 단어를 써야한다. 적절하지 않는 단어를 사용하는 경우, 불필요한 과정이나 비용이 발생한다. 단어를 찾는 노력이 필요하다. 알맞은 단어를 찾는 노력도 도메인 설계 중 하나의 과정이다.
- 유비쿼터스 언어(by 에릭 에반스) : 전문가, 관계자, 개발자가 도메인과 관련하여 공통어 언어를 만들고 사용한다.
도메인 용어 사용은 중요하다
참고 : 도메인 주도 개발 시작하기(최범균님 지음)