반응형
의존성 주입(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의 매개변수 token에 Depends(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
반응형
'Coding > Python' 카테고리의 다른 글
Pydantic을 활용한 데이터 검증과 설정 관리 (1) | 2024.11.05 |
---|---|
비동기 프로그래밍과 FastAPI의 효율성 (5) | 2024.11.04 |
Python을 이용한 POST 요청 보내기 - 웹사이트에 로그인하는 방법 (0) | 2024.09.30 |
[Selenium] 셀레니움으로 크롤링 할 때 시크릿 모드 브라우저 열기 (0) | 2024.09.11 |
[Python & FastAPI] FastAPI와 Gunicorn을 사용한 서버 설정 (systemctl 에 설정하기) (0) | 2024.08.23 |
댓글