본문 바로가기
코딩취미/프로그램 지식

클린 아키텍처 기반 프로젝트 vs 도메인 주도 설계(DDD) 기반 프로젝트 특징 비교 정리

by 브링블링 2024. 3. 21.
반응형

클린 아키텍처 기반 프로젝트 vs 도메인 주도 설계(DDD) 기반 프로젝트 특징 

클린 아키텍처와 도메인 주도 설계(DDD)는 모두 복잡한 소프트웨어 시스템의 설계와 구현을 개선하기 위해 고안된 방법론입니다. 각각의 접근 방식은 소프트웨어 개발에 있어서 중요한 원칙과 구조를 제공하지만, 그 목적과 초점에는 명확한 차이점이 존재합니다. 클린 아키텍처와 DDD는 서로 보완적인 요소를 가지고 있으며, 종종 함께 사용되어 소프트웨어의 설계와 개발을 강화할 수 있습니다. 선택하는 방법론은 프로젝트의 특성, 팀의 경험, 그리고 비즈니스 요구사항에 따라 달라질 수 있습니다.

[ 요약 ]

클린 아키텍처 기반 프로젝트

  • 목적과 목표: 소프트웨어의 독립성을 최대화하여, 프레임워크, UI, 데이터베이스, 외부 애플리케이션 등의 변경이 핵심 비즈니스 로직에 미치는 영향을 최소화하는 데 중점을 둡니다.
  • 특징:
    • 계층화된 구조를 통해 내부 로직과 외부 인프라를 분리합니다.
    • 테스트 가능성과 유지보수성을 높이기 위해 설계됩니다.
    • 의존성 규칙을 통해, 의존성은 항상 내부 방향으로만 흐릅니다.

도메인 주도 설계(DDD) 기반 프로젝트

  • 목적과 목표: 복잡한 도메인 로직을 관리하고, 비즈니스 요구사항을 효과적으로 소프트웨어에 반영하기 위한 모델을 개발하는 데 중점을 둡니다.
  • 특징:
    • 도메인 모델을 중심으로 소프트웨어를 설계하고 개발합니다.
    • 바운디드 컨텍스트를 통해 복잡한 시스템을 논리적으로 분할합니다.
    • 핵심 비즈니스 로직의 구현과 표현을 명확하게 분리합니다.
특성/차이점 클린 아키텍처 도메인 주도 설계(DDD)
목적 프레임워크와 인프라의 독립성 보장 복잡한 도메인 로직의 효과적 관리
구조적 특징 계층화된 구조로 내부와 외부 분리 도메인 중심의 모델링과 구현
핵심 요소 내부 계층(엔티티, 유즈 케이스)와 외부 계층(인터페이스 어댑터, 프레임워크 및 드라이버) 바운디드 컨텍스트, 에그리거트, 도메인 이벤트, 도메인 서비스
응용 프로그램 로직 애플리케이션 계층에서 중앙 집중적으로 관리 도메인 계층에서 광범위하게 분산하여 관리
테스트 용이성 계층 분리를 통한 테스트 용이성 강조 복잡한 도메인 로직의 단위 테스트에 초점
유지보수 및 확장성 독립적인 계층 구조로 인한 유지보수 및 확장성 우수 도메인 모델의 명확한 정의로 유지보수 및 확장성 향상
적합한 프로젝트 유형 규모와 관계없이 다양한 유형의 소프트웨어 프로젝트 비즈니스 로직의 복잡성이 높은 소프트웨어 프로젝트
반응형

[ 상세정보 ]

1. 클린 아키텍처 기반 프로젝트

 

클린 아키텍처(Clean Architecture)는 로버트 C. 마틴(Robert C. Martin, Uncle Bob)이 제안한 소프트웨어 설계 원칙으로, 2012년경 소개되었습니다. 이 아키텍처는 소프트웨어 개발에서 유지보수성, 확장성, 독립성을 향상시키기 위해 고안되었습니다. 클린 아키텍처는 이전의 여러 소프트웨어 아키텍처 패턴(예: 육각형 아키텍처, 어니언 아키텍처)의 개념을 통합, 발전시킨 것으로 볼 수 있습니다.

목적과 목표

목적은 소프트웨어 시스템을 보다 유연하고, 테스트 가능하며, 독립적인 배포가 가능하도록 설계하는 데 있습니다. 목표는 다음과 같습니다:

  • 프레임워크에 의존하지 않는 시스템 구축
  • UI, 데이터베이스, 외부 에이전시 등의 변경이 로직에 미치는 영향 최소화
  • 비즈니스 로직과 사용자 인터페이스의 분리
  • 시스템의 구성 요소 간의 독립성 확보

특징

  • 독립적인 프레임워크: 시스템이 특정 프레임워크에 의존하지 않아야 함.
  • 테스트 용이성: 비즈니스 규칙을 쉽게 테스트할 수 있어야 함.
  • UI와 DB의 독립성: UI나 데이터베이스의 변경이 비즈니스 규칙에 영향을 미치지 않아야 함.
  • 내부와 외부의 분리: 핵심 비즈니스 로직을 중심으로 외부 요소(UI, DB 등)와 분리.

장단점

장점:

  • 유연성 및 유지보수성 향상: 핵심 로직과 인프라스트럭처의 분리로 인해, 시스템의 변경이 용이함.
  • 독립적인 개발 및 배포 가능: 각 계층을 독립적으로 개발하고, 필요에 따라 교체 및 배포가 가능.
  • 테스트 용이성: 핵심 로직이 외부 요소로부터 독립되어 있어, 단위 테스트가 용이함.

