반응형
📌 1. 백엔드 (Flask) - SSE 엔드포인트 만들기
SSE는 클라이언트가 HTTP 연결을 열고 서버가 텍스트 스트림을 지속적으로 보내는 방식이야. Flask에서 SSE를 처리하려면 stream_with_context를 사용해줘야 해.
Flask 코드 예시:
from flask import Flask, Response, stream_with_context
import time
app = Flask(__name__)
@app.route('/stream')
def stream():
def event_stream():
while True:
# 서버에서 데이터를 지속적으로 보내줌
time.sleep(1)
yield f"data: 현재 서버 시간: {time.strftime('%Y-%m-%d %H:%M:%S')}\n\n"
return Response(stream_with_context(event_stream()), mimetype="text/event-stream")
if __name__ == '__main__':
app.run(debug=True, threaded=True)
설명:
- yield를 통해 데이터 스트림을 계속 보내.
- mimetype="text/event-stream"을 반드시 설정해야 해.
- 각 메시지는 data:로 시작하고 \n\n으로 끝나야 해.
📌 2. 프론트엔드 (React) - SSE 수신 코드
React에서는 기본 브라우저 API인 EventSource를 이용해서 서버로부터 오는 이벤트를 받을 수 있어.
React 코드 예시:
import React, { useEffect, useState } from 'react';
function SSEComponent() {
const [messages, setMessages] = useState([]);
useEffect(() => {
const eventSource = new EventSource('http://localhost:5000/stream');
eventSource.onmessage = (e) => {
console.log('새 메시지:', e.data);
setMessages(prevMessages => [...prevMessages, e.data]);
};
eventSource.onerror = (err) => {
console.error('SSE 연결 에러:', err);
eventSource.close();
};
return () => {
eventSource.close();
};
}, []);
return (
<div>
<h1>서버에서 오는 메시지들</h1>
<ul>
{messages.map((msg, idx) => (
<li key={idx}>{msg}</li>
))}
</ul>
</div>
);
}
export default SSEComponent;
설명:
- EventSource 객체를 생성해서 서버 /stream에 연결해.
- .onmessage 핸들러에서 서버가 보내주는 데이터를 받을 수 있어.
- 에러나 컴포넌트 언마운트 시 eventSource.close()로 연결을 닫아줘야 해.
📌 3. 추가 주의사항
- CORS 문제 발생할 수 있어. Flask에 CORS 설정이 필요할 수 있음.
from flask_cors import CORS app = Flask(__name__) CORS(app)
- pip install flask-cors
- 서버 타임아웃 주의!
- 배포할 때는 gunicorn 같은 WSGI 서버에서 keep-alive 설정을 잘 해줘야 함.
- 클라우드나 프록시 서버가 중간에 연결을 끊지 않게 주의해야 해.
- SSE는 단방향 통신 (서버 ➔ 클라이언트) 방식이야. 클라이언트가 서버에 데이터를 보내려면 별도 API를 써야 해.
✅ 요약
역할 기술 요소 비고
백엔드 | Flask + stream_with_context + text/event-stream | 주기적으로 데이터 yield |
프론트엔드 | React + EventSource | .onmessage로 수신 처리 |
기타 | CORS 설정, Keep-Alive 주의 | 배포 환경에 따라 추가 세팅 |
반응형