설계

도메인 주도 설계 첫걸음 6장.

오늘의 나1 2022. 9. 25. 16:58

6장. 복잡한 비즈니스 로직 다루기

도메인 모델 패턴을 사용하여 복잡한 비즈니스 로직을 다룰 수 있다.

 

도메인 모델 패턴

  • 비즈니스 로직에만 집중하여 복잡도를 줄인다: 비즈니스 로직 자체만으로 복잡하기 때문에, 더 복잡하게 만들면 안 된다. 비즈니스 로직 외의 것은 포함하지 않아야 한다. 예를 들어 DB 연결이나 외부 시스템 호출 등의 기술적 관심사같은 것들은 포함하지 않아야 한다.
  • 코드에서 유비쿼터스 용어를 사용해야 한다: 구현하는 바운디드 컨텍스트의 유비쿼터스 용어를 사용해야 한다. 이렇게 함으로써 도메인 전문가, 개발자, 그 외 커뮤니케이션해야할 사람과 효율적으로 동기화할 수 있다. 

 

구성요소: 밸류오브젝트, 애그리게이트, 도메인서비스 

밸류 오브젝트

  • 값 자체로 식별할 수 있는 데이터
    • 값 자체가 식별자로서 동작하기 때문에, 식별키가 필요없다. 
    • 값이 하나라도 변하면 다른 것이므로 불변 객체로 구현한다. 
  • 가능한 모든 경우에 사용하는 것이 좋다: 코드의 가독성을 높여주고, 비즈니스로직을 집중시켜준다. 초기화 또는 값을 할당하는 시점에 유효성 검사를 할 수 있다. 
    • 데이터의 속성을 표현할 때, primitive 타입 대신 밸류 오브젝트 타입을 사용하는 것이 좋다
    • 엔티티의 속성, 돈 같은 화폐 등

 

엔티티

  • 값 자체가 식별자로 동작하지 않는 데이터
    • 식별키가 필요하다
    • 식별키 자체는 유니크해야 하고, 불변해야 한다. 
  • 엔티티 자체는 도메인 모델의 구성요소가 아니다: 애그리게이트 패턴을 구성하는 요소이다. 

 

애그리게이트

애그리게이트는 단일 트랜잭션으로 엔티티들의 일관성을 보장하기 위한 설계 방법

  • 데이터의 일관성을 보장하기 위해서는 데이터를 변경할 수 있는 인터페이스를 보수적으로, 최소화해서 운영하는 것이 좋다. 애그리게이트 외부에서는 값을 읽을 수만 있고, 값을 변경하려면 반드시 애그리게이트의 퍼블릭 인터페이스(커맨드)를 거쳐야 한다. 
  • 애그리게이트의 퍼블릭 인터페이스는 유효성 검사, 비즈니스 로직 구현 등의 작업을 해야한다. 
  • 애그리게이트 패턴을 사용하면, 서비스 레이어가 단순해진다. 서비스 레이어에서 애그리게이트의 비즈니스 로직이 빠진다. 애그리게이트를 조회해서 애그리게이트에게 일을 시키는 작업 정도만 하기도 한다.

트랜잭션을 보장하기 위해 DB에서 동시성관리를 하는 지 확인해야 한다?

  • 트랜잭션 하나 당 한 개의 애그리게이트가 있어야 한다. 만약, 트랜잭션 하나 당 여러 개의 애그리게이트가 있다면 설계가 잘못되었다는 신호다. 
  • 트랜잭션 경계에 속한 비즈니스 엔티티와 밸류 오브젝트를 하나의 애그리게이트로 묶는다.
  • 어떤 엔티티들이 한 번에 변경되어야 한다면 하나의 애그리게이트 안에 있다고 본다.

외부 애그리게이트를 참조해야 하는 경우에는 Id만 갖고 있도록 구현해야 한다

  • 코드 레벨에서부터 외부 애그리게이트임을 명확히 할 수 있다. 또, 애그리게이트 내부에서 외부 애그리게이트를 실수로 변경하는 일이 없도록 한다. 

애그리게이션 루트를 통해서만 애그리게이트의 엔티티에 접근할 수 있게 한다.

  • 애그리게이션 루트: 애그리게이트에 속하는 여러 엔티티 중 하나의 엔티티
  • 데이터를 변경할 수 있는 인터페이스를 줄이기 위함이다.

도메인 이벤트를 통해서도 외부 애그리게이트와 커뮤니케이션할 수 있다.

 

각 바운디드 컨텍스트의 유비쿼터스 언어를 사용해야 한다. 

 

도메인 서비스

  • 여러 애그리게이트에 속하거나, 어디에도 속하지 않는 로직을 구현하는 객체
  • 여러 애그리게이트에 속하는 값을 받아와서 읽거나, 계산하는 등의 로직을 수행함
  • 상태를 업데이트하는 일의 작업을 하지 않기 때문에 상태가 없다. 
  • 도메인 서비스의 서비스는 서비스 레이어를 말하는 것이 아님

 

복잡성 관리

도메인 모델의 밸류 오브젝트, 애그리게이트는 자신의 퍼블릭 인터페이스를 통해서만 데이터를 수정할 수 있고, 불변이다. 

이렇게 객체를 관리함으로써 복잡한 비즈니스 로직의 복잡도를 줄일 수있다. 

 

도메인 모델 패턴은 복잡한 비즈니스 로직을 구현하는 데 쓰이므로, 핵심 하위 도메인에 적합하다. 

 

 

출처

  • 블라드 코노노프.  『도메인 주도 설계 첫걸음』. 경기 파주: 위키북스 출판, 2022

'설계' 카테고리의 다른 글

도메인 주도 설계 첫걸음 5장.  (2) 2022.09.25
도메인 주도 설계 첫걸음 1장. 2장.  (0) 2022.09.08