DDD (Domain-Driven Design, 도메인 주도 설계)
- 비즈니스 도메인과 로직을 중심으로 설계하는 방식
- 현업과 개발자 간의 쌍방향 커뮤니케이션을 중요시함
→ 상호 간에 이해할 수 있는 보편적인 (Ubiquitous) 언어 사용
↔ 데이터 주도 설계
- 객체가 가져야 할 데이터에 초점을 두고 설계하는 방식
주요 개념
1) 도메인 (Domain)
- 소프트웨어가 해결하고자 하는 문제 영역
2) 유비쿼터스 언어 (Ubiquitous Language)
- 협업과 개발자 간의 원활한 의사소통을 위해 사용하는 공통 언어
- 코드와 문서에서 동일한 용어를 사용하는 것
- 도메인 모델에 대한 이해를 바탕으로 설계할 수 있도록 도움
3) 바운디드 컨텍스트 (Bounded Context)
- 도메인을 명확하게 이해하기 위해 도메인의 특정 구역을 정의함
→ 각 도메인은 독립적으로 운영될 수 있으며, 서로 다른 모델을 가질 수 있음
ex) 전자상거래 시스템은 주문 관리, 상품 관리, 고객 관리 등 여러 도메인으로 나눌 수 있음
- 특정 도메인 내에서만 유효한 모델을 정의함
ex) 주문 관리 컨텍스트에서의 '주문'과 고객 관리 컨텍스트에서의 '주문'은 다르게 정의될 수 있음
- 서로 다른 바운디드 컨텍스트는 각각 독립적으로 존재하며, 필요에 따라 상호작용할 수 있음
ex) 주문 관리 시스템이 고객 관리 시스템에 고객 정보를 요청함
- 바운디드 컨텍스트 내에서 모델은 일관된 의미를 가짐
4) 컨텍스트 맵 (Context Map)
- 바운디드 컨텍스트 간의 관계
5) 엔티티 (Entity)
- 고유한 식별자를 가진 도메인 객체
- 상태가 변해도 동일성을 유지함
ex) 고객
6) 값 객체 (Value Object)
- 고유한 식별자가 없고, 속성 값으로만 정의되는 객체
- 불변함 (Immutable)
- 두 값 객체가 동일한 속성을 가지면 동일한 것이라고 간주됨
ex) 주소
7) 애그리거트 (Aggregate)
- 관련된 엔티티와 값 객체의 집합
- 특정 도메인 개념을 이루는 객체들을 하나의 그룹으로 묶어 단위로 처리함
- 외부에서 접근할 때는 이 그룹의 '애그리거트 루트'로만 접근할 수 있도록 제한함
→ 일관성 유지 / 데이터 무결성 보장
ex) 주문 - 애그리거트
상품 - 애그리거트 내 엔티티
→ 각각 고유 식별자를 가지며, 주문 안에서 여러 상품이 포함될 수 있음
배송 주소 - 애그리거트 내 값 객체
→ 고유 식별자가 없으며, 주문에 따라 주소 값이 변경될 수 있음
주문 - 애그리게잇 루트
→ 주문 자체가 루트로 동작하며, 외부에서는 주문을 통해서만 상품에 접근할 수 있음
8) 리포지토리 (Repository)
- 애그리거트를 DB에 저장하고 조회하는 역할
- 도메인 객체의 집합을 조작할 수 있도록 하는 인터페이스
→ 도메인 레이어는 DB 구현 방식에 대해 알 필요 없이 리포지토리를 통해 데이터에 접근할 수 있음
9) 도메인 이벤트
- 도메인 내에서 발생한 중요한 사건
- 시스템의 상태 변화에 대한 정보를 제공함
레이어드 아키텍처 (Layered Architecture)
- 소프트웨어 시스템을 여러 개의 레이어로 나누어, 각 레이어가 특정한 책임을 갖도록 설계하는 구조
→ 코드의 모듈화 / 유지보수성 UP / 확장성 UP / 단위 테스트 및 통합 테스트 용이
도메인 레이어 (Domain Layer)
- 시스템의 핵심 비즈니스 로직과 규칙을 담고 있는 레이어
- 비즈니스 규칙과 정책을 다루는 핵심 레이어
[구성요소]
i. 엔티티 (Entity)
ii. 값 객체
iii. 애그리거트
iv. 도메인 서비스
: 특정 비즈니스 로직을 수행하지만, 엔티티나 값 객체에 속하지 않는 서비스
애플리케이션 레이어 (Application Layer)
- 애플리케이션의 흐름과 사용자의 요청을 처리하는 레이어
- 사용자에게 제공해야 할 기능을 구현함
- 비즈니스 로직을 직접 포함하지 않음
- 도메인 레이어의 기능을 이용해 애플리케이션의 주요 동작을 조정함
- 유스케이스와 비즈니스 작업 흐름을 조정함
[구성요소]
i. 유스케이스 (Use Case)
: 사용자의 요구사항을 충족하기 위해 도메인 레이어의 기능을 조합하여 수행하는 작업
· 각 유스케이스는 애플리케이션의 특정 동작을 나타냄
ii. 서비스 (Application Service)
· 유스케이스를 구현함
· 도메인 모델에 대한 조작을 수행함
프레젠테이션 레이어 (Presentation Layer, 인터페이스 레이어)
- 사용자 인터페이스와 애플리케이션 간의 상호작용을 처리하는 레이어
: 사용자의 요청을 받아 애플리케이션 레이어의 처리 결과를 다시 사용자에게 보여줌
[구성요소]
i. UI 컴포넌트
: 웹 페이지, 버튼, 폼 등의 시각적 요소
ii. API 엔드포인트
: 인터페이스를 통해 클라이언트와 서버 간의 데이터 통신을 처리함
iii. 뷰 모델 or 프레젠터
: UI의 상태를 관리하고, 데이터의 변환/포맷을 담당하는 객체
인프라스트럭처 레이어 (Infrastructure Layer)
- 외부 시스템과의 통신을 담당하는 레이어 (DB, 파일 시스템 등)
[구성요소]
i. 리포지토리 (Repository)
: 도메인 객체를 DB에 저장/조회하는 인터페이스
· 도메인 레이어는 리포지토리를 통해 데이터에 접근할 수 있음
→ 도메인 레이어가 특정 데이터 소스에 의존하지 않도록 분리하는 역할
ii. 외부 시스템과의 통합
# 레이어 간의 상호작용
- 프레젠테이션 레이어 → 애플리케이션 레이어를 호출하여 사용자의 요청을 처리함
- 애플리케이션 레이어 → 도메인 레이어의 기능을 활용하여 비즈니스 로직을 수행함
- 도메인 레이어 → 인프라스트럭처 레이어를 통해 데이터에 접근하거나 외부 시스템과 상호작용함
'CS' 카테고리의 다른 글
[CS] 호스팅 (Hosting) (1) | 2024.11.17 |
---|---|
[CS] 인터넷 (Internet) (5) | 2024.11.16 |
[CS] 리눅스 관련 (0) | 2023.10.06 |
[CS] 사용자 권한 (0) | 2023.10.06 |
[CS] 라이브러리와 프레임워크 (0) | 2023.07.11 |