단점:

  • 구현 복잡성: 여러 계층과 규칙을 관리해야 하므로, 초기 구현 복잡성이 증가.
  • 학습 곡선: 클린 아키텍처의 원칙과 구조를 이해하고 적용하기까지 학습이 필요함.
  • 과도한 분리: 작은 프로젝트의 경우, 계층 분리가 과도하게 느껴질 수 있음.

실제 사례 및 예시

사례: 금융 기술 애플리케이션, 건강 관리 시스템, 대규모 엔터프라이즈 소프트웨어 등 비즈니스 로직과 인프라스트럭처가 명확히 분리되어야 하는 복잡한 시스템에서 널리 적용됩니다.

clean_architecture_example/
├── domain/  # 핵심 비즈니스 로직과 엔티티
│   ├── model/
│   └── service/
├── application/  # 유즈케이스 및 애플리케이션 로직
│   ├── use_case/
│   └── interface/
├── infrastructure/  # 외부 인프라스트럭처(데이터베이스, 웹 서비스)
│   ├── repository/
│   └── api/
└── ui/  # 사용자 인터페이스
    ├── web/
    └── mobile/
특성/장단점 설명
유연성 및 유지보수성 핵심 비즈니스 로직과 인프라스트럭처의 분리로 인해 시스템 변경 용이
독립적인 개발/배포 계층의 독립성으로 인해 각 부분을 독립적으로 개발 및 배포 가능
테스트 용이성 핵심 로직의 외부 요소 독립으로 단위 테스트가 용이
구현 복잡성 계층 및 규칙 관리로 초기 구현 복잡성 증가
학습 곡선 클린 아키텍처의 원칙과 구조 이해에 시간 소요
과도한 분리 작은 프로젝트에서 계층

 

2. 도메인 주도 설계(DDD) 

도메인 주도 설계(DDD)는 에릭 에반스(Eric Evans)가 2003년에 출간한 "Domain-Driven Design: Tackling Complexity in the Heart of Software"라는 책을 통해 처음 소개되었습니다. 이 방법론은 복잡한 소프트웨어 시스템의 개발 과정에서 도메인(비즈니스 요구사항과 프로세스)을 중심으로 설계와 구현을 진행하는 것을 강조합니다. DDD는 개발자와 도메인 전문가 간의 커뮤니케이션을 통해 복잡성을 관리하고, 프로젝트의 성공을 이끌어내기 위한 접근 방식을 제시합니다.

목적과 목표

복잡한 소프트웨어 시스템에서 비즈니스 요구사항의 복잡성을 이해하고 모델링하여, 효과적인 소프트웨어 솔루션을 개발하는 것입니다.

  • 비즈니스 도메인의 복잡성을 명확하게 이해하고 모델링함으로써, 도메인 전문가와 개발자 간의 통합된 언어(유비쿼터스 언어)를 형성합니다.
  • 유지보수가 쉽고 확장 가능한 소프트웨어 아키텍처를 설계합니다.
  • 비즈니스 로직과 애플리케이션 로직을 분리하여, 도메인 로직의 순수성을 유지합니다.

특징

  • 바운디드 컨텍스트: 서로 다른 모델을 분리하여, 각 도메인 모델이 자신만의 고유한 컨텍스트 안에서 의미를 갖도록 합니다.
  • 에그리거트: 도메인 객체를 그룹화하여, 복잡한 도메인 로직을 관리하기 쉽도록 합니다.
  • 도메인 이벤트: 도메인 내에서 발생하는 사건을 이벤트로 모델링하여, 시스템의 반응을 설계합니다.
  • 리포지토리: 도메인 객체의 지속성을 관리하고, 인프라스트럭처와 도메인 사이의 추상화 계층을 제공합니다.
  • 서비스: 도메인 모델 내에서 자연스럽게 위치하지 않는 로직을 처리합니다.

장단점

장점:

  • 비즈니스 로직의 중심적인 처리를 통해 복잡한 요구사항을 효과적으로 관리할 수 있습니다.
  • 개발 과정에서 도메인 전문가와의 긴밀한 협력을 촉진합니다.
  • 유연하고 확장 가능한 설계를 가능하게 하여, 장기적인 프로젝트 유지보수에 유리합니다.

단점:

  • 도입 초기에 학습 곡선이 높고, 프로젝트 설정에 시간이 많이 소요될 수 있습니다.
  • 작은 규모의 프로젝트에서는 과도한 설계로 인식될 수 있습니다.
  • 바운디드 컨텍스트 간의 통합과 커뮤니케이션 관리가 복잡할 수 있습니다.

실제 사례 및 예시

사례: 금융 서비스, 전자 상거래, 건강 관리 시스템 등 비즈니스 로직이 복잡하고 다양한 도메인으로 구성된 시스템에서 DDD가 성공적으로 적용되었습니다.

ecommerce_system/
├── product_context/  # 제품 도메인 바운디드 컨텍스트
│   ├── domain/
│   │   └── model/
│   │       ├── product.py
│   │       └── category.py
│   ├── application/
│   │   └── services/
│   │       └── inventory_management.py
│   └── infrastructure/
│       └── repository/
│           └── product_repository.py
└── order_context/  # 주문 도메인 바운디드 컨텍스트
    ├── domain/
    │   └── model/
    │       ├── order.py
    │       └── payment.py
    ├── application/
    │   └── services/
    │       └── order_processing.py
    └── infrastructure/
        └── repository/
            └── order_repository.py

 

특징/장단점 설명
바운디드 컨텍스트 도메인의 논리적 경계를 정의하고, 각 컨텍스트 내에서 모델이 유일한 의미를 가짐
에그리거트 관련된 객체의 집합을 관리하는 단위로, 데이터 일관성 유지
도메인 이벤트 도메인 내에서 발생하는 중요한 사건을 모델링
리포지토리 도메인 객체의 지속성을 추상화하고 관리
반응형