FastAPI와 DDD

@SharkniA · October 20, 2023 · 9 min read

기본 개념

DDD는 복잡한 애플리케이션과 시스템의 개발에 있어서 비즈니스 요구사항을 중심으로 설계하고 구현하는 접근법입니다. 이 방식은 비즈니스 도메인의 복잡성을 이해하고, 그 복잡성을 모델링하여 소프트웨어에 반영하는 것에 중점을 둡니다.

핵심 요소

  1. Ubiquitous Language (모든 곳에서 사용되는 언어): 개발팀과 비즈니스 팀 간에 공통적으로 사용되는 언어. 이를 통해 불필요한 혼동을 줄이고, 의사소통의 효율을 높입니다.
  2. Bounded Context (경계가 정의된 맥락): 특정한 맥락 내에서만 유효한 모델을 정의. 다른 맥락에서는 같은 용어도 다른 의미를 가질 수 있습니다.
  3. Entities, Value Objects, Aggregates, Repositories: 도메인 모델을 구성하는 주요 요소들입니다.
  4. Domain Events: 도메인 내에서 중요한 비즈니스 이벤트를 나타냅니다.

FastAPI에서 DDD의 기본 구조

├── api                               # 첫 번째 API 모듈
│   ├── domain                        # 도메인 로직과 엔티티 정의
│   │   ├── entities                  # 엔티티 정의 (비즈니스 모델)
│   │   └── value_objects             # 값 객체 정의 (데이터 검증 및 전송 용도)
│   ├── presentation                  # 애플리케이션의 사용자 인터페이스 레이어
│   │   ├── dto                       # 데이터 전송 객체 정의 (Pydantic 모델)
│   │   └── rest                      # REST 엔드포인트 정의
│   │       └── controllers           # REST 컨트롤러 (FastAPI 경로 작업 처리)
│   ├── repository                    # 영속성 관리를 위한 인터페이스 정의
│   │   └── impl                      # 리포지토리 구현체 (영속성 레이어)
│   │       └── sql                   # SQL 기반 리포지토리 구현체
│   │           ├── models.py         # 데이터베이스 모델 (ORM 모델)
│   │           ├── crud.py           # CRUD 연산 로직
│   │           └── database.py       # 데이터베이스 세션 및 연결 관리
│   └── service                       # 도메인 서비스 정의, 도메인 로직 구현
│       └── impl                      # 서비스 구현체 (비즈니스 로직의 구현)
├── api2                              # 두 번째 API 모듈
│   └── ...                           # 같은 구조를 가져간다
├── core                              # 공통 핵심 기능이나 공유 컴포넌트
└── router                            # 애플리케이션의 라우팅 로직, URL 라우트 정의
    └── routes                        # 개별 라우트 정의 파일

DDD의 원칙에 따라 애플리케이션을 조직화하면 각 도메인이 뚜렷하게 분리되고 관리하기 쉬워진다. 위에 제시된 디렉토리 구조는 DDD를 적용한 예시이다.

도메인 레이어, 애플리케이션 레이어, 인프라 레이어로 분리되어 코드의 응집도를 높이고 결합도를 낮출 수 있다. 또한 각 레이어가 제공하는 인터페이스와 구현체를 분리함으로써 유지보수와 확장성에 유리한 구조를 만들 수 있다.

도메인 레이어

domain 디렉토리

DDD에서 가장 중요한 부분으로 복잡한 비즈니스 로직과 애플리케이션 핵심 기능을 표현하는 모델을 담고 있다.

  • entities

    • 비즈니스 도메인의 기본적인 데이터 단위로 고유한 식별자를 가지고 있다.
  • 비즈니스 규칙을 캡슐화하고 FastAPI 애플리케이션에서 데이터베이스 레코드와 1:1로 매핑되는 경우가 많다.
  • FastAPI는 이러한 엔티티에 직접적으로 연관되지능 않지만 ORM 도구를 사용하여 엔티티 클래스를 데이터 모델로 변환하고 데이터베이스와 상호작용을 할 수 있다.
  • value_objects

    • 식별자를 가지지 않는 불변 객체로 엔티티의 속성을 표현한다.
  • FastAPI에서는 값 객체를 표현하기 위해 Pydantic의 기능을 활용할 수 있으며 요청 검증이나 응답 시리얼라이징에 유용하게 사용된다.

애플리케이션 레이어(presentation, service)

presentaion 디렉토리

이 디렉토리는 사용자 인터페이스와 외부에 노출되는 API 엔드포인트의 정의를 담당한다.

  • DTO

    • DTO는 클라이언트와 서버간에 데이터를 전달할 때 사용하는 객체이다.
  • FastAPI에서는 Pydantic 모델을 이용해 DTO를 정의한다. 이 모델들은 본문, 쿼리 파라미터, 경로 파라미터, 그리고 응답 모델을 정의하는데 사용된다.
  • DTO는 엔드포인트가 받아들이고 반환하는 데이터의 구조와 유효성 검증 규칙을 명시한다.
  • REST

    • Restful 원칙을 따르는 API 엔드포인트를 정의한다.
  • FastAPI에서는 각 API 경로에 해당하는 함수를 작성하고 이를 HTTP 메서드에 매핑한다.
  • 각 함수는 Pydantic DTO를 매개변수로 사용하여 요청 데이터의 유효성을 검사하고 이를 도메인 모델로 변환하거나 서비스 레이어로 전달한다.
  • Controllers

    • API 엔드포인트에 대한 요청을 처리하는 로직을 담당한다.
  • FastAPI에서는 주로 경로 작업 함수로 표현되며 경로 데코레이터를 사용하여 라우트를 설정한다.
  • 컨트롤러는 요청을 받아 DTO로 파싱하고 필요한 비즈니스 로직을 수행한 후 적절한 HTTP 응답을 반환한다.

이 구성 요소들은 FastAP의 강점인 타입 힌트, 자동 문서화, 요청 검증 등을 활용하여 효율적인 API 인터페이스 레이어를 구성하는데 중요한 역할을 한다.

service 디렉토리

애플리케이션의 비즈니스 로직을 구현하는 부분을 담당한다. 컨트롤러와 데이터 액세스 계층 사이에서 중간 역할을 한다. 주요 목적은 비즈니스 규칙과 애플리케이션 로직을 캡슐화하여 재사용성을 높이고 애플리케이션의 다룬 부분과의 결합도를 낮추는 것이다.

  • Service Implementations (impl)

    실제 로직을 구현한다. 이 구현체는 데이터베이스 호출, 외부 서비스 호출, 비즈니스 규칙 처리 등을 담당한다.

인프라 레이어(repository)

도메인 레이어와 애플리케이션 레이어의 기술적 세부 사항을 추상화하는 역할을 한다. 주로 데이터베이스, 메시징 시스템, 파일 시스템와 같은 외부 자원과의 통신을 담당한다. 애플리케이션의 나머지 부분이 기술적인 세부사항에 직접적으로 의존하지 않도록 추상화를 제공한다.

@SharkniA
만 4살 백엔드 개발자
© SharkniA, Built with Gatsby.