Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

HTML5 서버 전송 이벤트(SSE) 처리 방법 완벽 가이드

서버 전송 이벤트(Server-Sent Events)란?

서버 전송 이벤트(SSE, Server-Sent Events)는 HTML5에서 도입된 기술로, 서버가 클라이언트로 실시간 데이터를 푸시(push)할 수 있도록 해주는 표준 방식입니다. 웹소켓(WebSocket)과 달리 단방향 통신만 지원하지만, 구현이 간단하고 HTTP 프로토콜 위에서 동작하기 때문에 주식 시세, 뉴스 피드, 알림 등 지속적으로 업데이트되는 데이터를 전달하는 데 매우 유용합니다.

SSE 구현 예제 코드

HTML5에서 서버 전송 이벤트를 처리하려면 <eventsource> 요소를 사용하여 서버에 연결한 후, 자바스크립트로 이벤트를 수신하면 됩니다. 다음은 서버에서 전송된 시간 데이터를 화면에 표시하는 기본적인 예제입니다.

<!DOCTYPE HTML>
<html>
   <head>
      <script>
         document.getElementsByTagName("eventsource")[0].addEventListener("server-time", eventHandler, false);
         function eventHandler(event)
         {
            // 서버가 전송한 시간 데이터를 화면에 출력
            document.querySelector('#ticker').innerHTML = event.data;
         }
      </script>
   </head>
   <body>
      <div id = "sse">
         <eventsource src = "/cgi-bin/ticker.cgi" />
      </div>
      <div id = "ticker" name = "ticker">
         [TIME]
      </div>
   </body>
</html>

코드 동작 원리

위 코드의 동작 과정을 살펴보면 다음과 같습니다.

1. eventsource 요소 선언: <eventsource src="/cgi-bin/ticker.cgi" /> 태그가 서버의 CGI 스크립트와 연결을 설정합니다. 브라우저는 이 URL로 HTTP 연결을 열어두고 서버의 데이터를 기다립니다.

2. 이벤트 리스너 등록: addEventListener("server-time", eventHandler, false)를 통해 'server-time'이라는 이름의 이벤트가 발생할 때마다 eventHandler 함수가 실행되도록 등록합니다.

3. 데이터 수신 및 표시: 서버에서 이벤트가 도착하면 event.data 속성으로 전송된 데이터에 접근할 수 있으며, 이 값을 #ticker 요소의 내용으로 교체하여 화면에 실시간으로 갱신합니다.

서버 측 응답 형식

SSE가 정상적으로 동작하려면 서버는 text/event-stream MIME 타입으로 응답해야 합니다. 예를 들어 Perl CGI 스크립트라면 다음과 같이 작성할 수 있습니다.

print "Content-Type: text/event-stream\n\n";
while(true) {
   print "Event: server-time\n";
   $time = localtime();
   print "Data: $time\n\n";
   sleep(5);
}

이 스크립트는 5초마다 현재 시간을 'server-time' 이벤트로 클라이언트에 전송합니다.

참고 사항

최신 브라우저에서는 <eventsource> 태그 대신 자바스크립트의 new EventSource(url) 생성자를 사용하는 것이 표준적이며 더 널리 권장됩니다. 또한 SSE는 자동 재연결 기능을 내장하고 있어 연결이 끊겨도 브라우저가 자동으로 다시 연결을 시도한다는 장점이 있습니다.