본문 바로가기
Coding/Python

의존성 주입(Dependency Injection)과 FastAPI에서의 활용

by 포스트it 2024. 11. 1.
반응형

 

의존성 주입(Dependency Injection)과 FastAPI에서의 활용

안녕하세요! 오늘은 의존성 주입(Dependency Injection)의 개념과 이를 FastAPI에서 어떻게 활용할 수 있는지 알아보겠습니다. Python과 FastAPI를 처음 접하시는 분들도 이해하기 쉽도록 예제를 통해 설명드리겠습니다.


의존성 주입이란?

의존성 주입(Dependency Injection)은 소프트웨어 디자인 패턴 중 하나로, 객체 간의 의존 관계를 외부에서 주입해주는 방식을 말합니다. 이를 통해 코드의 유연성, 재사용성, 테스트 용이성을 높일 수 있습니다.

왜 필요한가요?

  • 결합도 감소: 모듈 간의 의존성을 낮춰 코드 변경 시 영향 범위를 줄입니다.
  • 테스트 용이성: Mock 객체를 주입하여 단위 테스트를 쉽게 작성할 수 있습니다.
  • 유지보수성 향상: 의존 관계 관리가 쉬워져 코드 유지보수가 용이합니다.

FastAPI에서의 의존성 주입

FastAPI는 의존성 주입을 손쉽게 구현할 수 있도록 Depends를 제공합니다.

기본 사용법

from fastapi import FastAPI, Depends

app = FastAPI()

def get_token_header():
    return {"Authorization": "Bearer fake-token"}

@app.get("/items/")
def read_items(token: dict = Depends(get_token_header)):
    return {"token": token}
  • get_token_header 함수가 의존성으로 주입됩니다.
  • 엔드포인트 함수 read_items의 매개변수 tokenDepends(get_token_header)를 통해 결과가 전달됩니다.

예제: 데이터베이스 연결 주입

from fastapi import FastAPI, Depends

app = FastAPI()

def get_db():
    db = "DB 연결 객체 생성"
    try:
        yield db
    finally:
        print("DB 연결 종료")

@app.get("/users/")
def read_users(db: str = Depends(get_db)):
    return {"db": db}
 
  • get_db 함수는 데이터베이스 연결을 생성하고 필요 시 종료합니다.
  • 엔드포인트에서 db 매개변수로 받아 사용합니다.

중첩 의존성

의존성 함수 내부에서도 다른 의존성을 주입할 수 있습니다.

from fastapi import FastAPI, Depends

app = FastAPI()

def get_query():
    return "query parameter"

def process_query(query: str = Depends(get_query)):
    return f"Processed {query}"

@app.get("/search/")
def search(result: str = Depends(process_query)):
    return {"result": result}
  • process_query 함수는 **get_query**의 결과를 의존성으로 받습니다.
  • 엔드포인트에서 최종 결과를 사용합니다.

의존성 주입의 다양한 활용

상태 관리

전역 변수를 피하고 상태를 주입하여 관리할 수 있습니다.

class Settings:
    def __init__(self):
        self.app_name = "My Awesome App"

def get_settings():
    return Settings()

@app.get("/info/")
def get_info(settings: Settings = Depends(get_settings)):
    return {"app_name": settings.app_name}

보안 및 인증

인증 토큰이나 사용자 정보를 주입하여 보안 측면을 강화할 수 있습니다.

from fastapi import FastAPI, Depends, HTTPException, status

def verify_token(token: str):
    if token != "secure-token":
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="Invalid token",
        )
    return token

@app.get("/secure-data/")
def secure_data(token: str = Depends(verify_token)):
    return {"data": "Secure Data"}

 


의존성 주입의 이점

  • 코드 재사용성: 공통 기능을 모듈화하여 여러 곳에서 사용 가능합니다.
  • 가독성 향상: 함수의 매개변수를 통해 필요한 의존성을 명시적으로 나타냅니다.
  • 테스트 편의성: Mock이나 Stub을 주입하여 테스트 시 실제 구현체를 대체할 수 있습니다.

결론

의존성 주입은 코드의 품질과 효율성을 높이는 강력한 도구입니다. FastAPI의 Depends를 활용하면 복잡한 의존성 관리도 쉽게 구현할 수 있습니다. 오늘 소개한 내용을 바탕으로 여러분의 프로젝트에 의존성 주입을 적용해보세요!

728x90
반응형

댓글