[FastAPI - DI 마스터 01부] 복잡성 증가를 해결하는 의존성 주입(DI) 개념과 필요성

2025. 12. 4. 23:23·ServerDev/FastAPI

FastAPI 의존성 주입(Dependency Injection) 심층 분석:

왜, 그리고 어떻게 사용하는가?

 

 

이번 포스팅에서는 FastAPI를 빠르고 견고하게 만들어주는 핵심 원리, 의존성 주입(Dependency Injection, DI) 시스템에 대해 심도 있게 알아보겠습니다. 현재 여러분이 겪고 있는 API 서버 개발의 문제점과 DI가 어떻게 그 해답을 제시하는지 명확히 이해하실 수 있을 것입니다.


1.  복잡성 증가! 기존 API 서버 개발의 문제점

프로젝트가 커질수록 API 서버 개발자는 다음과 같은 근본적인 어려움에 직면하게 됩니다.

1.1. 복잡해지는 경로 함수와 공통 로직 관리

게시판, 사용자 인증, 결제 처리 등 다양한 기능을 구현하다 보면, 실제 비즈니스 로직 외에도 여러 엔드포인트에서 공통으로 처리해야 하는 작업이 생겨납니다.

  • 데이터베이스 세션 관리: 모든 요청마다 DB 연결을 열고, 작업 후에는 반드시 닫아주어야 하는 Setup/Teardown 과정이 필요합니다.
  • 사용자 인증 및 권한 확인: 요청 헤더에서 토큰을 추출하고, 유효성을 검사하여 현재 사용자 정보를 가져오는 보안 로직이 필요합니다.
  • 기본 설정값 적용: 페이징을 위한 기본 skip, limit 값 같은 공통 쿼리 매개변수를 처리해야 합니다.

이러한 공통 로직들을 각 엔드포인트 함수 내부에 직접 작성하게 되면 코드가 길어지고, 나중에 DB가 바뀌거나 인증 방식이 변경될 때 수십 개의 함수를 모두 수정해야 하는 악몽 같은 상황이 발생합니다. 이것은 관심사의 분리(Separation of Concerns) 원칙을 위반하게 됩니다.

1.2. 테스트의 어려움과 비효율성

비즈니스 로직을 테스트하려 할 때도 큰 문제가 발생합니다.

  • 실제 DB 의존: 코드가 실제 데이터베이스에 직접 접근하거나 외부 인증 서버와 통신하게 되어 있어, 테스트를 위해 매번 DB 환경을 구축하고 데이터를 넣고 지우는 작업이 필요합니다. 테스트 속도가 느려지고 불안정해집니다.
  • 느린 피드백: 테스트가 느려지면 개발 피드백 속도가 떨어지고, 결국 테스트 자체를 건너뛰게 되는 악순환을 초래합니다.

2. FastAPI의 해답: 의존성 주입 (DI) 시스템

이러한 문제들을 해결하기 위해 FastAPI는 파이썬의 타입 힌트와 Depends 키워드를 활용한 강력한 의존성 주입(DI) 시스템을 이용할 수 있습니다.

DI는 현대 소프트웨어 개발, 특히 객체 지향 프로그래밍과 웹 프레임워크(FastAPI 포함)에서 매우 중요한 설계 패턴이자 원칙입니다.

가장 쉽게 설명하면, "객체가 자신이 필요한 것을 직접 만들지 않고, 외부에서 공급받는" 방식입니다.

클라이언트 (경로 함수), 주입자 (FastAPI 프레임워크), 의존성 (DI 함수) 세 가지 구성 요소로 나뉩니다.

1. 클라이언트 (Client: Path Operation Function)
  • @app.get("/items/")로 정의된 경로 함수 (def read_items(commons: CommonParams):).
  • 이 함수는 commons라는 매개변수를 필요로 합니다 ("I need 'commons':"). 하지만 이 값을 자신이 직접 만들지 않고, 외부에서 주입해 주기를 기대합니다. 이는 파이썬 타입 힌트와 Depends를 통해 명시됩니다.
