[python library] 의존성 주입시 사용하는 도구 - dependency_injector

최승언·2024년 11월 26일
0

python library

목록 보기
1/1
post-thumbnail

dependency_injector.wiring 모듈의 Provide와 inject는 Python Dependency Injector 라이브러리에서 의존성 주입(Dependency Injection)을 구현할 때 사용하는 핵심 도구입니다. 이를 통해 클래스나 함수가 외부에서 관리되는 의존성을 쉽게 주입받을 수 있습니다. 아래에서 각각의 기능을 자세히 설명하겠습니다.

1. Provide

Provide는 의존성 주입을 위한 컨테이너에서 특정 의존성을 가져오는 데 사용됩니다.

  • 역할:

    • 컨테이너에 정의된 의존성을 참조하기 위한 일종의 "포인터" 역할을 합니다.
    • 의존성을 명시적으로 가져오는 대신 Provide를 사용해 컨테이너에서 의존성을 동적으로 해결합니다.
  • 사용 예:

from dependency_injector import containers, providers
from dependency_injector.wiring import Provide

# 컨테이너 정의
class Container(containers.DeclarativeContainer):
    config = providers.Configuration()  # 설정 정보를 제공
    service = providers.Factory(SomeService, config=config)

# 서비스 주입
async def some_function(service: SomeService = Depends(Provide[Container.service])):
    await service.do_something()
  • 설명:

    • Provide[Container.service]는 Container에 정의된 service 의존성을 참조합니다.
    • FastAPI의 Depends와 함께 사용하여 라우터나 함수에서 의존성을 해결합니다.

2. inject

inject는 클래스나 함수의 파라미터에 컨테이너에서 의존성을 자동으로 주입하기 위해 사용됩니다.

  • 역할:

    • @inject 데코레이터를 사용하면, 컨테이너에서 필요한 의존성을 자동으로 주입합니다.
    • 코드 내에서 명시적으로 의존성을 생성하지 않고도 필요한 객체를 받을 수 있습니다.
  • 사용 예:

코드 복사
from dependency_injector.wiring import inject, Provide

class SomeService:
    def do_something(self):
        print("Service is working!")

@inject
def some_function(service: SomeService = Provide[Container.service]):
    service.do_something()

# 호출 시 자동으로 의존성 주입
some_function()
  • 설명:

    • @inject는 Provide와 결합하여 사용됩니다.
    • 위 예에서 some_function은 service 파라미터에 컨테이너에서 생성한 SomeService 객체를 주입받습니다.

Provide와 inject를 함께 사용하는 이유

  • 코드 간소화: 직접 객체를 생성하거나 관리하지 않아도 되고, 컨테이너에 정의된 의존성을 자동으로 가져옵니다.
  • 의존성 관리 분리: 객체의 생성 및 관리를 컨테이너에 위임하여 응집도를 높이고 결합도를 낮춥니다.
  • 테스트 용이성: 컨테이너를 통해 모의(Mock) 객체를 주입할 수 있으므로 테스트가 쉬워집니다.

FastAPI에서 활용하는 방식

Provide와 inject는 FastAPI와 같은 프레임워크에서 의존성을 쉽게 주입하는 데 자주 사용됩니다.

FastAPI 컨트롤러에서의 예시

from fastapi import APIRouter, Depends
from dependency_injector.wiring import Provide, inject

router = APIRouter()

@router.get("/example")
@inject
async def example_endpoint(
    service: SomeService = Depends(Provide[Container.service])
):
    return service.perform_action()
  • Provide[Container.service]를 통해 의존성을 주입하고, @inject는 이를 자동으로 처리합니다.

정리

  • Provide: 컨테이너에서 의존성을 참조하는 데 사용됩니다.
  • inject: 함수나 클래스 메서드의 파라미터에 컨테이너에서 의존성을 주입하도록 설정합니다.
    이 둘을 조합하면, 의존성을 컨테이너로부터 자동으로 가져와 코드를 더욱 간결하고 모듈화할 수 있습니다.
profile
작업하다가 막힌부분을 기록하는 곳.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN