[파이썬] aiohttp의 내부 동작 원리

aiohttp은 파이썬에서 비동기 웹 애플리케이션을 개발하기 위해 사용하는 라이브러리입니다. 이 블로그 포스트에서는 aiohttp의 내부 동작 원리에 대해 자세히 알아보겠습니다.

asyncio와의 통합

aiohttp은 asyncio(비동기 I/O를 위한 표준 라이브러리)와 함께 사용되어 비동기 웹 애플리케이션을 개발합니다. asyncio는 이벤트 루프와 코루틴을 통해 비동기 작업을 처리하는 데 사용됩니다. aiohttp는 asyncio를 이용하여 HTTP 요청과 응답을 처리하고 네트워크 I/O를 비동기적으로 처리합니다.

Client와 Server

aiohttp에는 ClientServer 클래스가 있습니다. Client는 HTTP 클라이언트를 나타내고, Server는 HTTP 서버를 나타냅니다. 각각의 클래스는 aiohttp.ClientSessionaiohttp.web.Application의 인스턴스로 초기화됩니다.

Client

aiohttp의 Client 클래스는 비동기 HTTP 클라이언트를 구성하는 데 사용됩니다. Client 인스턴스를 만들고, ClientSession을 생성하여 HTTP 요청을 보내고 응답을 받을 수 있습니다.

import aiohttp

async def make_request():
    async with aiohttp.ClientSession() as session:
        async with session.get('http://example.com') as response:
            print(await response.text())

asyncio.run(make_request())

위의 예제에서는 ClientSession을 사용하여 example.com로 GET 요청을 보내고 응답을 받습니다. response.text()를 사용하여 응답의 내용을 출력합니다.

Server

aiohttp의 Server 클래스는 비동기 HTTP 서버를 구성하는 데 사용됩니다. Server 인스턴스를 만들고, aiohttp.web.Application을 생성하여 라우팅 및 핸들러를 설정할 수 있습니다.

from aiohttp import web

async def handle(request):
    return web.Response(text="Hello, World!")

app = web.Application()
app.router.add_get('/', handle)

web.run_app(app)

위의 예제에서는 web.Application을 사용하여 애플리케이션을 만들고, / 경로에 대한 핸들러를 추가합니다. web.run_app()을 호출하여 애플리케이션을 실행합니다.

Middleware

aiohttp에서는 미들웨어를 사용하여 요청 및 응답을 처리할 수 있습니다. 미들웨어는 애플리케이션의 처리 흐름에서 중간 단계로 실행되는 함수입니다. 이를 사용하여 요청/응답 로깅, 인증, 에러 처리 등을 구현할 수 있습니다.

from aiohttp import web

async def middleware_handler(request, handler):
    print("Before request")
    response = await handler(request)
    print("After request")
    return response

async def handle(request):
    return web.Response(text="Hello, World!")

app = web.Application(middlewares=[middleware_handler])
app.router.add_get('/', handle)

web.run_app(app)

위의 예제에서는 middleware_handler라는 미들웨어 함수를 정의하고 web.Application을 생성할 때 middlewares 매개 변수로 전달합니다. 이로써 모든 요청 이전과 이후에 미들웨어 함수가 실행됩니다.

결론

이렇게 aiohttp는 asyncio와 함께 작동하여 비동기 웹 애플리케이션을 구축하는 데 사용됩니다. Client와 Server 클래스를 사용하여 HTTP 요청 및 응답을 처리하고, Middleware를 사용하여 추가적인 로직을 구현할 수 있습니다.

야옹이블로그 기술 포스트를 끝내며, aiohttp의 내부 동작 원리에 대해 간략히 알아보았습니다. aiohttp를 통해 비동기 웹 애플리케이션 개발을 시작해보세요!