개요
2025.01.13-[FastAPI] startup, shutdown 이벤트 처리에서 FastAPI가 제공하는 on_event 데코레이터를 사용해 애플리케이션 시작 및 종료 시 처리해야 하는 작업을 정의하고 적용했다. 그런데 공식 문서에 의하면 on_event 데코레이터는 deprecated 되고, Lifespan이라는 개념으로 대체되었다고 한다.
이번 글에서 Lifespan을 사용하는 방법에 대해 정리해 둔다.
Lifespan
Lifespan은 전체 애플리케이션의 수명주기를 다루며, 애플리케이션이 시작되기 전에 실행되어야 하고, 애플리케이션이 종료될 때 실행되어야 하는 작업을 정의할 수 있게 한다. 주로 전체 애플리케이션에 사용해야 하는 자원, 요청 간 공유 자원, 정리해야 하는 자원을 설정하는 데 사용한다.
실제 구현은 context manager와 FastAPI 객체의 lifespan 매개변수를 사용한다. 아래에 예시 코드로 알아보자.
실행 함수 구현
먼저 애플리케이션이 시작하고 종료할 때 처리할 작업이 정의된 함수를 선언한다. 기본적인 함수 구조는 다음과 같다.
from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan_func(app: FastAPI):
# 애플리케이션 시작 작업
yield
# 애플리케이션 종료 작업
먼저 비동기로 정의되어 있어야 하며, 매개변수로 FastAPI 객체를 전달해주어야 한다.
함수 내부에서는 yield 키워드를 기준으로 애플리케이션이 시작할 때 실행할 코드와 애플리케이션을 종료할 때 실행할 코드가 구분된다. 그리고 함수를 "비동기 컨텍스트 매니저"라는 것으로 변환하는 @asynccontextmanager 데코레이터를 추가한다.
🤔 비동기 컨텍스트 매니저란?
컨텍스트 매니저(Context Maanger)란 원하는 타이밍에 리소스를 할당하고 제공하는 역할을 한다고 한다.
예시 )
from contextlib import asynccontextmanager
@asynccontextmanager
async def lifespan_func(app: FastAPI):
data['defaut_message'] = 'Hello world!'
print("Application initialize")
yield
print("Application shutdown")
FastAPI에 적용
FastAPI 객체를 생성하면서 lifespan 매개변수에 생성한 lifespan 함수를 전달한다.
from fastapi import FastAPI
app = FastAPI(lifespan=lifespan_func)
테스트
unicorn으로 실행 테스트를 해보자.
uvicorn study_main:app --reload
lifespan_func에서 정의한 Application initalize 문자열이 잘 출력되는 모습을 확인할 수 있다.
마찬가지로 실행을 종료할 때도 Application shutdown이라는 문자열이 출력되는 모습을 확인할 수 있다.
참고 문서
https://fastapi.tiangolo.com/advanced/events/
https://chaechae.life/blog/fastapi-lifespan-class
[FastAPI] Lifespan으로 어플리케이션 실행 / 종료 이벤트 시 동작 제어하기