Flask에서 WebSocket 구현하기
Flask는 Python으로 작성된 가볍고 사용하기 쉬운 웹 프레임워크로, RESTful API 개발뿐만 아니라 WebSocket과 같은 실시간 통신 기능도 구현할 수 있습니다. 이번 포스팅에서는 Flask에서 WebSocket을 구현하는 방법을 소개하고, 실제 예제를 통해 실시간 통신 애플리케이션을 만들어 보겠습니다.
WebSocket이란?
WebSocket은 클라이언트와 서버 간의 양방향 통신을 가능하게 하는 프로토콜입니다. 일반적인 HTTP 요청-응답 모델과 달리, WebSocket은 연결이 유지되는 동안 클라이언트와 서버가 데이터를 자유롭게 주고받을 수 있습니다. 이를 통해 실시간 채팅, 알림 시스템, 실시간 데이터 스트리밍 등의 애플리케이션을 효율적으로 개발할 수 있습니다.
Flask에서 WebSocket 사용하기
Flask 자체는 WebSocket을 기본적으로 지원하지 않지만, flask-socketio
확장 라이브러리를 사용하면 쉽게 WebSocket을 구현할 수 있습니다. flask-socketio
는 WebSocket뿐만 아니라 폴링 방식도 지원하므로 다양한 환경에서 호환성을 제공합니다.
1. 환경 설정 및 설치
아래 명령어를 사용하여 Flask와 flask-socketio를 설치합니다.
pip install flask flask-socketio
2. 기본 WebSocket 서버 구현
flask-socketio
를 사용하여 간단한 WebSocket 서버를 구현해 보겠습니다.
서버 코드 예제
from flask import Flask, render_template
from flask_socketio import SocketIO, send, emit
# Flask 애플리케이션 생성
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
# 기본 라우트
@app.route('/')
def index():
return render_template('index.html')
# WebSocket 이벤트 처리
@socketio.on('message')
def handle_message(message):
print(f'Received message: {message}')
send(f'Echo: {message}')
@socketio.on('custom_event')
def handle_custom_event(data):
print(f'Received data: {data}')
emit('response', {'data': f'Received your data: {data}'})
if __name__ == '__main__':
socketio.run(app, debug=True)
클라이언트 코드 예제
templates/index.html
파일을 생성하고 아래 코드를 작성합니다.
<!DOCTYPE html>
<html>
<head>
<title>WebSocket 테스트</title>
<script src="https://cdn.socket.io/4.5.0/socket.io.min.js"></script>
</head>
<body>
<h1>Flask WebSocket 예제</h1>
<input id="message" type="text" placeholder="메시지를 입력하세요">
<button onclick="sendMessage()">전송</button>
<script>
const socket = io();
socket.on('connect', () => {
console.log('WebSocket 연결 성공');
});
socket.on('message', (data) => {
console.log('서버로부터 메시지:', data);
});
socket.on('response', (data) => {
console.log('서버 응답:', data);
});
function sendMessage() {
const message = document.getElementById('message').value;
socket.emit('message', message);
}
</script>
</body>
</html>
3. 주요 코드 설명
@socketio.on('message')
:- 클라이언트에서 기본 메시지를 전송할 때 호출되는 이벤트 핸들러입니다.
send
를 사용하여 클라이언트로 메시지를 다시 전송합니다.
@socketio.on('custom_event')
:- 커스텀 이벤트(
custom_event
)를 처리하는 핸들러입니다. - 데이터를 받아
emit
을 사용해 클라이언트로 응답을 보냅니다.
- 커스텀 이벤트(
클라이언트에서
socket.emit
을 호출하면 서버의 해당 이벤트 핸들러가 실행됩니다.
4. 실행 및 테스트
- Flask 서버를 실행합니다.
python app.py
- 웹 브라우저에서
http://localhost:5000
에 접속합니다. - 메시지를 입력하고 "전송" 버튼을 클릭하면, 서버와 클라이언트 간의 실시간 메시지 교환을 확인할 수 있습니다.
5. 확장 기능
실시간 채팅 구현
다수의 사용자와 실시간 채팅을 구현하려면 join_room
과 leave_room
메서드를 사용하여 방(room) 개념을 도입할 수 있습니다.
from flask_socketio import join_room, leave_room
@socketio.on('join')
def on_join(data):
username = data['username']
room = data['room']
join_room(room)
send(f'{username} has entered the room.', to=room)
@socketio.on('leave')
def on_leave(data):
username = data['username']
room = data['room']
leave_room(room)
send(f'{username} has left the room.', to=room)
클라이언트 코드 확장
function joinRoom(room) {
socket.emit('join', {username: '사용자1', room: room});
}
function leaveRoom(room) {
socket.emit('leave', {username: '사용자1', room: room});
}
결론
Flask와 flask-socketio
를 사용하면 WebSocket 기반의 실시간 애플리케이션을 쉽게 개발할 수 있습니다. 이번 포스팅에서 소개한 기본 예제를 기반으로, 채팅 애플리케이션, 실시간 데이터 스트리밍, 알림 시스템 등 다양한 애플리케이션을 만들어 보세요. 실시간 통신의 가능성을 확장하며 Flask의 유연성을 경험해 보길 바랍니다.
'Python > Python Flask' 카테고리의 다른 글
Flask에서 Celery를 사용한 비동기 작업 처리 (0) | 2025.09.23 |
---|---|
Flask-Blueprint로 애플리케이션 구조화하기 (0) | 2025.09.21 |
Flask 애플리케이션 Docker로 배포하기 (0) | 2025.09.20 |
Flask 애플리케이션 배포: Gunicorn 및 Nginx를 활용한 배포 방법 (0) | 2025.09.19 |
Flask 배포 가이드: 개발 환경과 배포 환경 설정 (0) | 2025.09.18 |