반응형

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;
반응형