시작하기 전
현재 서비스 개발을 하는 부분에 있어서 해당 방식을 적용하려고 하는 이유가 무엇인지 알고 보는 것이 이해하는데 더욱 도움이 된다고 볼 수 있겠습니다. 어떤 서비스든 초기 버젼 개발 시에는 빠르고 간단하게 만들기 위해 개발자가 편한 대로 개발을 하는 경향이 있습니다. 이러한 프로젝트들은 Version 1 출시 까지는 무난히 운영이 될 수 있겠지만 이후 Version 2 부터는 코드를 리팩토링 하거나 새로운 기능을 추가를 한다고 하였을 때 많은 시간을 투자하게 됩니다.
이러한 상황처럼 이후 개발자들이 비효율적인 시간을 줄이고자, 실제로 적용해야 하는 서비스 들을 좀 더 세분화하고자 사용 되는 접근법이 DDD 입니다.
정의
도메인 주도 설계(Domain-Driven Design, DDD)는 소프트웨어 개발을 위한 설계 및 개발 패러다임 중 하나로, 복잡한 도메인을 이해하고 모델링 하는데 초점을 맞춘 접근법입니다. 이 접근 방식은 비즈니스 도메인과 소프트웨어 간의 강력한 결합을 강조하여 개발자, 도메인 전문가, 프로젝트 관계자 간의 소통과 협력을 촉진합니다. DDD를 사용하면 복잡한 도메인을 다루고 이해하는 데 도움이 되며, 이를 바탕으로 효과적이고 유지 보수가 용이한 소프트웨어를 개발할 수 있습니다.
이러한 접근법을 활용한다고 하여도 개발에서의 모든 문제들을 해결해 주지 않습니다. 하지만 이러한 방법을 통해 차후에 생길 문제들의 이펙트를 줄이고자 하는 것의 의의를 두는 것이 바람직하다고 생각합니다.
특징
- 기존에 많이 사용되는 데이터 주도 설계 방식이 아닌 로직에 집중하여 도메인을 설계하는 도메인 주도 설계 방식을 이용합니다.
- 해당 방식을 활용하게 되면 도메인의 활용이 다양해지고 데이터가 풍부해집니다.
- 유비쿼터스(Ubiquitos) 언어를 사용 함으로써, 다양한 분야의 전문가가 모여서 도메인에 대한 이해도와 차후에 생길 이해 충돌에 대한 코스트(Cost) 비용이 절감되는 효과를 얻을 수 있습니다.
- 소트프웨어 엔티티와 도메인 컨셉을 최대한 일치화를 시킬 수 있습니다.
- 요청자가 생각하는 요구사항을 최대한 소프트웨어에 적용하게 함으로써 달성하고자 하는 목표에 좀 더 다가 갈 수 있습니다.
- 서비스의 확장성 부분에서 유연하게 대처 할 수 있습니다.
- MSA (Micro Service Achitecture) 에 활용 되는 접근 방식으로 이후에 추가적인 요구사항이 들어와도 큰 Waste Cost가 없이 서비스를 추가 할 수 있습니다.
용어 정리
용어 | 의미 |
유비쿼터스 랭귀지 (Ubiquitous Language) |
|
도메인 (Domain) |
|
도메인 모델 (Domain Model) |
|
엔티티 (Entity) |
|
애그리게이트 (Aggregate) |
|
바운디드 컨텍스트 (Bounded Context ) |
|
컨텍스트 맵 (Context Map) |
|
전략적 접근, 전술적 접근
DDD는 크게 전략적 접근(Strategic Design)과 전술적 접근(Tactical Design)으로 구분됩니다.
- 전략적 접근 (Strategic Design): 전략적 접근은 프로젝트의 큰 그림을 이해하고 도메인 전반적인 구조를 설계하는 단계입니다. 주로 도메인의 경계, 서브도메인, 바운디드 컨텍스트 등을 정의하고 조직 전체의 비즈니스 목표와 도메인을 이해하는데 초점을 둡니다.
- 바운디드 컨텍스트 (Bounded Context): DDD에서는 도메인을 다양한 바운디드 컨텍스트로 분리합니다. 각 바운디드 컨텍스트는 자체적인 모델과 비즈니스 룰을 가지며, 이를 통해 도메인의 경계를 명확하게 정의합니다. 이렇게 하면 큰 규모의 프로젝트에서 도메인 간의 복잡한 상호작용을 간소화할 수 있습니다.
- 컨텍스트 매핑 (Context Mapping): 서로 다른 바운디드 컨텍스트 간의 상호작용을 정의하는 것을 말합니다. DDD에서는 컨텍스트 매핑을 통해 바운디드 컨텍스트 간의 인터페이스와 커뮤니케이션을 정의하여 유연하고 효과적인 시스템을 구축합니다.
- 전술적 접근 (Tactical Design): 전술적 접근은 단일 바운디드 컨텍스트 내에서 모델과 엔티티, 그리고 리포지토리 등의 구현을 다루는 단계입니다. 전략적 접근에서 정의한 바운디드 컨텍스트를 실제로 구현하고, 도메인 모델과 비즈니스 로직을 작성하는 단계입니다.
- 엔티티 (Entity): 도메인에서 식별 가능한 객체를 나타냅니다. 엔티티는 도메인에서 가장 중요한 개념 중 하나로, 유니크한 식별자를 가지고 있습니다. 이러한 엔티티들은 도메인의 핵심 비즈니스 로직을 포함하며, 도메인의 상태를 변경하거나 도메인 이벤트를 발생시키는 역할을 수행합니다.
- 리포지토리 (Repository): 엔티티를 저장하고 검색하는 인터페이스를 제공하는 패턴입니다. 리포지토리를 사용하여 엔티티의 영속성(데이터베이스에 저장)을 처리하며, 도메인 로직과 데이터베이스 접근 로직을 분리하여 도메인 모델의 의존성을 낮춥니다.
- 값 객체 (Value Object): 엔티티와 다르게 식별자를 가지지 않고, 속성으로만 구성되는 객체를 나타냅니다. 값 객체는 불변(Immutable)해야 하며, 두 개의 값 객체가 같은 속성 값을 갖으면 동등하다고 판단합니다. 주로 도메인 모델 내에서 공유되는 간단한 객체를 값 객체로 정의합니다.
전략적 접근은 프로젝트를 시작할 때 중요하며, 전술적 접근은 실제 도메인 로직을 구현할 때 중요합니다. DDD를 통해 복잡한 도메인을 명확하게 분리하고, 비즈니스 요구사항을 잘 반영하는 유지보수 용이한 시스템을 구축할 수 있습니다.
순서
'CS 지식 > 방법론' 카테고리의 다른 글
Mockist vs Classicist (1) | 2023.08.22 |
---|---|
Agile (0) | 2023.07.12 |