도메인 주도 설계란?
- 도메인 : 프로그램에 쓰이는 대상 영역.
- 도메인 모델 : 현실을 일반화하여 추상화하는 것. 이 과정에서 도메인에 맞게 필요한 개념만 취사선택하는 것이 필요하다.
- 도메인 객체 : 도메인 모델을 구현하여 표현한 것.
- 도메인 주도 설계 : 도메인 지식에 초점을 맞춰 개발하는 것. 초점을 맞춘다는 것은 도메인을 이해하고 도메인이 직면한 문제를 해결하는 것에 유용한 것을 프로그램에 적용하는 것.
- 도메인 주도 설계의 장점: 프로그램을 오랜기간 운영하며, 변화가 필요할 때, 더욱 쉽고 유연하게 대처할 수 있음.
값 객체
1. 정의
도메인 상의 값을 객체로 표현한 것
2. 이점:
1. 표현력이 증가한다.
하나의 값이 여러 부분으로 이뤄진 경우, 각각이 무엇인지 코드에서 명시할 수 있다.
예) 학번: 2023129323 → 입학연도/단과대학코드/학생코드
2. 무결성이 유지된다.
값객체를 생성하는 시점에 유효성 검사을 진행한다.
3. 잘못된 대입을 방지한다.
type mismatch
4. 로직을 한 곳에 모을 수 있다.
값 객체도 행동의 정의할 수 있는데, 이 행동들을 한 곳에서 관리할 수 있다.
validation, 화폐라면 같은 통화끼리만 연산할 수 있고, 곱셈 연산을 방지한다.
3. 성질
1. 불변성
2. 교환
3. 등가성 비교
4. 값 객체가 되기 위한 기준
명확한 기준이 없음. 그래서 팀 내에서 사전에 정의가 필요하다고 생각함.
저는 이름처럼 세부 의미가 나눠져있거나(이름과 성), 유효성 검사와 같은 객체만의 행위가 있는 경우에는 값 객체로 정의해야한다고 생각합니다.
엔티티
1. 엔티티란?
1. 값객체와 마찬가지로 도메인 객체이다.
2. 값 객체와 다른 점은 동일성을 기반으로 식별할 수 있는지 여부이다. 예를 들어, 이름은 동일성을 기반으로 식별가능하다. 성이 김이고 이름이 길동인 이름은 동일하게 성이 김이고 이름이 길동인 이름과 같은 객체이다. 하지만, 이름이 김길동인 사람과 또 이름이 김길동인 사람은 서로 같은 사람이라고 할 수 없다.
2. 엔티티의 성질
1. 가변이다. 값 객체는 불변이어서 값을 교환하는 방식으로 수정을 했다. (name = new Name()) 반면, 엔티티는 가변임으로 객체의 행동을 통해서 값을 수정한다.
2. 속성이 같아도 구분할 수 있다. 식별자를 기준으로 구분한다.
3. 동일성. 식별자를 기준으로 구분한다.
3. 엔티티의 판단 기준
생애주기와 연속성
User 처럼 생성됐다가 소멸하는 생애주기와 연속성이 있으면 엔티티로 구현한다.
4. 장점
1. 자기 서술적이다.
2. 유지보수가 쉽다.
서비스
1. 서비스란?
1. 도메인을 위한 서비스 ( = 도메인 서비스)
2. 어플리케이션을 위한 서비스
2. 도메인 서비스란?
값 객체 또는 엔티티에 정의하기 어색한 행위를 수행하는 객체. 주로 여러 개의 도메인 객체를 가로질러 일어나는 행위.
예 ) 물류 서비스에서 한 거점에서 다른 거점으로 화물을 ‘운송’하는 행위
거점 객체에 정의하기 어색함: 한 거점에서 다른 거점으로 이동하기 때문에, 같은 엔티티에 영향을 줌.
화물에 정의하기도 어색함: 화물이 수행하는 행위가 아님.
이러한 경우 ShipService라는 도메인 서비스를 만들어서 이 객체가 운송 행위를 수행하면 자연스러움.
3. 도메인 서비스를 남용하면 안됨
1. 오직 값객체나 엔티티가 수행하기 어색한 행동만을 도메인 서비스에 정의해야함.
2. 남용하게 되면, 로직이 흩어짐 → 유지보수가 어려워짐
4. 도메인 서비스의 기준
1. 입출력(데이터 스토어에 접근하는 행위, 도메인과 관련없음) 행위도 도메인 서비스에 포함될 수 있음. 이것이 도메인에 기초한 행위라면.
5. 도메인 서비스 이름 붙이는 규칙
1. 도메인 개념
2. 도메인 개념 + Service
3. 도메인 개념 + DomainService
팀에서 정하면 됨.
특정 값객체나 엔티티에 직접적으로 관련된 것이라면 객체 이름, 즉 명사로 도메인 개념을 적을 수도 있고, 특정 행동에 관련된 것이면 동사형으로 도메인 개념을 적을 수도 있다.
참조
도메인 주도 설계 철저 입문, 나루세 마사노부, 위키북스
'General' 카테고리의 다른 글
MSA(Micro Service Architecture) 이해해보기 (0) | 2023.05.22 |
---|---|
[Google Java Convention] 구글의 자바 컨벤션 정리 (1) | 2023.01.26 |
객체지향 설계 원칙 - SOLID (0) | 2022.11.14 |
TDD(테스트 주도 개발) 시작하는 방법 (0) | 2022.11.06 |
[로깅 전략] 로그는 어떻게 남겨야할까? (중앙집중식 로깅) (0) | 2022.10.26 |