본문 바로가기

아키텍처

[도메인 주도 설계] 도메인 주도 설계(DDD, Domain-Driven Design)란 무엇인가?

728x90
반응형

도메인 주도 설계(DDD, Domain-Driven Design)는 소프트웨어 개발 방법론의 하나로, 복잡한 소프트웨어 시스템을 개발할 때 도메인 지식을 중심으로 설계하는 접근법입니다. 이 방법론은 에릭 에반스(Eric Evans)가 그의 책 "Domain-Driven Design: Tackling Complexity in the Heart of Software"에서 소개하였으며, 소프트웨어 개발 팀과 도메인 전문가들이 긴밀하게 협력하여 도메인 모델을 구축하고 이를 코드에 반영하는 것을 목표로 합니다.

https://huisam.tistory.com/entry/DDD

도메인 주도 설계의 주요 개념

https://huisam.tistory.com/entry/DDD

  1. 도메인(Domain): 소프트웨어가 해결하고자 하는 문제 영역입니다. 예를 들어, 은행 시스템의 경우 은행 업무 자체가 도메인이 됩니다.
  2. 도메인 모델(Domain Model): 도메인의 개념과 규칙을 반영한 소프트웨어 모델입니다. 이는 도메인 전문가와 개발자가 협력하여 도메인을 정확하게 이해하고 이를 코드로 표현한 것입니다.
  3. 유비쿼터스 언어(Ubiquitous Language): 도메인 전문가와 개발자 간의 의사소통을 원활하게 하기 위해 사용하는 공통 언어입니다. 이는 도메인 모델을 기반으로 하여 개발 과정 전반에 걸쳐 사용됩니다.
  4. 엔터티(Entity): 고유한 식별자를 가지며, 지속적으로 변할 수 있는 객체입니다. 예를 들어, 은행 계좌(Account)는 고유한 계좌 번호를 가지는 엔터티입니다.
  5. 밸류 오브젝트(Value Object): 고유한 식별자를 가지지 않으며, 불변 객체로 사용하는 값입니다. 예를 들어, 화폐(Money)는 금액과 통화를 가지는 밸류 오브젝트가 될 수 있습니다.
  6. 애그리게잇(Aggregate): 관련된 엔터티와 밸류 오브젝트의 집합으로, 일관성을 유지하기 위한 경계를 설정합니다. 애그리게잇 루트(Aggregate Root)는 이 경계 내에서 일관성을 유지하는 책임을 지는 객체입니다.
  7. 리포지토리(Repository): 엔터티와 애그리게잇을 저장하고 검색하는 인터페이스를 제공합니다. 이는 데이터베이스와의 상호작용을 추상화합니다.

도메인 주도 설계의 단계

  1. 도메인 이해: 도메인 전문가와 긴밀히 협력하여 도메인을 깊이 이해합니다.
  2. 유비쿼터스 언어 개발: 도메인 모델을 기반으로 개발자와 도메인 전문가가 공통으로 사용할 언어를 정의합니다.
  3. 도메인 모델 설계: 엔터티, 밸류 오브젝트, 애그리게잇 등을 식별하고 설계합니다.
  4. 바운디드 컨텍스트 정의: 각 도메인의 경계를 정의하고, 모델의 일관성을 유지할 수 있는 컨텍스트를 설정합니다.
  5. 코딩 및 테스트: 도메인 모델을 코드로 구현하고, 지속적인 테스트와 피드백을 통해 개선합니다.

예시

은행 시스템을 예로 들어보겠습니다.

  1. 도메인: 은행 시스템
  2. 도메인 모델:
    • 엔터티: Account (계좌)
    • 밸류 오브젝트: Money (화폐)
    • 애그리게잇: Account는 애그리게잇 루트이며, 관련된 거래(Transaction)를 포함할 수 있습니다.
  3. 유비쿼터스 언어:
    • "입금" (Deposit), "출금" (Withdraw), "잔액 조회" (Check Balance)
  4. 코드
class Money:
    def __init__(self, amount, currency):
        self.amount = amount
        self.currency = currency

class Account:
    def __init__(self, account_number):
        self.account_number = account_number
        self.balance = Money(0, "USD")

    def deposit(self, amount):
        self.balance.amount += amount

    def withdraw(self, amount):
        if self.balance.amount >= amount:
            self.balance.amount -= amount
        else:
            raise ValueError("Insufficient funds")

    def check_balance(self):
        return self.balance.amount

