Python
[FastAPI] Lifespan을 이용한 생명주기 관리 (Event Handler)
limsw
2024. 2. 26. 22:52
반응형
서론
이번 글에서는 FastAPI의 Lifespan을 이용하여 이벤트를 관리하는 방법을 알아보고자 한다.
이 글에서 말하는 이벤트 핸들링은 FastAPI 서비스가 시작 또는 종료될 때 특정 함수를 호출하는 등의 행위를 말한다.
본론
먼저 Lifespan이 생기기 이전에 FastAPI는 on_event를 이용하여 이벤트를 관리했다.
예를 들어, FastAPI가 시작(종료)될 때 특정한 함수를 실행시키기 위해서는 다음과 같이 코드를 작성할 수 있었다.
from fastapi import FastAPI
app = FastAPI()
@app.on_event("startup")
async def startup_event():
print("service is started.")
@app.on_event("shutdown")
async def shutdown_event():
print("service is stopped.")
- startup : FastAPI가 시작될 때 호출되는 함수
- shutdown : FastAPI가 종료될 때 호출되는 함수
위 코드를 실행/종료 했을 때의 결과는 다음과 같다.
Lifespan을 사용하여 생명주기 관리하기
하지만 최근에는 on_event 사용을 지양하고 lifespan을 이용하여 이벤트를 관리하는 방법을 권장하고 있다.
위에서 작성한 코드를 Lifespan을 사용하여 구현하면 다음과 같이 코드를 작성할 수 있다.
from contextlib import asynccontextmanager
from fastapi import FastAPI
def start():
print("service is started.")
def shutdown():
print("service is stopped.")
@asynccontextmanager
async def lifespan(app: FastAPI):
# When service starts.
start()
yield
# When service is stopped.
shutdown()
app = FastAPI(lifespan=lifespan)
- app 객체를 선언할 때 인자로 lifespan을 정의한다.
- yield를 기준으로 앞에 오는 코드는 서비스가 시작될 때 호출되는 함수(코드) 이다.
- yield를 기준으로 뒤에 오는 코드는 서비스가 종료될 때 호출되는 함수(코드) 이다.
코드 실행 시 결과는 다음과 같다.
결과는 동일하지만 on_event함수는 공식적으로 지원하지 않는다고 하니, Lifespan을 사용하는 것을 지향한다고 한다.