ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ContextVar
    Python 2026. 1. 3. 00:17

    현재 실행 중인 컨텍스트(Thread/Coroutine)에 붙어다니는 전역변수이다.

    contextvar는 Python 런타임이 관리하는 실행 컨텍스트에 저장된다.

     

    현재 코드를 실행중인 코루틴 객체에 귀속되므로 전역변수처럼 참조가 가능하다.

     

    따라서 한 개의 코루틴 내에서 호출하는 모든 함수에서 contextvar에 접근이 가능하다.

     


    1. 우선 각 코루틴에 ContextVar를 사용하겠다고 정의를 해야한다.

    from contextvars import ContextVar
    
    request_id_ctx = ContextVar("request_id", default="-")

     

     

    2. MiddleWare를 통한 각 코루틴의 ContextVar 값 초기화

    import uuid
    
    @app.middleware("http")
    async def request_id_middleware(request, call_next):
        request_id_ctx.set(str(uuid.uuid4()))
        response = await call_next(request)
        return response

     

    각 요청을 실행하는 코루틴 객체가 생성될때

    라우터(Endpoint)가 호출되기 전에 해당 코루틴 객체에 대한 ContextVar를 생성해주는 Middleware를 먼저 실행하도록 한다.

     

    여기서 보이는 response는 Endpoint, Controller 함수 실행 후 반환한 최종 Response이다.

    이와 같이 Middleware는 요청 전/요청 후 공통 작업에 사용된다.

     

    하지만 ContextVar를 생성하는 작업은 요청 실행 전에만 하면 되므로 Response는 그대로 반환해주면 된다.

     

    3.

     

    이후 API 단부터 Service > CRUD 단까지 내부적으로 호출되는 함수들은 모두 동일한 코루틴 객체가 호출하는 코드들이기 때문에,

    각 Layer에서 contextvar를 호출했을때 얻는 값이 동일해진다.

     

    ContextVar는 이 코드를 실행 중인 코루틴 컨텍스트에 값을 저장한다.

    따라서 함수 깊이랑은 전혀 상관이 없다.

    같은 코루틴이라면 어디서든 접근이 가능하다.

     

    인자로 넘기지 않아도 동일한 실행 컨텍스트(코루틴)에 묶여있는 값이라 가능한 것이다!

    'Python' 카테고리의 다른 글

    SQLAlchemy  (0) 2026.01.23
    Sentry Logging  (0) 2026.01.03
    async with / async for  (0) 2025.12.13
    StreamingResponse  (0) 2025.11.15
    yield와 Generator  (0) 2025.11.11