DDD - 비즈니스 로직 구현

오픈소스·2023년 7월 3일
0
post-thumbnail

https://product.kyobobook.co.kr/detail/S000061352142, Ch 5, 6

간단한 비즈니스 로직 구현

트랜잭션 스크립트

각 작업은 성공하거나 실패할 수 있지만, 유효하지 않은 상태를 만들면 안된다. P.65
트랜잭션 스크립트 패턴은 ETL(Extract Transform Load)처럼 단순한 비즈니스 로직을 가진 지원 하위 도메인에 적합하다. P.71
고급(복잡한) 비즈니스 로직 구현 패턴은 트랜잭션 스크립트 패턴을 기반으로 한다. P.72

액티브 레코드

이 패턴의 목적은 메모리 상의 객체를 데이터베이스 스키마에 매핑하는 복잡성을 숨기는 것이다.
영속성을 담당하는 것 외에도 액티브 레코드 객체에는 비즈니스 로직이 포함될 수 있다.
예를 들어, 필드에 할당된 새 값의 유효성을 검사하거나 객체의 데이터를 조작하는 비즈니스 관련 절차를 구현할 수 있다.
즉, 액티브 레코드 객체의 고유한 기능은 자료구조와 동작(비즈니스 로직)의 분리다.
일반적으로 액티브 레코드의 필드에는 외부 프로시저가 상태를 수저할 수 있게 하는 퍼블릭 게터(getter)와 세터(setter)가 있다. P.73

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

도메인 모델

도메인 모델 패턴은 복잡한 비즈니스 로직을 다루기 위한 것이다. CRUD 인터페이스 대신 복잡한 상태 전환, 항상 보호해야 하는 규칙인 비즈니스 규칙과 불변성을 다룬다. P.79
도메인 모델 패턴은 복잡한 비즈니스 로직을 갖는 하위 도메인에만 적용되므로 이를 소프트웨어 중심인 핵심 하위 도메인으로 가정해도 좋다.

밸류 오브젝트

밸류 오브젝트는 불변의 객체로 구현되므로 밸류 오브젝트에 있는 필드가 하나라도 바뀌면 다른 값이 생성된다. 다시 말해, 밸류 오브젝트의 필드 중 하나가 바뀌면 개념적으로 밸류 오브젝트의 다른 인스턴스가 생성된다. P.85
도메인의 특정 값을 표현하는 데 핵심 라이브러리에 포함된 문자열 타입인 String은 실제로 닷넷(.NET), 자바 등의 언어에서 정확하게 밸류 오브젝트로 구현됐다. P.86
비즈니스 도메인 관점에서 유용한 법칙은 다른 객체의 속성을 표현하는 도메인의 요소에 밸류 오브젝트를 사용하는 것이다.
적용 예로, 돈처럼 가치를 표현하는 모든 화폐가 있다. 원시 타입으로 돈을 표현하면 돈과 관련된 비즈니스 로직을 한곳에 모아 두는 것이 제한적일 뿐만 아니라 반올림 오류와 기타 정확도 관련 문제와 같은 버그가 발생하는 경우가 잦다. P.87

애그리게이트

엔티티는 밸류 오브젝트와 정반대다. 엔티티는 다른 엔티티 인스턴스와 구별하기 위해 명시적인 식별코드가 필요하다. P.87
애그리게이트는 엔티티다. 즉, 명시적인 식별 필드가 필요하고 인스턴스의 생애주기 동안 상태가 변할 것으로 예상된다.
데이터의 일관성은 애그리게이트의 비즈니스 로직을 통해서만 애그리게이트의 상태를 변경하게 해야 강화된다. 애그리게이트 외부의 모든 프로세스와 객체는 애그리게이트의 상태를 읽을 수만 있고 애그리게이트의 퍼블릭 인터페이스에 포함된 관련 메서드를 실행해야만 상태를 변형할 수 있다. P.88
애그리게이트의 상태는 자신의 비즈니스 로직을 통해서만 수정될 수 있기 때문에 애그리게이트가 트랜잭션 경계의 역할을 한다.
모든 애그리게이트 상태 변경은 원자적인 단일 오퍼레이션으로 트랜잭션 처리돼야 한다. P.92
엔티티는 독립적 패턴이 아닌 애그리게이트의 일부로서만 사용된다.
여러 객체의 변경을 원자적인 단일 트랜잭션으로 지원하기 위해 애그리게이트 패턴은 엔티티 계층 구조와 유사하게 모든 트랜잭션을 공유해서 일관성을 유지한다.
이 계층은 엔티티와 밸류 오브젝트를 모두 담고 있다. 이 요소들이 도메인의 비즈니스 로직 경계내에 있으면 동일한 애그리게이트에 속한다. P.93
애그리게이트를 가능한 한 작게 유지하고 애그리게이트의 비즈니스 로직에 따라 강력하게 일관적으로 상태를 유지할 필요가 있는 객체만 포함한다. P.95

도메인 서비스

도메인 모델에서 애그리게이트 또는 밸류 오브젝트에 속하지 않는 비즈니스 로직을 구현한 상태가 없는 객체다. P.103
한 개의 트랜잭션이 한 개의 인스턴스를 갖는 규칙은 여전히 유효하게 작용한다. 대신 도메인 서비스는 여러 애그리게이트의 데이터를 읽는 것이 필요한 계산 로직을 구현하는 것을 도와준다. P.100
복잡한 것을 불변성으로 감싸서 복잡성을 낮추는 것이다.
비즈니스 로직은 비즈니스 불변성을 감싸고 보호해서 결국 자유도를 줄인다. P.102

0개의 댓글