2. 주입자 (Injector: FastAPI Framework)
  • FastAPI 프레임워크 자체
  • DI 시스템의 핵심 조율자입니다.
    • 1. Calls 'Depends': 클라이언트가 필요한 의존성(예: CommonParams의 get_common_parameters 함수)을 감지하고 해당 함수를 호출합니다.
    • 2. Executes & Dependency Function: 의존성 함수를 실행하고 요청에서 필요한 값(쿼리 매개변수 등)을 전달합니다.
3. 의존성 (Dependency)
  • get_common_parameters(q, skip, limit)와 같은 DI 함수
    • 주입자로부터 전달받은 요청 데이터(매개변수)를 처리하고, 최종적으로 경로 함수가 사용할 값을 생성합니다.
    • "I provide ('q':..., 'skip', 'limit',...)": 이 함수가 처리한 결과를 딕셔너리 형태로 반환합니다.

최종 흐름

  1. 경로 함수는 commons를 요청합니다.
  2. FastAPI 주입자는 의존성 함수를 실행합니다.
  3. 의존성 함수는 처리된 값을 제공합니다.
  4. FastAPI 주입자는 이 제공된 값을 다시 경로 함수의 매개변수 commons로 주입하여 최종적으로 경로 함수가 실행되게 합니다.

2.1. 의존성 주입 (DI)의 세 가지 핵심 개념

DI를 이해하기 위해서는 다음 세 가지 개념을 명확히 알아야 합니다.

1. 의존성 (Dependency)

  • 한 객체(클라이언트)가 다른 객체(서비스)의 기능이나 데이터를 사용해야 할 때, 그 다른 객체를 의존성이라고 합니다
    • 게시글_서비스 클래스는 데이터를 저장하기 위해 DB_접근자 클래스에 의존합니다.
    • API_엔드포인트 함수는 요청을 처리하기 위해 사용자_인증 함수에 의존합니다.

2. 주입 (Injection)

  • 의존성 객체를 필요로 하는 객체(클라이언트) 내부에서 직접 생성하는 것이 아니라, 외부에서 객체를 만들어서 필요한 객체에게 전달(주입)해 주는 행위를 말합니다.

    기존 방식 (DI를 사용하지 않을 때)  코드가 필요한 객체를 직접 생성하므로 강한 결합이 발생합니다.
    class MyService:
        def __init__(self):
            # MyService가 DBConnector를 직접 생성하고 관리함 (강한 결합)
            self.db = DBConnector() 
    

     

     

    DI 방식 (생성자 주입의 )  외부에서 객체를 전달받으므로 느슨한 결합이 됩니다. MyService는 누가 db_connector를 만들었는지 알 필요가 없습니다.
    class MyService:
        def __init__(self, db_connector):
            # MyService는 외부에서 db_connector를 '주입' 받음 (느슨한 결합)
            self.db = db_connector 
    


3. 주입자 (Injector) 또는 DI 컨테이너

  • 의존성 객체를 생성하고, 필요한 객체(클라이언트)에게 전달(주입)해 주는 제3의 주체입니다.
  • FastAPI 프레임워크 자체가 이 주입자(DI 컨테이너) 역할을 수행합니다. 개발자가 함수 매개변수에 Depends(의존성_함수)를 명시하면, FastAPI가 적절한 시점에 의존성 함수를 실행하고 그 결과를 경로 함수에 전달해 줍니다.

2.2. DI를 사용함으로써 얻는 이점

DI를 통해 우리는 다음과 같은 개발 환경을 만들 수 있습니다.

  1. 관심사의 분리: DB 연결, 인증 등 공통 로직을 별도의 함수로 깔끔하게 분리합니다. 경로 함수는 오직 비즈니스 로직(무엇을 할 것인가)에만 집중하게 됩니다.
  2. 유지보수성 향상: 의존성이 바뀌어도 (예: DB 변경), 관련된 의존성 함수만 수정하면 되며, 핵심 비즈니스 로직 코드를 건드릴 필요가 없습니다.
  3. 손쉬운 테스트 환경 구축: 테스트 시 복잡한 의존성(DB, 외부 API)을 간단한 가짜 객체(Mock)로 쉽게 대체할 수 있습니다.

