Python FastAPI를 이용한 웹소켓 기반 비동기(Async) 통신을 위한 네트워크 구성
웹 애플리케이션이 점점 복잡해지고 사용자와의 실시간 상호작용이 중요해짐에 따라, 비동기 통신과 웹소켓(WebSocket)의 활용이 필수적이 되었습니다. 이번 글에서는 Python의 FastAPI 프레임워크를 이용하여 웹소켓 기반의 비동기 통신을 구현하고, 이를 위한 네트워크 구성을 상세히 알아보겠습니다.
목차
1. 웹소켓과 비동기 통신의 이해
2. FastAPI와 웹소켓 통합
3. 프로젝트 구조 설정
4. 코드 구현
• 4.1. FastAPI 설치 및 기본 설정
• 4.2. 웹소켓 엔드포인트 작성
• 4.3. 클라이언트 코드 작성
5. 네트워크 구성 및 설정
• 5.1. 로컬 환경 설정
• 5.2. 배포 시 고려사항
6. 테스트 및 검증
7. 결론
1. 웹소켓과 비동기 통신의 이해
웹소켓(WebSocket)이란?
웹소켓은 클라이언트와 서버 간의 양방향 통신을 가능하게 하는 프로토콜로, HTTP와는 달리 연결이 지속되어 실시간 데이터 전송에 적합합니다.
비동기 통신의 필요성
비동기 통신은 서버의 응답을 기다리지 않고도 다른 작업을 수행할 수 있게 해주어 애플리케이션의 성능과 사용자 경험을 향상시킵니다.
2. FastAPI와 웹소켓 통합
FastAPI는 Python의 최신 비동기 기능을 활용한 고성능 웹 프레임워크로, 웹소켓을 쉽게 통합할 수 있습니다.
3. 프로젝트 구조 설정
my_websocket_project/
├── app.py
├── requirements.txt
└── templates/
└── index.html
4. 코드 구현
4.1. FastAPI 설치 및 기본 설정
먼저 필요한 패키지를 설치합니다.
pip install fastapi uvicorn
app.py 파일을 생성하고 기본 설정을 합니다.
from fastapi import FastAPI
app = FastAPI()
4.2. 웹소켓 엔드포인트 작성
웹소켓을 지원하기 위해 WebSocket 클래스를 임포트하고 엔드포인트를 추가합니다.
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.responses import HTMLResponse
app = FastAPI()
# 연결된 클라이언트를 관리하기 위한 매니저 클래스
class ConnectionManager:
def __init__(self):
self.active_connections: list[WebSocket] = []
async def connect(self, websocket: WebSocket):
await websocket.accept()
self.active_connections.append(websocket)
print("Client connected.")
def disconnect(self, websocket: WebSocket):
self.active_connections.remove(websocket)
print("Client disconnected.")
async def broadcast(self, message: str):
for connection in self.active_connections:
await connection.send_text(message)
manager = ConnectionManager()
@app.get("/")
async def get():
with open("templates/index.html") as f:
html_content = f.read()
return HTMLResponse(content=html_content, status_code=200)
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await manager.connect(websocket)
try:
while True:
data = await websocket.receive_text()
print(f"Received message: {data}")
await manager.broadcast(f"Client says: {data}")
except WebSocketDisconnect:
manager.disconnect(websocket)
4.3. 클라이언트 코드 작성
templates/index.html 파일을 생성하고 다음과 같이 작성합니다.
<!DOCTYPE html>
<html>
<head>
<title>WebSocket Test</title>
</head>
<body>
<h1>WebSocket 테스트</h1>
<input id="messageInput" type="text" placeholder="메시지를 입력하세요" />
<button onclick="sendMessage()">전송</button>
<ul id="messages">
</ul>
<script>
var ws = new WebSocket("ws://localhost:8000/ws");
ws.onmessage = function(event) {
var messages = document.getElementById('messages');
var message = document.createElement('li');
var content = document.createTextNode(event.data);
message.appendChild(content);
messages.appendChild(message);
};
function sendMessage() {
var input = document.getElementById("messageInput");
ws.send(input.value);
input.value = '';
}
</script>
</body>
</html>
5. 네트워크 구성 및 설정
5.1. 로컬 환경 설정
로컬에서 서버를 실행하려면 다음 명령어를 사용합니다.
uvicorn app:app --reload
서버는 기본적으로 http://localhost:8000에서 실행됩니다.
5.2. 배포 시 고려사항
• 포트 개방: 배포 환경에서는 웹소켓 통신을 위한 포트를 개방해야 합니다.
• 리버스 프록시 설정: Nginx와 같은 리버스 프록시를 사용하여 웹소켓 요청을 처리할 수 있도록 설정합니다.
• SSL/TLS 적용: 보안을 위해 HTTPS를 적용해야 하며, 웹소켓의 경우 wss:// 프로토콜을 사용합니다.
Nginx 설정 예시
server {
listen 80;
server_name your_domain.com;
location / {
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
6. 테스트 및 검증
브라우저에서 http://localhost:8000에 접속하여 메시지를 전송하고, 실시간으로 메시지가 표시되는지 확인합니다.
7. 결론
이번 글에서는 Python의 FastAPI를 이용하여 웹소켓 기반의 비동기 통신을 구현하고, 이를 위한 네트워크 구성을 살펴보았습니다. 웹소켓을 활용하면 실시간 기능을 손쉽게 구현할 수 있으므로, 다양한 웹 애플리케이션에 적용해 보시기 바랍니다.
참고 자료
• UVicorn