[python] FastAPI에서 소켓 통신 구현하기

FastAPI는 Python으로 빠르게 API를 개발할 수 있는 강력한 프레임워크입니다. 하지만 FastAPI는 기본적으로 HTTP 프로토콜을 사용하므로, 때로는 다른 프로토콜인 소켓 통신이 필요할 수 있습니다. 이번 블로그 포스트에서는 FastAPI에서 소켓 통신을 구현하는 방법을 알아보겠습니다.

FastAPI와 Starlette의 WebSocket 지원

FastAPI는 Starlette라는 ASGI 프레임워크를 기반으로 하고 있습니다. Starlette는 웹 소켓을 지원하기 위한 WebSocketEndpoint라는 클래스를 제공합니다. 이를 활용하여 FastAPI 애플리케이션 내에서 소켓 통신을 구현할 수 있습니다.

from fastapi import FastAPI
from fastapi.websockets import WebSocket
from starlette.routing import WebSocketRoute

app = FastAPI()

async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"You sent: {data}")

app.add_route("/ws", WebSocketRoute(websocket_endpoint))

위의 코드는 FastAPI 애플리케이션에 /ws 경로로 접근하는 WebSocket 연결을 처리하는 핸들러 함수 websocket_endpoint를 추가하는 예시입니다. websocket_endpoint 함수는 WebSocket 객체를 인자로 받아서 데이터를 수신하고 다시 클라이언트로 응답을 보내는 동작을 반복합니다.

클라이언트와 소켓 통신하기

FastAPI에서 소켓 통신을 구현했다면, 클라이언트 측에서도 소켓 통신을 수행해야 합니다. WebSockets API를 활용하여 클라이언트에서 소켓 연결을 설정하고 데이터를 주고받을 수 있습니다.

const socket = new WebSocket("ws://localhost:8000/ws");

socket.onopen = () => {
    console.log("소켓 연결 성공");
};

socket.onmessage = (event) => {
    const data = event.data;
    console.log(`서버에서 받은 데이터: ${data}`);
};

socket.send("Hello from client!");

위의 JavaScript 코드는 ws://localhost:8000/ws 경로로 소켓 연결을 설정하고, 연결이 성공한 후 서버로부터 데이터를 수신하면 콘솔에 출력하는 예시입니다. 마지막으로 send 함수를 이용하여 서버로 데이터를 전송할 수 있습니다.

결론

FastAPI와 Starlette의 WebSocket 기능을 활용하면 손쉽게 FastAPI 애플리케이션에서 소켓 통신을 구현할 수 있습니다. 이를 통해 실시간성이 중요한 애플리케이션을 개발할 때 유용하게 활용할 수 있습니다.