3. FastAPI Depends 함수의 기본 사용법과 원리

이제 이러한 DI의 원리가 FastAPI에서 어떻게 구현되는지 살펴보겠습니다.

(이후 내용은 [2. FastAPI에서 Depends 사용하기 (기본 원리)] 장에서 다루겠습니다.)

https://ye-seul0-0.tistory.com/6

 

[FastAPI DI 마스터 2부] Depends 사용법 기초부터 yield를 이용한 DB 연동까지 실전 정복

FastAPI 의존성 주입(DI) 마스터 시리즈 (2부)안녕하세요! 지난 1부에서는 우리가 API를 개발하며 겪는 문제점들과, 이를 해결하기 위한 의존성 주입(DI) 의 개념에 대해 알아보았습니다. 이번 2부에서

ye-seul0-0.tistory.com

 

'ServerDev > FastAPI' 카테고리의 다른 글

[FastAPI - CORS 마스터 2부] 쿠키 인증(Credential) 이슈 해결과 보안을 위한 정교한 허용 전략  (0) 2025.12.11
FastAPI - CORS 마스터 1부] 프론트엔드 연동 첫걸음, CORS 에러  (0) 2025.12.10
[FastAPI] 웹 프레임워크가 아니라 'AI 모델 서빙기'로 사용하기 (feat. Spring Boot)  (0) 2025.12.09
[FastAPI - DI 마스터 3부] 의존성 오버라이드(Override)와 고급 패턴  (0) 2025.12.09
[FastAPI - DI 마스터 2부] Depends 사용법 기초부터 yield를 이용한 DB 연동까지 실전 정복  (0) 2025.12.06
'ServerDev/FastAPI' 카테고리의 다른 글
  • FastAPI - CORS 마스터 1부] 프론트엔드 연동 첫걸음, CORS 에러
  • [FastAPI] 웹 프레임워크가 아니라 'AI 모델 서빙기'로 사용하기 (feat. Spring Boot)
  • [FastAPI - DI 마스터 3부] 의존성 오버라이드(Override)와 고급 패턴
  • [FastAPI - DI 마스터 2부] Depends 사용법 기초부터 yield를 이용한 DB 연동까지 실전 정복
yeseul-kim01
yeseul-kim01
  • yeseul-kim01
    슬 개발일지
    yeseul-kim01
  • 전체
    오늘
    어제
    • 분류 전체보기 (79)
      • 자격증 (1)
        • 정보보안기사 (0)
      • DevOps (17)
        • Docker (6)
        • Kubernetes (1)
        • GitHub Actions (0)
        • AWS (4)
        • Monitoring (1)
        • Nginx (1)
        • GCP (3)
      • ServerDev (34)
        • SpringBoot (13)
        • DJango (5)
        • FastAPI (14)
        • Next (0)
        • Flask (0)
        • Database (2)
      • Algorithm (2)
        • BFS (0)
        • DFS (1)
        • 다익스트라 (0)
      • CS (8)
      • Data Engineering (1)
      • AI&MLOps (2)
      • Architecture (6)
      • Software Engineering (0)
        • Library Packaging (0)
      • Project (5)
        • docx-generator (0)
        • speak-note (2)
        • ms-serving (1)
        • keyshield (2)
      • ProgrammingLanguages (3)
        • Python (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    di
    FastAPI - CORS 마스터
    STT
    아키텍처설계
    KServe
    Kubernetes
    트러블슈팅
    프로젝트기록-speaknote
    multipartfile
    FastAPI
    백엔드
    docker
    MLops
    멀티모듈
    KeyShield
    실시간시스템
    Django
    하이브리드아키텍처
    동시성제어
    SpeakNote
    비동기처리
    SpringBoot
    아키텍처
    depends
    NLP부트캠프
    실무일기-인프라편
    실무일기-백엔드편
    grpc
    rag
    프로젝트기록-KeyShield
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
yeseul-kim01
[FastAPI - DI 마스터 01부] 복잡성 증가를 해결하는 의존성 주입(DI) 개념과 필요성
상단으로

티스토리툴바