MSA 설계에 대해 공부하다가 DDD를 알게됨
DDD를 바탕으로 마이크로 서비스와 비즈니스 로직을 설계한다는데 정리해보기로 했다.
용어 정리
- 도메인
- 일반적인 요구사항, 소프트웨어로 해결하고자 하는 문제 영역
- 기능적인 부분을 정의
- 도메인 모델
- 특정 도메인을 개념적으로 표현한 것
- Entity
- 테이블 모델, 고유 식별자를 가짐
- Value Object
- 데이터 표현 모델 식별자를 가지고 있지 않고 불변 타입임
// 가변 객체 class Cash { private int dollars; public void mul(int factor) { this.dollars *= factor; } }
// 불변 객체 class Cash { private final int dollars; public Cash mul(int factor) { return new Cash(this.dollars * factor); } }
- Aggregate
- 연관된 엔티티와 벨류 오브젝트의 묶음, 일관성과 트랜잭션, 분산의 단위
- 데이터 변경 단위(데이터 라이프 사이클) 같은 데이터를 묶은 집합
- root Aggregate
- Aggregate가 제공해야 할 핵심 도메인 기능을 보유하고 있는 모델
- Bounded Context
- 특정한 도메인 모델이 적용되는 제한된 영역
- 경계 내에선 동일한 모델을 일관되게 적용
- Context Map
- 바운디드 컨텍스트 간의 관계
도메인주도 설계(Domain Driven Design :DDD)는 2001년에 ‘에릭 에반스’가 쓴 책
특징
데이터 주도 설계란?
- 객체가 가져야 할 데이터에 초점을 두고 설계하는 것
- 객체 자신이 포함하고 있는 데이터를 조작하는 데 필요한 행동을 정의함
public class Movie { private String title; private Duration runningTime; private Money fee; private List<DiscountCondition> discountConditions; private MovieType movieType; private Money discountAmount; private double discountPercent; // getter, setter.. }
- 객체가 어떤 곳에서 사용될지 알 수가 없기 때문에 최대한 많은 접근자와 수정자를 만들게 됨
-> 외부에 대부분의 구현이 노출
-> 캡슐화의 원칙 위배("데이터를 묻지 말고, 기능을 실행해달라고 요청")
즉, 마이크로서비스를 도출하고 내부구조를 설계하는데 도메인 주도 설계 기법을 활용하는 것이 효과적임
카카오 Domain Driven Design 적용사례 공유
파트너 사이트는 카카오 페이지 앱에서 제공되는 모든 컨텐츠 관리 및 그에 따른 기능 제공함
-> 많은 Contents Provider들이 직접 파트너 사이트를 이용해 컨텐츠 생성, 업로드 등 진행, 작품에 대한 메타 정보, 판매 상태 등 관리함
또한 정산, 판매상품 통계정보 조회 가능
기존 파트너 사이트 모놀리식하게 구성되어 있었음
-> 기술부채
-> 유지보수 어려움
-> 리소스 관리 등 어려움
-> MSA 전환 고려
테스트 중심의 TDD
행위 중심의 BDD
도 있는데 왜 DDD?
파트너 사이트는 레거시 서버
-> 이미 큰틀과 검증된 플로우가 존재함
-> 따라서 전체적으로 한번에 갈아 엎는 빅뱅 방식 대신 필요한 기능 등을 구분하고 조금 씩 필터링 하는 점진적 향상을 선택했기 때문!
-> 레거시와 신규 서버를 동시 가동하게 함
DDD 대표적인 아키텍처 3가지
장점만큼 단점도 있음
단점
1. MSA에서 오는 단점
장점
1. 빠른 커뮤니케이션 (기존엔 데이터 용어, 실제 서비스 용어간 차이가 있었음)
2. 복잡했던 도메인 관계 정리가능
3. 도메인 분리에 따른 유지보수 편의성
4. 새로운 기능 및 요구사항에 대한 유연성
5. Aggregate 사용으로 인해 자연스럽게 캡슐화
6. 의존도 떨어짐(유즈케이스, 포트 등 사용), 응집도는 높아짐(도메인 로직을 필요한 곳에 모아버림)
7. 코드 가독성 증가
https://incheol-jung.gitbook.io/docs/q-and-a/architecture/ddd
https://www.youtube.com/watch?v=6w7SQ_1aJ0A
카카오 Domain Driven Design 적용사례 공유