[모르고리즘 7] 탐구생활

LILO Ghim·2022년 5월 1일
1

아래의 내용은 우아콘2021 도메인 원정대를 듣고 note taking 한 것입니다.
출처


목적

도메인 지식을 탐구하고 문제 영역과 해결 영역을 좁히고 분산하여
복잡한 비즈니스 문제를 해결하는 방법을 소개

  • 애그리거트?
  • 바운디드컨텍스트?

문제영역탐구와 해결영역 탐구


문제영역

  • 무엇이 문제인가?
    문제를 어떻게 바라보느냐에 따라서 해결책도 달라질 수 있다

  • 풀고자 하는 문제가 정확하게 무엇인지 이해하는 것이 노력의 80%가 들어가야 한다

도메인

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

사람들의 욕망과 욕구가 개발자에게 전달 됐을 때 우리는 그것을 도메인이라고 부른다


도메인 모델

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

강의라는 단어가 맥락을 고려하지 않으면 어떤 강의를 말하는 건지 헷갈리게 됨

즉, 도메인 지식탐구 필요!!!


해결영역

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
    • 버전의 문제
    • 동시에 접근시 생겨난 문제
    • 처음 조회한 버전과 누군가에 의해 증가된 디비 버전이 달라 발생한 문제

큰 애그리거트

  • 다중 사용자 환경에서 실행되면 정기적으로 트랜잭션 오류가 발생한다.
    성능 및 확장성이 떨어진다

작은 애그리거트

  • 통제불능으로 성장할 수 있다
    동시성 극대화

해결

  • 설계단계에서부터 소프트웨어의 성능을 고려해서 설계
  • 애그리거트 마다 서로 다른 데이터 베이스를 사용
  • 각 애그리거트 마다 각자 다른 최적의 데이터 베이스를 선택하여 사용

결론

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

0개의 댓글