이 예시는 매우 단순화된 형태지만, 도메인 모델을 중심으로 소프트웨어를 설계하는 방법을 보여줍니다. 도메인 주도 설계는 이렇게 도메인 전문가와 개발자가 협력하여 정확하고 일관된 도메인 모델을 구축하고, 이를 코드로 구현함으로써 복잡한 소프트웨어 시스템을 효과적으로 개발할 수 있도록 합니다.

도메인 주도 설계의 주요 목적

도메인 주도 설계(DDD, Domain-Driven Design)의 주요 목적은 복잡한 소프트웨어 시스템을 설계하고 개발하는 과정에서 도메인 지식을 중심으로 한 모델을 구축함으로써, 시스템의 일관성, 유연성, 유지보수성을 높이는 것입니다. 이를 통해 도메인 전문가와 개발자 간의 원활한 의사소통을 촉진하고, 비즈니스 요구사항을 정확하게 반영하는 소프트웨어를 만들 수 있습니다.

1. 도메인 지식의 반영

설명

도메인 전문가의 지식을 소프트웨어에 정확히 반영하여, 시스템이 해결하려는 문제를 깊이 이해하고 해결할 수 있도록 합니다. 도메인 지식을 코드에 직접적으로 반영함으로써, 비즈니스 로직의 일관성과 정확성을 보장합니다.

예시

은행 시스템에서 "계좌"와 "거래" 개념을 명확히 정의하고, 이를 코드로 구현함으로써 비즈니스 요구사항을 충실히 반영합니다.

2. 유비쿼터스 언어 사용

설명

도메인 전문가와 개발자가 공통으로 사용하는 언어를 정의하여, 의사소통의 혼선을 줄이고, 도메인 모델에 대한 일관된 이해를 도모합니다. 유비쿼터스 언어는 도메인 모델링 과정 전반에 걸쳐 사용됩니다.

예시

"입금", "출금", "잔액 조회" 등의 용어를 도메인 전문가와 개발자 모두가 동일하게 이해하고 사용하도록 합니다.

3. 모델의 일관성 유지

설명

도메인 모델의 일관성을 유지하기 위해 애그리게잇, 엔터티, 밸류 오브젝트 등의 개념을 도입합니다. 이를 통해 모델의 무결성과 일관성을 보장합니다.

예시

"계좌(Account)"는 애그리게잇 루트로서, 모든 거래(Transaction)는 이 계좌를 통해 이루어지도록 하여 일관성을 유지합니다.

4. 유지보수성 및 확장성 향상

설명

도메인 주도 설계는 잘 정의된 모델을 기반으로 코드를 구조화하여, 유지보수와 확장이 용이하도록 합니다. 코드의 변경이 도메인 모델을 중심으로 이루어지기 때문에, 시스템의 확장과 수정이 더 쉬워집니다.

예시

새로운 기능 추가 시, 기존 도메인 모델을 확장하거나 새로운 애그리게잇을 추가함으로써 쉽게 확장할 수 있습니다.

5. 바운디드 컨텍스트의 도입

설명

도메인의 경계를 명확히 정의하여, 각 바운디드 컨텍스트 내에서 모델의 일관성을 유지하고, 다른 컨텍스트와의 통합을 명확히 합니다. 이는 복잡한 시스템을 보다 효율적으로 관리하고 통합할 수 있도록 돕습니다.

예시

은행 시스템에서 "계좌 관리"와 "대출 관리"를 각각 별도의 바운디드 컨텍스트로 정의하여, 각 컨텍스트 내에서 모델의 일관성을 유지하고, 필요 시 명확한 인터페이스를 통해 통합합니다.

6. 비즈니스 로직의 명확한 표현

설명

도메인 모델을 통해 비즈니스 로직을 명확하게 표현하여, 코드가 비즈니스 요구사항을 그대로 반영할 수 있도록 합니다. 이는 비즈니스 요구사항의 변경이 코드에 쉽게 반영될 수 있도록 도와줍니다.

예시

"출금" 시 계좌의 잔액을 확인하고, 부족할 경우 예외를 발생시키는 로직을 도메인 모델에 명확히 정의합니다.

종합적으로

도메인 주도 설계의 주요 목적은 도메인 지식을 기반으로 한 모델을 통해 소프트웨어의 일관성, 유지보수성, 유연성을 높이는 것입니다. 이를 통해 개발팀은 도메인 전문가와 효과적으로 협력하고, 복잡한 비즈니스 요구사항을 충실히 반영하는 고품질의 소프트웨어를 개발할 수 있습니다.

728x90
반응형