Python

[FastAPI] Lifespan - 이벤트 처리

비번변경 2025. 1. 24. 10:50

개요

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으로 어플리케이션 실행 / 종료 이벤트 시 동작 제어하기