도메인 원정대

무엇이 문제인가?

고담 시내 금융 지구 한 가운데는 얼마 전에 새로 지은 휘황찬란한 73층짜리 브론토사우루스 타워가 서있다. 그런데 이 최고급 빌딩에 입주가 아지 끝나지도 않았는데 벌써 사무실 입주자들은 엘리베이터에 서비스에 불만을 느끼고 있다. 실제로 몇몇 입주자는 엘리베이터 서비스를 하루빨리 개선하지 않는다면 그곳을 떠나겠다고 으름장을 놓고 있다.

물류 센터 관리자는 재고가 없을 때 품목을 주문할 수 있도록 재고 보고서를 인쇄할 수 있어야 한다. -> 물류 센터 관리자는 보다 효율적인 출고 프로세스가 필요하다. -> 출고 예측 시스템을 도입하여 물류 센터에 재고를 수동으로 추가하지 않도록 개선할 수 있다.

도메인

  • 소프트웨어롤 해결하고자 하는 문제영역
  • 소프트웨어를 사용하는 사용자의 활동이나 관심사와 관련되어 있다.
  • 소프트웨어 산업은 다른 산업 내에서 발생하는 다양한 비즈니스 문제를 해결한다.

도메인 모델

  • 모델은 목적을 위해 현실 세계에 존재하는 것을 가공하고 편집하여 우리에게 정보를 제공한다.
  • 특정 다이어그램이 아니라 다이어그램으로 전달하려는 아이디어이자 목적을 가진 의사소통 수단이다.
  • 이 의사소통 수단은 회의, 기획, 디자인, 개발에 사용되어야 한다.

강의 도메인

  • 강의 콘텐츠를 관리한다.
  • 정원과 모집 상태에 따라 수강 신청을 받는다.
  • 수강생과 수강 대기자, 리뷰어를 관리한다.
  • 하나의 미션
  • 하나의 상품

이벤트 스토밍

  • 복잡한 비즈니스 도메인을 빠르게 탐색하고 학습할 수 있는 워크숍
  • 도메인 전문가와 개발자를 학습 과정에 참여시키기 위한 빠른 설계
  • 코드를 없애고 모든 사람을 동일한 수준으로 만드는 시작걱 접근 방법

바운디드 컨텍스트

  • 해결 영역
  • 관심사를 분리하고 격리하여 문네 해결에 집중할 범위를 정한다.

예1

이름 가격 무게 도우 토핑 영양성분 음식물 쓰레기 여부

이름 가격 무게 도우 토핑 영양성분 음식물 쓰레기 여부

예2

  • 교육 과정 및 강의 콘텐츠 관리
    • 강의 : 강의 계획서, 콘텐츠
  • 미션 진행
    • 강의 : 리뷰어 배정 타입, 미션 저장소
  • 수강 신청 및 수강생 관리
    • 강의 : 정원, 모집 상태
  • 결제 및 환불
    • 강의 : 환불 타입, 가격

모델링 및 확인

30명 정원인데 60명인 경우 발생

무엇이 문제일까?

  • 다중 사용자 환경에서 동시성 제어 실패
  • 설계 모델과 구현 모델 간의 불일치
  • 도메인 전문가와 개발자의 멘탈 모델 불일치

에그리거트(비즈니스 규칙)

  • 시스템이 기대하는 책임을 수행하여 일관성을 유지하는 단위
  • 일관성은 항상 참이어야 하는 속성을 유지함으로써 달성된다.
  • 명령을 수행하기 위해 할께 조회하고 업데이트 해야하는 최소 단위

강의 애그리거트

강의 - 수강생 - 수강 대기자

애그리거트 루트

애그리거트 내부를 숨겨준다.

잠금

  • 비관적 잠금
    • 한 번에 한 명의 사용자만 처리할 수 있도록 데이터베이스의 레코드를 독점한다.
    • 성능이 저하되고 교착 상태가 발생할 수 있다.
  • 낙관적 잠금
    • 애그리거트에서 무엇이든 변경하면 버전 증가가 발생해야 한다.
    • OPTIMISTIC_FORCE_INCREMENT를 사용하거나 버전을 수동으로 증가시킨다.

트랜잭션 오류

각 서비스 작업을 수행하면서 다른 작업에 의해 버전이 달라지는 불일치가 발생할 수 있다.

큰 애그리커드와 작은 애그리거트

큰 애그리거트는 확장성이 떨어진다. 작은 애그리거트는 통제 불능으로 성장할 수 있다.

결론

  • 누구의 문제인지, 어떤 것이 문제인지, 왜 문제인지에 대한 질문을 던져보자.
  • 계층형 아키텍처의 계층을 나누는 것만큼 해결 영역을 나누는 것도 중요하다.
  • 데이터베이스의 동시성 제어보다 애플리케이션의 동시성 제어가 더 한눈에 들어온다.
  • 도메인 전문가와 함께 모델을 검증하는 것이 코드를 작성하고 테스트하는 것보다 빠를 수 있다.