[파이썬] aiohttp 서버 훅(Hooks) 활용

aiohttp는 Python으로 작성된 비동기 웹 프레임워크로서, 강력한 서버 훅(Hooks) 시스템을 포함하고 있습니다. 서버 훅은 요청이나 응답이 처리되기 전 후에 실행되는 콜백 함수입니다. 이 기능을 활용하면 aiohttp 서버의 동작을 커스터마이징하거나 특정 이벤트에 대한 로깅, 인증, 예외 처리 등을 처리할 수 있습니다.

서버 훅의 종류

aiohttp 서버는 다양한 종류의 훅을 제공합니다. 여기서는 가장 일반적으로 쓰이는 훅 몇 가지를 살펴보겠습니다:

서버 훅 사용하기

아래는 aiohttp 서버 훅을 사용하는 간단한 예시입니다:

from aiohttp import web

async def on_pre_start(app):
    print("서버 시작 전 호출")

async def on_post_start(app):
    print("서버 시작 후 호출")

async def on_cleanup(app):
    print("서버 종료 전 호출")

async def on_response_prepare(request, response):
    print("응답 준비 전 호출")

app = web.Application()
app.on_pre_start.append(on_pre_start)
app.on_post_start.append(on_post_start)
app.on_cleanup.append(on_cleanup)
app.on_response_prepare.append(on_response_prepare)

web.run_app(app)

위의 예시에서는 각각의 훅을 정의하고, app 객체의 해당 속성에 훅을 추가해주었습니다. 즉, on_pre_start, on_post_start, on_cleanup, on_response_prepare 속성에 각각의 훅 함수를 추가해주면 됩니다. 훅 함수는 async 함수 형태로 작성되어야 합니다.

훅을 활용한 실제 시나리오

서버 훅은 다양한 상황에서 유용하게 활용될 수 있습니다.

예를 들어, on_pre_start 훅을 사용하여 서버가 시작되기 전에 데이터베이스와의 연결을 설정하거나, 외부 API와의 연결을 초기화할 수 있습니다.

async def on_pre_start(app):
    # 데이터베이스 연결 설정
    db.connect()
    # 외부 API 클라이언트 초기화
    external_api_client.init()

또한, on_cleanup 훅을 사용하여 서버가 종료되기 전에 데이터베이스 연결을 닫거나, 외부 리소스를 정리할 수 있습니다.

async def on_cleanup(app):
    # 데이터베이스 연결 종료
    db.disconnect()
    # 외부 API 클라이언트 리소스 정리
    external_api_client.cleanup()

서버 응답을 처리하는 과정에서 추가적인 작업을 수행하고 싶은 경우에는 on_response_prepare 훅을 사용할 수 있습니다. 예를 들어, 모든 응답에 특정 헤더를 추가하고 싶다면 아래와 같이 on_response_prepare 훅을 활용할 수 있습니다:

async def on_response_prepare(request, response):
    response.headers['Custom-Header'] = 'Value'

app.on_response_prepare.append(on_response_prepare)

결론

aiohttp의 서버 훅을 활용하면 서버의 동작을 커스터마이징하거나 다양한 작업을 쉽게 처리할 수 있습니다. 각 훅의 호출 순서도 정해져 있으므로, 훅을 활용하면 aiohttp를 더욱 유연하게 사용할 수 있습니다.