[파이썬] aiohttp 서비스 간의 비동기 통신 구현

비동기 통신은 현대 소프트웨어 개발에서 매우 중요한 개념이 되었습니다. 이를 통해 서비스 간 효율적인 통신이 가능해지며, 사용자 경험을 향상시키고 시스템의 확장성을 강화할 수 있습니다. Python의 aiohttp 모듈은 asyncio를 기반으로 하는 비동기 HTTP 클라이언트 및 서버를 제공하여 이러한 비동기 통신을 간편하게 구현할 수 있게 해줍니다.

aiohttp란?

aiohttp는 asyncio 기반의 HTTP 프로토콜 클라이언트와 서버를 구현하기 위한 Python 라이브러리입니다. 단일 스레드에서 여러 요청을 비동기적으로 처리하여 멀티스레드 방식과 비교해 더 효율적인 처리와 네트워크 리소스의 효율적인 사용을 가능케 합니다.

aiohttp 서버 구현

먼저 aiohttp를 사용하여 간단한 서버를 구성해보겠습니다. 아래는 aiohttp를 사용하여 “Hello, World!” 메시지를 응답하는 간단한 HTTP 서버의 예제입니다.

import aiohttp
from aiohttp import web

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

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

if __name__ == '__main__':
    web.run_app(app)

위 예제에서 app.router.add_get() 메소드를 사용하여 루트 경로에 대한 GET 요청을 처리하는 핸들러 함수를 등록합니다. 이 핸들러 함수에서는 web.Response 객체를 반환하여 클라이언트에게 응답을 보냅니다. web.run_app() 함수를 사용하여 서버를 실행합니다.

aiohttp 클라이언트 구현

이제 aiohttp를 사용하여 클라이언트에서 서버로 요청을 보내고 응답을 받아오는 예제를 살펴보겠습니다. 아래 코드는 aiohttp를 사용하여 “http://example.com”에 GET 요청을 보내고 응답을 출력하는 예제입니다.

import aiohttp
import asyncio

async def fetch(client):
    async with client.get('http://example.com') as resp:
        return await resp.text()

async def main():
    async with aiohttp.ClientSession() as client:
        html = await fetch(client)
        print(html)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

위 예제에서는 aiohttp.ClientSession을 사용하여 클라이언트 세션을 생성한 후, client.get() 메소드를 사용하여 서버로 GET 요청을 보냅니다. resp.text()를 사용하여 응답 내용을 텍스트로 변환한 후 출력합니다.

결론

aiohttp를 사용하면 Python을 이용하여 비동기 통신을 구현하는 것이 매우 간편해집니다. 이를 통해 서버와 클라이언트 사이의 효율적이고 확장 가능한 통신을 구현할 수 있습니다. aiohttp는 뛰어난 성능과 사용 편의성을 제공하는 Python 비동기 프로그래밍의 핵심 도구 중 하나입니다.