해당 게시글은 내용 정리 목적으로 작성되었습니다. 틀린 내용이 있다면 언제든지 말씀해 주세요
도메인 주도 설계 (Domain Driven Design)
기존에는 프로젝트 설계 및 개발 시 도메인 전문가와 상의하지 않고 기능 구현에 초점을 두었다.
그리고 고객의 요구사항은 개발 중간에 자주 변경되고, 개발이 완료돼도 결과물을 받은 고객들이 만족하지 못하는 경우가 많았다.
이는 프로젝트의 실패로 이어질 수 있다.
이러한 문제가 발생하는 이유는 프로젝트 이해관계자들이 도메인을 제대로 파악하지 못한채 기능 구현에 몰입했기 때문이다.
이를 해결하기 위해 고안된 방법론이 도메인 주도 설계이다.
도메인 주도 설계는 도메인 전문가와 상의해서 비즈니스 영역을 파악하고 도메인 모델을 중심으로 설계하는 기법이다.
여기서 중요한 것은 도메인 주도 설계에 참가하는 이해관계자들이 모두 도메인 전문가 수준의 이해도가 바탕이 되어야하는 점이다.
설계 단계에서 도메인 전문가가 참여하고 의사소통을 통해 개발자와 도메인 전문가가 모두 이해할 수 있는 도메인 모델을 만들어야 한다.
초기에 도메인 모델을 잘 설계하려면 도메인 전문가와 이해관계자들이 모여서 이벤트 스토밍을 진행해야한다.
이벤트 스토밍을 통해서 도메인, 어그리거트, 바운디드 컨텍스트, 도메인 간 협력 등 전략적 설계에 필요한 문서들이 도출된다.
도메인 (Domain)
- 도메인이란 소프트웨어로 해결하고자하는 비즈니스 영역을 의미한다.
- 하나의 도메인은 여러 하위 도메인으로 분리 될 수 있다.
- 객실 예약 서비스라는 도메인이 있다면 이는 객실, 객실 예약, 회원, 결제 등 작은 단위의 비즈니스 영역인 하위 도메인으로 나뉘어질 수 있다.
- 도메인은 엔티티, 값 객체, 어그리거트, 레파지토리, 도메인 서비스, 팩토리, 명세로 나뉘어 질 수 있다.
엔티티 (Entity)
- 시스템에서 고유한 식별자(ID)를 가지고 있으며, 그 식별자를 통해 동일성을 판단할 수 있는 객체다.
- 상태와 동작을 모두 가질 수 있으며, 속성이 변하더라도 동일한 ID라면 같은 엔티티로 간주된다.
값 객체(Value Object)
- 값 객체는 한번 생성되면 값을 수정할 수 없는 불변성을 가지며 속성 자체로 동일성을 판단한다.
- 주로 엔티티의 속성을 표현할 때 사용한다.
어그리거트(Aggregate)
- 어그리거트는 연관된 엔티티와 값 객체를 하나의 그룹으로 묶은 집합이다.
- 루트 엔티티(Aggregate Root)를 통해서만 접근할 수 있고, 어그리거트 내부 상태는 루트 엔티티를 통해 관리된다.
- 어그리거트 내에 엔티티 혹은 값 객체는 동일한 생명주기(생성, 삭제)를 가져야하며 모든 작업 (등록, 수정, 삭제, 조회)은 루트 어그리거트를 통해서 수행되어야 한다. (작업의 일관성)
레포지토리 (Repository)
- 레파지토리는 어그리거트를 저장하고 조회하는 책임을 가지는 객체이다.
- 데이터베이스와 도메인 계층 간의 중재자 역할을 하고, 엔티티나 어그리거트가 도메인 로직에 집중할 수 있도록 데이터 접근 로직을 분리한다.
도메인 서비스(Domain Service)
- 도메인 서비스는 특정 도메인 로직이 하나의 엔티티에 표현하기 어려울 때 사용된다.
- 상태를 가지지 않으며, 순수하게 도메인 로직을 구현한다
팩토리(Factory)
- 복잡한 객체나 어그리거트를 생성하는 책임을 가지는 객체이다.
- 도메인 객체를 생성하는 로직을 캡슐화하여 클라이언트 코드의 단순화를 돕는다
명세 (Specification)
- 명세는 비즈니스 규칙을 캡슐화하여 복잡한 조건을 재사용 가능하고 테스트하기 쉬운 방식으로 표현한다.
- 조건을 객체로 추상화하여 코드 중복을 줄이고, 가독성을 높일 수 있다.
- 엔티티가 특정 조건을 만족하는지 확인할 때 사용된다.
도메인 모델 (Domain Model)
- 도메인 모델링은 특정 도메인의 개념, 규칙, 관계, 그리고 동작을 추상화하여 소프트웨어 설계에 반영하는 작업이다.