[파이썬] aiohttp 서버 사이드 이벤트(SSE) 활용하기

서버 사이드 이벤트(Server-Sent Events, SSE)는 클라이언트로부터 오는 요청에 대해 서버가 실시간으로 데이터를 보내주는 기능을 제공하는 웹 기술입니다. 이 기술은 웹 애플리케이션에서 서버와 클라이언트 간의 양방향 통신을 구현하고 실시간 동기화된 데이터를 표시하는 데 사용됩니다. 이번 블로그 포스트에서는 Python의 aiohttp 라이브러리를 사용하여 aiohttp 서버 사이드 이벤트를 구현하는 방법에 대해 알아보겠습니다.

aiohttp 라이브러리 설치하기

먼저, aiohttp를 사용하기 위해서는 해당 라이브러리를 설치해야 합니다. 아래 명령어를 사용하여 aiohttp를 설치합니다.

pip install aiohttp

SSE 서버 구현하기

다음으로, aiohttp를 사용하여 SSE 서버를 구현해 보겠습니다. 아래는 간단한 예제 코드입니다.

import asyncio
from aiohttp import web

async def event_stream(request):
    response = web.StreamResponse()
    response.headers['Content-Type'] = 'text/event-stream'
    response.headers['Cache-Control'] = 'no-cache'
    response.headers['Connection'] = 'keep-alive'
    await response.prepare(request)
    
    while True:
        # 이벤트 데이터 생성
        event_data = 'data: Hello, world!\n\n'
        
        # 이벤트 스트림으로 데이터 보내기
        await response.write(event_data.encode())
        
        # 일정 시간 간격으로 반복하여 데이터 보내기
        await asyncio.sleep(1)
        
app = web.Application()
app.router.add_route('GET', '/events', event_stream)

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

위 예제 코드에서 event_stream 함수는 SSE 이벤트 스트림을 생성하는 역할을 합니다. response.write 메서드를 사용하여 이벤트 데이터를 보내고, asyncio.sleep 함수를 사용하여 일정 시간 간격으로 데이터를 반복적으로 보냅니다.

SSE 클라이언트와 통신하기

SSE 서버를 구현했다면, 이제 클라이언트와의 통신을 위해 SSE 클라이언트 라이브러리를 사용할 수 있습니다. 대표적인 SSE 클라이언트 라이브러리로는 EventSource가 있습니다. 아래는 JavaScript를 사용하여 SSE 클라이언트를 구현하는 예제 코드입니다.

// SSE 클라이언트 예제

const eventSource = new EventSource('/events');

eventSource.addEventListener('message', function(event) {
    const eventData = JSON.parse(event.data);
    console.log('Received event data:', eventData);
});

eventSource.addEventListener('error', function(event) {
    console.error('Error occurred:', event);
});

위 예제 코드에서는 EventSource 객체를 생성하고, addEventListener 함수를 사용하여 메시지 및 에러 이벤트를 처리합니다. 수신된 이벤트 데이터는 console.log를 사용하여 콘솔에 출력합니다.

결론

이번 블로그 포스트에서는 aiohttp를 사용하여 SSE 서버를 구현하는 방법에 대해 알아보았습니다. SSE를 활용하면 서버와 클라이언트 간에 실시간으로 데이터를 전송하고 동기화할 수 있는 강력한 기능을 제공할 수 있습니다. aiohttp와 SSE를 활용하여 웹 애플리케이션에 실시간 기능을 추가해보세요!

참고 자료: