Python/FastAPI

[FastAPI] 웹소켓

K.Seungmin 2024. 9. 15. 14:01

오늘은 제가 프로젝트를 진행하면서 FastAPI를 통해 웹소켓을 공부한 것에 대해 소개해 드리겠습니다. 웹소켓은 실시간 통신을 가능하게 해 주기 때문에 필요한 상황에서 매우 유용한 기능입니다.

 

웹소켓이란?

웹소켓은 클라이언트와 서버 간의 양방향 통신을 가능하게 해주는 프로토콜입니다. HTTP와는 달리, 웹소켓은 연결이 수립된 후에는 지속적으로 열린 상태를 유지하며, 클라이언트와 서버가 서로 메시지를 주고받을 수 있습니다. 이로 인해 실시간 데이터 전송이 필요한 애플리케이션, 예를 들어 채팅 애플리케이션이나 실시간 알림 시스템에서 매우 유용하게 사용됩니다.

 

FastAPI에서 웹소켓 사용하기

FastAPI에서는 웹소켓을 쉽게 사용할 수 있도록 지원합니다. FastAPI의 WebSocket 클래스를 사용하면 간단하게 웹소켓 엔드포인트를 생성할 수 있습니다. 

from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"Message text was: {data}")
WebSocket : FastAPI의 웹소켓 객체
await websocket.accept() : 클라이언트의 연결 요청을 수락
await websocket.receive_text() : 클라이언트로부터 텍스트 메시지를 수신
await websocket.send_text() : 클라이언트에게 텍스트 메시지를 전송

 

추가로 receive_send_ 뒤에 붙는 형식들은 text, bytes, json이 있습니다. 이는 클라이언트와 주고받는 데이터의 형식에 따라서 알맞은 형식으로 설정해주면 됩니다. 추가로 웹소켓을 종료하고 싶을 때는 await websocket.close() 함수를 사용하면 웹소켓 연결을 종료할 수 있습니다.

 

웹소켓 연결 URL

1. HTTP 웹소켓 : 비보안 웹소켓 프로토콜, 암호화되지 않은 웹소켓 연결

ws://localhost:8000/ws

 

2. HTTPS 웹소켓 : 보안 웹소켓 프로토콜, SSL/TLS로 암호화된 웹소켓 연결

wss://<호스트>:<포트>/<경로>
SSL(Secure Sockets Layer) : 데이터 통신 보안을 위해 넷스케이프에서 개발한 프로토콜
TLS(Transport Layer Security) : SSL의 후속 프로토콜로 SSL의 보안 문제를 해결하기 위해 개발

 

웹소켓의 장점과 활용

웹소켓의 가장 큰 장점은 실시간 통신이 가능하다는 점입니다. 이를 통해 사용자 경험을 크게 향상시킬 수 있습니다. 예를 들어, 채팅 애플리케이션에서는 사용자가 메시지를 입력할 때마다 즉시 다른 사용자에게 전달되므로, 대화의 흐름이 자연스럽고 원활하게 이루어집니다. 또한, 실시간 알림 시스템에서도 웹소켓을 활용하여 사용자에게 즉각적인 피드백을 제공할 수 있습니다.

 

참고 자료

https://fastapi.tiangolo.com/advanced/websockets/

 

WebSockets - FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

fastapi.tiangolo.com