6장. 복잡한 비즈니스 로직 다루기
도메인 모델 패턴을 사용하여 복잡한 비즈니스 로직을 다룰 수 있다.
도메인 모델 패턴
- 비즈니스 로직에만 집중하여 복잡도를 줄인다: 비즈니스 로직 자체만으로 복잡하기 때문에, 더 복잡하게 만들면 안 된다. 비즈니스 로직 외의 것은 포함하지 않아야 한다. 예를 들어 DB 연결이나 외부 시스템 호출 등의 기술적 관심사같은 것들은 포함하지 않아야 한다.
- 코드에서 유비쿼터스 용어를 사용해야 한다: 구현하는 바운디드 컨텍스트의 유비쿼터스 용어를 사용해야 한다. 이렇게 함으로써 도메인 전문가, 개발자, 그 외 커뮤니케이션해야할 사람과 효율적으로 동기화할 수 있다.
구성요소: 밸류오브젝트, 애그리게이트, 도메인서비스
밸류 오브젝트
- 값 자체로 식별할 수 있는 데이터
- 값 자체가 식별자로서 동작하기 때문에, 식별키가 필요없다.
- 값이 하나라도 변하면 다른 것이므로 불변 객체로 구현한다.
- 가능한 모든 경우에 사용하는 것이 좋다: 코드의 가독성을 높여주고, 비즈니스로직을 집중시켜준다. 초기화 또는 값을 할당하는 시점에 유효성 검사를 할 수 있다.
- 데이터의 속성을 표현할 때, primitive 타입 대신 밸류 오브젝트 타입을 사용하는 것이 좋다
- 엔티티의 속성, 돈 같은 화폐 등
엔티티
- 값 자체가 식별자로 동작하지 않는 데이터
- 식별키가 필요하다
- 식별키 자체는 유니크해야 하고, 불변해야 한다.
- 엔티티 자체는 도메인 모델의 구성요소가 아니다: 애그리게이트 패턴을 구성하는 요소이다.
애그리게이트
애그리게이트는 단일 트랜잭션으로 엔티티들의 일관성을 보장하기 위한 설계 방법
- 데이터의 일관성을 보장하기 위해서는 데이터를 변경할 수 있는 인터페이스를 보수적으로, 최소화해서 운영하는 것이 좋다. 애그리게이트 외부에서는 값을 읽을 수만 있고, 값을 변경하려면 반드시 애그리게이트의 퍼블릭 인터페이스(커맨드)를 거쳐야 한다.
- 애그리게이트의 퍼블릭 인터페이스는 유효성 검사, 비즈니스 로직 구현 등의 작업을 해야한다.
- 애그리게이트 패턴을 사용하면, 서비스 레이어가 단순해진다. 서비스 레이어에서 애그리게이트의 비즈니스 로직이 빠진다. 애그리게이트를 조회해서 애그리게이트에게 일을 시키는 작업 정도만 하기도 한다.
트랜잭션을 보장하기 위해 DB에서 동시성관리를 하는 지 확인해야 한다?
- 트랜잭션 하나 당 한 개의 애그리게이트가 있어야 한다. 만약, 트랜잭션 하나 당 여러 개의 애그리게이트가 있다면 설계가 잘못되었다는 신호다.
- 트랜잭션 경계에 속한 비즈니스 엔티티와 밸류 오브젝트를 하나의 애그리게이트로 묶는다.
- 어떤 엔티티들이 한 번에 변경되어야 한다면 하나의 애그리게이트 안에 있다고 본다.
외부 애그리게이트를 참조해야 하는 경우에는 Id만 갖고 있도록 구현해야 한다
- 코드 레벨에서부터 외부 애그리게이트임을 명확히 할 수 있다. 또, 애그리게이트 내부에서 외부 애그리게이트를 실수로 변경하는 일이 없도록 한다.
애그리게이션 루트를 통해서만 애그리게이트의 엔티티에 접근할 수 있게 한다.
- 애그리게이션 루트: 애그리게이트에 속하는 여러 엔티티 중 하나의 엔티티
- 데이터를 변경할 수 있는 인터페이스를 줄이기 위함이다.
도메인 이벤트를 통해서도 외부 애그리게이트와 커뮤니케이션할 수 있다.
각 바운디드 컨텍스트의 유비쿼터스 언어를 사용해야 한다.
도메인 서비스
- 여러 애그리게이트에 속하거나, 어디에도 속하지 않는 로직을 구현하는 객체
- 여러 애그리게이트에 속하는 값을 받아와서 읽거나, 계산하는 등의 로직을 수행함
- 상태를 업데이트하는 일의 작업을 하지 않기 때문에 상태가 없다.
- 도메인 서비스의 서비스는 서비스 레이어를 말하는 것이 아님
복잡성 관리
도메인 모델의 밸류 오브젝트, 애그리게이트는 자신의 퍼블릭 인터페이스를 통해서만 데이터를 수정할 수 있고, 불변이다.
이렇게 객체를 관리함으로써 복잡한 비즈니스 로직의 복잡도를 줄일 수있다.
도메인 모델 패턴은 복잡한 비즈니스 로직을 구현하는 데 쓰이므로, 핵심 하위 도메인에 적합하다.
출처
- 블라드 코노노프. 『도메인 주도 설계 첫걸음』. 경기 파주: 위키북스 출판, 2022
'설계' 카테고리의 다른 글
도메인 주도 설계 첫걸음 5장. (2) | 2022.09.25 |
---|---|
도메인 주도 설계 첫걸음 1장. 2장. (0) | 2022.09.08 |