단방향 구독 서비스 SSE

2021, Mar 26    

그래서 SSE가 뭐지

한번 연결을 맺으면 클라이언트에서는 지속적으로 서버 스트림을 수신한다.

SSE는 언제 쓰면 좋을까

일방적인 알림

  • 웹에서 쪽지(메시지)가 왔을때
  • 웹에서 클라우드 콘솔을 실행하고 결과를 받고싶을때
  • 뉴스알림

실습해보기

backend 서버 (Node)

const express = require('express')

const app = express()
app.use(express.static('public'))

app.get('/event', function(req, res) {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream', //핵심
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
  })
  countdown(res, 10)
})

function countdown(res, count) {
  res.write("data: " + count + "\n\n")
  if (count)
    setTimeout(() => countdown(res, count-1), 1000)
  else
    res.end()
}

app.listen(3000, () => console.log('SSE app listening on port 3000!'))

front-end (React)

import React, { useState, useEffect } from 'react';
import './App.css';

function App() {
  const [ facts, setFacts ] = useState([]);
  const [ listening, setListening ] = useState(false);

  useEffect( () => {
    if (!listening) {
      const events = new EventSource('http://localhost:3000/event');

      events.onmessage = (event) => {
        const parsedData = JSON.parse(event.data);

        setFacts((facts) => facts.concat(parsedData));
      };

      setListening(true);
    }
  }, [listening, facts]);

  return (
    <table className="stats-table">
      <tbody>
        {
          facts.map((fact, i) =>
            <tr key={i}>
              <td>{fact.info}</td>
              <td>{fact.source}</td>
            </tr>
          )
        }
      </tbody>
    </table>
  );
}

export default App;

서버를 쓸수 없다면?

https://pusher.com/

### https://www.digitalocean.com/community/tutorials/nodejs-server-sent-events-build-realtime-app