반응형
React를 통해 실시간으로 데이터를 확인하려면 WebSockets 또는 Server-Sent Events(SSE)와 같은 실시간 데이터 솔루션을 사용해야 한다.
이러한 기술을 사용하면 업데이트를 위해 수동으로 서버를 폴링하지 않고도 서버에서 업데이트를 사용할 수 있는 즉시 받을 수 있다.
해당 예제는 jira ticket을 이용한 예제이며 서버는 2초마다 업데이트를 보내고 React 클라이언트는 새 업데이트를 받을 때마다 티켓 상태를 업데이트한다.
Server-Sent Event(SSE)
Server-side (Node.js + Express):
const express = require("express"); const app = express(); app.get("/sse", (req, res) => { res.writeHead(200, { "Content-Type": "text/event-stream", "Cache-Control": "no-cache", Connection: "keep-alive", }); // Simulate a real-time data source setInterval(() => { const data = { key: "TICKET-123", fields: { summary: "This is a sample ticket", status: { name: "Open", }, }, }; res.write(`data: ${JSON.stringify(data)}\n\n`); }, 2000); }); app.listen(3000, () => { console.log("SSE server listening on port 3000"); });
Client-side (React):
import React, { useState, useEffect } from "react"; const JiraTicket = () => { const [ticket, setTicket] = useState({}); useEffect(() => { const eventSource = new EventSource("http://localhost:3000/sse"); eventSource.onmessage = (event) => { setTicket(JSON.parse(event.data)); }; return () => { eventSource.close(); }; }, []); return ( <div> <h1>{ticket.key}</h1> <p>{ticket.fields.summary}</p> <p>{ticket.fields.status.name}</p> </div> ); }; export default JiraTicket;
WebSocket
Server-side (Node.js + Express + WebSockets):
const express = require("express"); const http = require("http"); const WebSocket = require("ws"); const app = express(); const server = http.createServer(app); const wss = new WebSocket.Server({ server }); wss.on("connection", (ws) => { console.log("Client connected"); // Simulate a real-time data source setInterval(() => { const data = { key: "TICKET-123", fields: { summary: "This is a sample ticket", status: { name: "Open", }, }, }; ws.send(JSON.stringify(data)); }, 2000); ws.on("close", () => { console.log("Client disconnected"); }); }); server.listen(3000, () => { console.log("WebSockets server listening on port 3000"); });
Client-side (React):
import React, { useState, useEffect } from "react"; const JiraTicket = () => { const [ticket, setTicket] = useState({}); useEffect(() => { const ws = new WebSocket("ws://localhost:3000"); ws.onmessage = (event) => { setTicket(JSON.parse(event.data)); }; return () => { ws.close(); }; }, []); return ( <div> <h1>{ticket.key}</h1> <p>{ticket.fields.summary}</p> <p>{ticket.fields.status.name}</p> </div> ); }; export default JiraTicket;
반응형
'Basic > React' 카테고리의 다른 글
React, Apollo graphql을 이용한 todo list 만들기 (0) | 2023.02.17 |
---|---|
nextjs에서 파일에 []를 사용하는 이유 (0) | 2023.02.17 |
vite에서 proxy 설정하기 (0) | 2023.02.07 |
[React] export 'Switch' (imported as 'Switch') was not found in 'react-router-dom' (0) | 2023.02.03 |
[React] <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment> (0) | 2023.02.01 |