Python/Python Flask

Flask에서 WebSocket 구현하기

임베디드 친구 2025. 9. 22. 20:17
728x90
반응형

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. 실행 및 테스트

  1. Flask 서버를 실행합니다.
python app.py
  1. 웹 브라우저에서 http://localhost:5000에 접속합니다.
  2. 메시지를 입력하고 "전송" 버튼을 클릭하면, 서버와 클라이언트 간의 실시간 메시지 교환을 확인할 수 있습니다.

5. 확장 기능

실시간 채팅 구현

다수의 사용자와 실시간 채팅을 구현하려면 join_roomleave_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의 유연성을 경험해 보길 바랍니다.

반응형