아래의 내용은 우아콘2021 도메인 원정대를 듣고 note taking 한 것입니다.
출처
목적
도메인 지식을 탐구하고 문제 영역과 해결 영역을 좁히고 분산하여
복잡한 비즈니스 문제를 해결하는 방법을 소개
문제영역탐구와 해결영역 탐구
문제영역
도메인
- 소프트웨어로 해결하고자 하는 문제 영역
- 소프트웨어를 사용하는 사용자의 활동이나 관심사와 관련되어 있다
- 소프트웨어 산업은 다른 산업 내에서 발생하는 다양한 비즈니스 문제를 해결한다
사람들의 욕망과 욕구가 개발자에게 전달 됐을 때 우리는 그것을 도메인이라고 부른다
도메인 모델
- 모델은 목적을 위해 현실 세계에 존재하는 것을 가공하고 편집하여 우리에게 정보를 제공한다
- 특정 다이어그램이 아니라 다이어그램으로 전달하려는 아이디어이자 목적을 가진 의사소통 수단
- 이 의사소통 수단은 회의, 기획, 디자인, 개발에 사용되어야 한다
강의
라는 단어가 맥락을 고려하지 않으면 어떤 강의
를 말하는 건지 헷갈리게 됨
즉, 도메인 지식탐구 필요!!!
해결영역
Bounded Context
강의
와 관련된 여러가지 문제를 해결하기 위해 풀어야 할 영역을 좁히는 것이 중요하다
-> 도메인 주도 설계에서 바운디드 컨텍스트라고 함 == 해결영역
-> FAQ와 같다. 해결하려는 문제의 범위를 정의하는 것과 유사하다
해결영역
- 다중 사용자 환경에서 동시성 제어 실패
- 설계 모델과 구현 모델 간의 불일치
- 도메인 전문가와 개발자와의 멘탈 모델 불일치
애그리거트(==비즈니스 규칙)
- 시스템이 기대하는 책임을 수행하며 일관성(consistency)을 유지하는 단위
- 일관성은 항상 참이어야 하는 속성을 유지함으로써 달성된다
- 명령을 수행하기 위해 함께 조회하고 업데이트해야 하는 최소 단위
Aggregates are probably the least well understood among DDDs tactical tools
-
상위 수준에서 도메인 모델간의 관계를 파악할 수 있다
-
애그리거트에 속한 객체는 유사하거나 동일한 생애주기를 갖는다
-
애그리거트에 속한 객체를 관리하는 root entity(강의ID
)가 있음
root entity의 역할
- 애그리거트의 일관성이 깨지지 않게 함
- 애그리거트에 속한 entity와 각 객체를 사용하여 애그리거트가 구현해야 할 기능을 제공한다
효과
- 애그리거트의 내부 구현을 숨겨서 애그리거트 별로 구현을 캡슐화 하는데 도움이 됨
- 루트 엔터티의 식별자를 애그리거트 외부에서 사용할 수 있는 전역 식별자
- 전역 식별자로 애그리거트를 조회 할 수 있음
잠금
- 비관적 잠금
- 낙관적 잠금
- 애그리거트에서 무엇이든 변경하면 버전 증가가 발생해야 한다
- optimistic_force_increment를 사용하거나 자식 엔터티를 조작하는 경우 버전을 수동으로 증가시킨다
오류의 예)
- 트랜잭션 오류 optimistic lock exception
- 버전의 문제
- 동시에 접근시 생겨난 문제
- 처음 조회한 버전과 누군가에 의해 증가된 디비 버전이 달라 발생한 문제
큰 애그리거트
- 다중 사용자 환경에서 실행되면 정기적으로 트랜잭션 오류가 발생한다.
성능 및 확장성이 떨어진다
작은 애그리거트
해결
- 설계단계에서부터 소프트웨어의 성능을 고려해서 설계
- 애그리거트 마다 서로 다른 데이터 베이스를 사용
- 각 애그리거트 마다 각자 다른 최적의 데이터 베이스를 선택하여 사용
결론
- 누구의 문제인지, 어떤 것이 문제인지, 왜 문제인지에 대한 질문을 던져 보자
- 계층형 아키텍처의 계층을 나누는 것 만큼 해결 영역을 나누는 것도 중요하다
- 데이터베이스의 동시성 제어보다 애그리거트를 사용한 애플리케이션의 동시성 제어가 훨씬 한눈에 들어온다
- 도메인 전문가와 함께 모델을 검증하는 것이 코드를 작성하고 테스트하는 것보다 빠를 수 있다