3 min to read
Domain / TIL
Domain
Domain
도메인은 지식, 영향력 또는 활동 영역을 말하며, 개발 분야에서는 소프트웨어로 해결하려는 문제의 영역을 의미한다.
도메인을 표현하는 대표적인 사례 : 객체 지향 프로그래밍
- 객체 지향 프로그래밍에서는 도메인이 클래스(상태, 동작을 가지는 객체)로 표현된다.
- 어떤 도메인을 개념적으로 표현하는 방법 : 객체 지향 설계, ERD 등
도메인 주도 설계 (Donaim Driven Design)
- 도메인 내부에서 문제 해결이 가능한 형태로 도메인을 모델링 하는 기법.
- 하나의 도메인 모델에 대한 이해관계가 각자 다름을 인정하고,
- 각 팀에 적합한 하위 도메인을 설정하고,
- 해당 하위 도메인에 대한 맥락을 알고 있는 사람이 따라야 할 비즈니스 규칙에 대한 경계를 설정하는 설계 방식이다.
- 따라서 마이크로서비스와 궁합이 좋다.
보편 언어 (ubiquitous language)
- 도메인의 특정 업무와 관련된 사람들 사이에서 통용되는 개념
- 페이먼츠 팀 : 고객이 ‘결제’ 했어요
- 배달 팀 : ‘배달’ 건수가 생겼어요
- 가맹점 팀 : ‘주문서’가 도착했어요
한정된 맥락 (bounded context)
- 요구사항을 모놀리틱(단일 프로그램) 아키텍처로 구성하면 클래스 이름 정의하기도 쉽지 않다.
- 이름을 지었다 한들 클래스가 매우 비대해질 우려가 있다. (“클래스는 하나의 책임만 가져야 한다”는 단일 책임 원칙 위배)
- 다른 목적을 갖도록 클래스를 분리했다 하더라도, 의존 관계를 신경써야 한다.
- 모델의 경계를 분명하게 구분짓고, 업무 범위 내로만 아키텍처를 구성하면 된다.
- 업무 범위를 나누어 타당한 클래스 이름 짓기가 가능해지고, 모든 도메인에 용어를 맞추기 위해 모호한 단어를 쓸 필요가 없다.
DDD를 실천하기에 딱 맞는 마이크로서비스 아키텍처를 도입하려면,
- 도메인 지식을 가진 엔지니어가 팀 마다 있어야 자연스럽게 기능 조직이 아니라 목적 조직화 된다.
- 여러 서비스가 잘 결합할 수 있게 디자인해야 한다. 하지만, 동시에 다른 서비스에 지나치게 의존해서도 안된다.
- 서비스를 오케스트레이션 해야한다. 오케스트레이터는 각 서비스가 죽는지 안죽는지 여부, 트래픽이 수용 가능한지 아닌지 여부, 인프라 유지보수 (업그레이드, 패치 등) 업무 등에만 집중한다.
따라서 마이크로서비스로 소프트웨어를 작성할 때에는, 소프트웨어 작성에 앞서 팀의 일하는 방식을 보다 독립적으로 만들어내야 한다. 반대로 마이크로서비스 아키텍처를 통해, 팀의 일하는 방식이 보다 독립적으로 만들어질 수 있다. 즉, 문화로서의 DevOps를 실천해야만 가능하다.
DDD 주요 용어
- 도메인 이벤트: 발생한 사건
- 커맨드: 도메인 이벤트를 트리거하는 명령
- 외부 시스템: 도메인 이벤트가 호출하거나 관계가 있는 레거시 또는 외부 시스템
- 액터: 개인 또는 조직의 역할
- 핫스팟: 의문사항, 결정하기 힘든 사항
- 애그리거트: 도메인 이벤트와 커맨드가 처리하는 데이터, 상태가 변경되는 데이터
- 정책: 이벤트 조건에 따라 진행되는 결정, “이벤트”가 발생할 때, “커맨드”를 실행한다
- 정보: 액터에게 제공되는 데이터, 결정을 내리는데 영향을 주는 정보
DDD 제작 순서
- 도메인 이벤트 찾기
- 외부 시스템/외부
- 프로세스 찾기
- 커맨드 찾기
- 액터 찾기
- 애그리거트 정의
- 바운디드 컨텍스트 정의
- 컨텍스트 매핑
예시로 DDD를 만들어 보았다.
중앙방역대책본부에는 다양한 팀(DDD의 관점에서는 Actor)이 있지만, 대중에게 가장 잘 알려진 다음의 네 팀의 업무만을 이해해 보도록 하자.
관리 (환자 관리 팀)
Actor : 환자
Aggregate : 증상 여부
- 유증상 symptomatic
- 무증상 asymptomatic
Command :
- 치료
- 격리 해제 기준 검토
- 증상 확인
Domain event
- n일 이후 무증상 시
→ 격리 해제 - n일 이후 유증상자 (호전되지 않는 경우)
→ PCR 검사
—
격리 (격리 관리팀)
Actor : 격리 관리 팀
Aggregate : 격리 여부
- 격리 O
- 격리 X (외출)
Command
- 격리 환자 위치 파악
- 격리 환자 외출 시 경보 문자 발생
Domain event
- 확진일로부터 7일 경과
→ 격리 해제 - 7일 경과 시에도 유 증상자
→ 추가 격리
System
- 실시간 위치 조회
- 격리 유의 사항 관련 문자 전송
조사 (역학조사팀)
Actor : 역학 조사 팀
Aggregate : 접촉자 확진 여부
- 확진 O
- 확진 X Command
- 동선 파악
- 밀접 접촉자 확인
- 확진자 동선 방역 실시 Domain event
- 접촉자 PCR 검사 확진 O
→ 확진 접촉자의 동선 확인 System - 확진자 동선 조회
- 밀접 접촉자 정보 확인
- 방역
검사 (진단검사운영팀)
Actor : 진단검사운영팀
Aggregate
- 코로나 확진 여부
- 증상 여부 : 유증상, 무증상
Command
- PCR 검사
Domain event
- 코로나 확진
아직 헷갈리는 것이 많아 미흡하지만 miro를 이용해 이정도로 작성해보았다.