DDD란 무엇입니까? (도메인 주도 설계)
도메인 기반 디자인 개발입니다.
도메인이란?
소프트웨어로 해결해야 할 객체
도메인 모델은 도메인의 개념적 표현입니다.
주로 클래스 다이어그램이나 상태 다이어그램으로 표현할 수 있습니다.
도메인 모델은 인프라 계층(OS, DB 등) 또는 프레젠테이션 계층(HTML, HTTP 등)에 대한 종속성 없이 순수한 비즈니스 요구 사항만 표현할 수 있습니다.
도메인 모델을 잘 표현하기 위해서는 기존의 코딩을 피해야 합니다.
공용 set/get 메서드 추가와 같은 작업.
실체와 가치
엔터티는 고유한 식별자를 가짐으로써 엔터티를 구분할 수 있는 모델입니다.
값은 데이터 묶음이며 식별자가 없습니다. 값 유형은 변경할 수 없도록 구현되어야 합니다. 참조 투명성과 스레드 안전성이 안정적인 코드를 만들기 때문입니다.
여기서 DB의 PK 개념과 구별되어야 한다. DB에 PK가 있다고 해서 엔티티가 되는 것은 아닙니다. 스토리지에 필요한 개념일 뿐 도메인 모델을 구분하기 위한 것이 아니기 때문입니다. 물론 도메인은 중요하지 않습니다.
골재
서로 관련된 도메인 모델 집합입니다.
도메인이 커짐에 따라 엔터티와 값의 수도 증가합니다. 이러한 집계는 내부 구현을 숨기고 더 높은 수준에서 모델을 볼 수 있도록 하여 더 쉽게 이해하고 관리할 수 있도록 합니다.
대부분의 경우 집계는 엔터티와 여러 값으로 구성됩니다. 따라서 모든 집계에는 집계 루트라는 도메인 엔터티가 있습니다. 집계에 속하는 개체를 수정하고 도메인 규칙에 따라 집계 내 모든 도메인 모델의 일관성을 항상 유지 관리할 책임이 있습니다.
애그리게이터는 도메인을 DB에 저장하거나 읽어오는 개체입니다. 따라서 읽을 때 집계 루트 ID를 사용하십시오.
집계 및 트랜잭션
트랜잭션에서 둘 이상의 집계자를 변경하면 성능이 저하됩니다.
이는 하나의 집계가 다른 집계를 변경하지 않아야 함을 의미합니다. (결합도가 높아집니다.)
이벤트 또는 비동기를 사용하여 결합을 줄임으로써 이를 방지할 수 있습니다.
집계 참조
집계가 다른 집계를 참조하는 경우
개체 그래프를 통과하는 것은 쉽습니다. (다른 집계를 쉽게 변경할 수 있습니다.)
성능에 영향을 미칠 수 있습니다. (게으른 로딩/즉시 로딩이 필요합니다.)
해결책은 DB의 필드 값이 아닌 엔터티의 ID 값을 사용하여 집계를 간접적으로 참조하는 것입니다.
그러나 N+1 문제가 발생하기 때문에 JPQL에서 조인 쿼리를 별도로 빌드해야 한다.
저장소
이 모델은 도메인 모델의 지속성을 위해 필요합니다.