티스토리 뷰
반응형
[도메인 주도 설계 핵심 - http://www.yes24.com/Product/Goods/48577718]
- DDD는 주로 명확하게 바운디드 컨텍스트 내에서 보편언어를 모델링하는 것에 대한 것이다
- 바운디드 컨텍스트는 의미적으로 동일한 컨텍스트의 범위를 표현
- 소프트웨어 모델의 각 컴포넌트는 특정한 의미를 갖고 특정한 일을 수행한다
- 바운디드 컨텍스트 내에 존재하는 컴포넌트들은 컨텍스트에 특화돼 있으며, 컨텍스트 안에서 의미가 살아난다
- 모델링 작업을 시작하는 시점에서 바운디드 컨텍스트는 개념적인 수준이라 문제 영역의 일부라고 생각할 수도 있지만
모델이 더 깊은 의미와 명확성을 받아들이게 되면서 빠르게 해결 영역으로 전환된다- 문제 영역(problem space) : 상위 수준의 전략적 분석을 수행하고 주어진 프로젝트 제약사항 내에서 단계를 설계하는 곳
- 해결 영역(solution space) : 문제 영역의 논의가 핵심 도메인으로 바라보는 해결 방안을 구현하는 곳
- 바운디드 컨텍스트는 모델이 구현되는 곳이고, 바운디드 컨텍스트마다 각각 분리된 소프트웨어 산출물이 나온다
- 바운디드 컨텍스트 안에서 일하는 팀 구성원들이 이야기할 때 사용되고 소프트웨어 모델 안에 구현할 때 사용하는 언어를 보편 언어라고 한다
- 보편언어는 엄격하고, 정확하고, 엄중하며, 단호해야 한다
- 팀의 누군가가 보편언어 표현을 사용하면 팀 모두가 그 표현이 가진 제약사항과 정확한 의미를 이해한다
- 바운디드 컨텍스트는 마치 언어의 경계와 비슷하다
- DDD의 경우 보편적 언어라는 것은 소프트웨어 모델을 소유하는 팀이 이야기할 때 사용하는 것이고
이 언어의 대표적인 기록 형태는 소프트웨어 모델의 소스 코드다
- DDD의 경우 보편적 언어라는 것은 소프트웨어 모델을 소유하는 팀이 이야기할 때 사용하는 것이고
- 바운디드 컨텍스트가 조직의 핵심 전략적 계획으로 개발되고 있을 때 이를 핵심 도메인이라고 한다
- 핵심 도메인은 가치 있는 것들을 달성하는 수단이 되기 때문에 가장 중요한 소프트웨어 모델 중 하나이다
- 기업의 올바른 전략적 결정을 위해 무엇이 핵심 도메인이어야 하고 어떤 것을 제외시켜야 하는지 현명하게 선택해야 한다
- 바운디드 컨텍스트는 의미적으로 동일한 컨텍스트의 범위를 표현
- 바운디드 컨텍스트, 팀 그리고 소스 코드 리파지토리
- 각각의 바운디드 컨텍스트는 단일 팀에만 할당돼야 하고
각 바운디드 컨텍스트마다 독립적인 소스 코드 리파지토리가 있어야 한다 - 한 팀은 다수의 바운디드 컨텍스트에 대해 일을 할 수 있지만
다수의 팀이 하나의 바운디드 컨텍스트를 수행할 수는 없다 - 바운디드 컨텍스트마다 소스 코드와 데이터베이스 스키마도 명확히 분리한다
- 각 팀은 각자의 소스 코드와 데이터베이스를 소유하고 공식 인터페이스를 정의해서 바운디드 컨텍스트를 다른 팀이 사용할 수 있게 허용한다
- 각각의 바운디드 컨텍스트는 단일 팀에만 할당돼야 하고
도메인 전문가와 비즈니스 동인
- DDD는 서로 다른 개념들을 각기 다른 바운디드 컨텍스트 안으로 분리해 높음으로써 개념 간 차이를 중시한다
- 각기 다른 언어와 그에 따른 기능이 존재하는 것을 인정한다
기본적인 전략적 설계를 하려면
- DDD의 전략적 설계 도구 - 바운디드 컨텍스트, 보편 언어
- 바운디드 컨텍스트를 사용하는 것은 "핵심이 무엇인가?"라는 질문에 답하도록 유도한다
- 전략적 계획의 핵심이 되는 모든 개념들을 밀접하게 유지하면서 포용해야 하고 나머지는 모두 제외시켜야 한다
- 핵심만 걸러낸 후 바운디드 컨텍스트에 남은 개념들은 팀이 사용하는 보편언어의 일부가 된다
- 경계는 그 안의 엄격함을 강조한다
- 핵심을 알아내는 방법
- 필수적인 두 가지 그룹(도메인 전문가와 소프트웨어 개발자)을 하나로 묶어 서로 협업하는 팀을 만들어야 한다
- 도메인 전문가는 비즈니스 문제에 좀 더 집중한다
- 그들은 비즈니스가 동작하는 방법에 대한 비전에 의미를 둔다
- 다양한 비즈니스 영역들마다 존재한다
- 팀의 보편 언어의 토대는 비즈니스를 바탕으로 한 도메인 전문가들의 멘탈 모델이다
- 소프트웨어 개발자는 개발에 중점을 둔다
- DDD 프로젝트를 수행하는 개발자는 핵심 전략 목표의 비즈니스 초점을 받아들이지 못하는 기술 중심의 주장을 하지 않도록 조심해야 한다
- 개발자는 근거 없는 간결성은 피하고 해당 팀의 바운디드 컨텍스트 안에 팀이 점진적으로 개발하는 보편언어를 수용할 수 있어야 한다
- 기술적 복잡도가 아닌 비즈니스 복잡도에 집중해야 한다
- 개발자와 도메인 전문가 모두 문서가 대화를 지배하는 상황을 피해야 한다
- 최고의 보편언어는 서로 협업하며 나오는 거듭된 피드백에 의해 만들어지며 이 과정에서 팀의 화합된 멘탈 모델을 만들 수 있다
- 열려 있는 대화, 탐구 그리고 현재의 지식 기반에 대한 도전의 결과는 핵심 도메인에 대한 더 깊은 통찰로 이어질 것이다
도전과 통합
- 거대한 모델의 각 개념들이 스크럼의 보편언어를 따르는지 되묻는다
- 개념들이 바운디드 컨텍스트 내에 있는지 확인한다
- 모델 관련 여러 가지 시도를 통해 좀 더 깔끔하고 명확한 보편 언어 모델이 만들어진다
- 협업 컨텍스트 : 다른 바운디드 컨텍스트와의 협업을 통해 적절하게 동작한다
- 여러 단계들을 거쳐 실제 핵심 도메인만 남는다
- 핵심 도메인은 스크럼의 보편언어에 따르는 새로운 개념들로만 확장될 것이다
- 핵심 도메인에서 제외시켰던 다른 모델링 개념들은 각각의 바운디드 컨텍스트 내에 정의될 가능성이 높고 각각의 보편언어에 연결될 것이다
- 컨텍스트 매핑으로 통합
보편언어 개발하기
- 개발자들은 도메인 모델 안의 명사에 너무 많은 의미를 부여하는 경향이 있다
- 핵심 도메인을 명사에만 제한시킬 필요가 없다
- 핵심 도메인이 도메인 모델에 나타난 개념에 대한 구체적인 시나리오들을 나타낼 수 있게 만들어야 한다
- 시나리오
- 소프트웨어 프로젝트에서 흔히 말하는 use case나 user story 같은 것을 의미하지 않는다
- 어떻게 도메인 모델이 동작해야 하고 어떤 다양한 컴포넌트들이 동작하는지에 대한 시나리오를 뜻한다
- 매우 실제적인 소프트웨어 모델 컴포넌트들이 스크럼 기반 프로젝트 관리를 지원하기 위해 어떻게 동작할 것인지를 나타내는 세부사항이다
- 실제로 도메인 모델이 어떻게 동작하는지 그리고 그 설계에 대해 대화할 수 있다는 것이 가장 중요한 이점이자 도움이 되는 특징이다
- 시나리오 안의 개념에 이름을 붙이거나 구별할 수 있는 정체성을 부여하는 것이 도움이 될 때만 별도의 이름과 구분짓는 특성을 부여하자
- 작업에 시나리오 넣기
- 사례를 통한 명세 - 행위 주도 개발(BDD: Behavior-Driven Development)
- 목적 : 공유된 이해를 기반으로 보편언어와 모델을 협업을 통해 개발 및 정제하고, 모델이 명세서를 준수하고 있는지를 확인하는 것
- given/when/then 등의 표현을 사용해 작성한 시나리오는 검증에 용이하다
- 도메인 모델을 검증할 때 인수 테스트(단위 테스트가 아님)를 생성해 검증할 수도 있지만 단위 테스트 프레임워크를 사용해서 이와 거의 비슷한 결과를 달성할 수도 있다
- 인수 테스트에 대한 단위 테스트 기반 점근법은 실행 가능한 명세와 동일한 목적을 달성시켜준다
- 접근법들은 모두 일반적으로 녹-적(성공-실패) 방식에 사용할 수 있는데 처음 수행할 때의 명세는 실패다
- 일련의 적색(실패) 결과들을 기반으로 완전히 명세를 구현하고 검증을 통과(모두 녹색 결과를 확인)하게 될 때까지 도메인 모델을 단계적으로 정제해 나간다
- 인수 테스트는 직접적으로 바운디드 컨텍스트와 연관되고 소스 코드 리파지토리에 유지된다
- 사례를 통한 명세 - 행위 주도 개발(BDD: Behavior-Driven Development)
- 많은 시간과 노력이 드는 일은?
- 초기에 개발됐던 보편언어는 해가 지나도 계속해서 성장해야 한다
- 오랜 기간 지속적인 노력을 이끌어낼 수 없다면, 이 모델이 과연 지금 이 순간 정말로 전념해야 하는 전략적 차별화 요소, 즉 "핵심도메인인가?"라고 반문해봐야 할 것이다
아키텍처
- 바운디드 컨텍스트는 도메인 모델 이상의 다양한 요소들로 구성되어 있다
- 사용자 인터페이스 컨트롤러
- REST endpoints
- message listeners
- input adapter
- application services
- 도메인 모델
- persistence management
- message senders
- output adapters
- ...
- 도메인 모델은 기술로부터 최대한 자유로워야 한다
- 여러 아키텍처들을 조합해서 사용할 수 있다
- 이벤트 주도 아키텍처
- 커맨드-쿼리 책임 분리(CQRS: Command Query Resposibility Segregation)
- 반응 및 액터 모델
- REST(Representational State Transfer)
- 서비스 지향 아키텍처(SOA)
- 마이크로서비스
- 클라우드 컴퓨팅
- ...
요약
- 너무 많은 것을 하나의 모델에 넣는 것과 큰 진흙 덩어리를 만드는 것과 관련된 몇 가지 중요한 위험 요소들
- DDD 전략적 설계의 적용
- 바운디드 컨텍스트와 보편언어의 사용
- 가정들에 대한 분석과 멘탈 모델을 통합하는 방법
- 보편언어를 개발하는 방법
- 바운디드 컨텍스트 내에서 발견할 수 있는 아키텍처 컴포넌트
- 스스로 DDD를 실행 방안에 넣는 것이 전혀 어려운 일이 아니라는 것
반응형
'study > 도메인 주도 설계 핵심' 카테고리의 다른 글
Chapter1. 나에게 도메인 주도 설계는 (0) | 2021.07.12 |
---|
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- IntelliJ
- 쿠버네티스
- Spring
- springboot
- back merge
- 클린코드
- ImagePullBackOff
- docker
- gasmask
- ddd
- 코틀린
- clean code
- 도메인주도설계
- kotlin In Action
- gradle
- k8s
- linuxkit
- QuickTimePlayer
- 자바
- cacheable
- 스프링부트
- 자바스크립트
- JavaScript
- docker for mac
- kotlin
- Kubernetes
- java
- 도커
- docker pull limit
- 스프링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함