Introduce

1. 원리

  • 도메인을 이해하고 모델링하는 데 중점을 둔 아키텍쳐 접근 방식
  • 비즈니스 도메인과 일치시켜 실제 문제를 더 잘 표현하고 시스템의 요구 삿항을 더 명확하게 이해하는 것을 목표로 한다.

2. Ubiquitous Language

  • DDD의 기본 원칙이다.
  • 개발 팀 - 도메인 전문가 간의 공통 언어의 필요성을 강조
  • 기술 도메인과 비즈니스 도메인 간의 격차를 해소하며, 소프트웨어가 실제 비즈니스 프로세스를 정확하게 반영하도록 하는 데 도움이 된다.

3. 역할

3.1. 도메인

  • 해결하고자 하는 문제 영역이라고 볼 수 있다.
  • 도메인은 다시 하위 도메인으로 이뤄질 수 있다.

3.1.1. 엔티티

  • 수명 주기가 있고 시간이 지남에 따라 변경될 수 있는 고유한 ID를 가진 객체를 나타낸다.
  • 엔티티는 정체성으로 구별되며 자체 상태와 동작을 유지할 책임이 있다.
  • 엔티티는 종종 도메인 모델 내에서 가장 복잡한 객체
  • 엔티티는 개발 객체에 특정한 비즈니스 규칙과 로직을 캡슐화

3.1.2. 값 객체

  • 값 객체는 ID가 아닌 속성 값으로 정의되는 객체
  • 개념적 정체성이 없으며 불변
  • 값 객체는 전체로 취급되고 속성을 기반으로 비교할 수 있는 개념을 캡슐화하는 데 사용

3.1.3. 레포지토리

  • 지속성에 구애받지 않고 도메인 객체에 액세스하고 저장할 수 있는 방법을 제공
  • 레포지토리는 도메인 모델과 데이터 지속성 계층 사이의 다리 역할을 하며, 데이터 액세스의 세부 사항을 추상화하고 다양한 데이터 저장 기술을 사용할 수 있게 해준다.

3.1.4. 도메인 서비스

  • 특정 엔티티나 값 객체에 속하지 않는 작업 또는 동작
  • 서비스는 그 자체로 도메인 개념이지만 엔티티나 값 객체에 자연스럽게 들어맞지 않는 작업을 나타낸다.
  • 복잡한 비즈니스 로직을 캡슐화

3.2. 애그리거트

  • 데이터 변경 및 일관성을 위해 단일 단위로 취급되는 도메인 객체의 클러스터
  • 트랜잭션 일관성 경계를 나타낸다.
  • 애그리거트에 대한 모든 변경이 함께 수행되도록 보장
  • 비즈니스 규칙을 적용하고 해당 경계 내에서 데이터의 무결성을 유지하는 역할을 담당
  • 도메인 로직을 캡슐화하고 도메인 모델과 상호 작용하기 위한 명확한 진입점

3.3. 바운디드 컨텍스트

  • 애플리케이션의 여러 부분이 특정 컨텍스트에 따라 서로 다른 모델과 용어를 가질 수 있음을 의미한다.
  • 예를 들면
    • member에서 user -> 회원
    • order에서 user -> 주문자
    • review에서 user -> 작성자
  • 바운디드 컨텍스트는 특정 모델이 적용된는 전체 시스템의 독립된 부분

3.4. 도메인 이벤트

  • 느슨한 결합을 가능하게 하고 시스템의 여러 부분 간의 비동기 통신을 위한 메커니즘을 제공
  • 도메인 이벤트는 도메인 내에서 발생하여 시스템의 다른 부분에서 관심을 가질 만한 중요한 일을 나타낸다.
  • 도메인 모델의 필수적인 부분
  • 다른 애그리거트에서 변경을 트리거하거나 경계가 있는 컨텍스트에서 데이터를 동기화하는 데 사용할 수 있다.

4. 기여

4.1. 엔티티

  • 도메인 내 실제 객체의 동작과 상태를 캡쳐
  • 도메인 객체를 엔티티로 모델링함으로써 동일한 ID를 가진 객체가 일관되게 취급되고 시간에 지남에 따라 진화할 수 있도록 보장
  • 개발 객체에 특정한 비즈니스 규칙과 로직을 캡슐화

4.2. 값 객체

  • 값 객체는 전체로 취급되고 불변하는 복잡한 개념을 표현하는 데 도움이 된다.
  • 값 객체로 primitive와 더불어 더 풍부하게 도메인을 표현할 수 있다.

4.3. 애그리거트

  • 인테테와 값 객체를 함께 그룹화하여 도메인 모델의 일관성과 무결성을 보장
  • 비즈니스 규칙을 적용한다.
  • 애그리거트의 내부 상태를 보호한다.
  • 트랜잭션 일관성을 위한 명확한 경계를 제공
  • 깔끔하고 구조화된 도메인 모델을 유지하는 데 도움

4.4. 바운디드 컨텍스트

  • 크고 복잡한 도메인을 더 작고 관리하기 쉬운 부분으로 분해하는 데 도움이 된다.
  • 전체 시스템 내에서 특정 도메인에 집중할 수 있으며, 각 컨텍스트 내에서 언어, 모델 및 개념이 일관성을 유지할 수 있다.

4.5. 레포지토리

  • 도메인 모델과 데이터 persistence 계층 사이의 간극을 메워준다.

4.6. 서비스

  • 특정 엔티티나 값 객체에 속하지 않은 복잡한 비즈니스 로직이나 작업을 캡슐화한다.
  • 도메인 내에서 더 높은 수준의 동작을 모델링하고 표현할 수 있는 방젖을 제공한다.