HTML - 서버 전송 이벤트

안녕하세요, 웹 개발자 지망생 여러분! 오늘 우리는 서버 전송 이벤트(Server-Sent Events, SSE)의 흥미로운 세상으로 뛰어들어 보겠습니다. 프로그래밍에 처음이신 분들도 걱정 마세요; 저는 이 주제를 단계별로 안내해 드릴 것입니다. 수년간 수많은 학생들을 가르친 경험을 바탕으로 말입니다. 그럼 커피 한 잔을 마시면서 시작해 보세요!

HTML - Server Sent Events

서버 전송 이벤트는 무엇인가요?

코드로 들어가기 전에, 서버 전송 이벤트가 무엇인지 이해해 보겠습니다. 가상으로 실시간으로 진행되는 스포츠 경기를 온라인에서 시청하는 걸 상상해 보세요. 페이지를 새로 고침 없이 실시간으로 점수 업데이트를 보고 싶습니다. 이때 서버 전송 이벤트가 유용하게 쓰입니다!

서버 전송 이벤트는 웹 페이지가 서버로부터 자동으로 업데이트를 받을 수 있게 합니다. 서버와 직통 전화线路을 가지고 있는 것처럼, 서버가 언제든지 메시지를 보낼 수 있고, 반복적으로 요청할 필요 없이 메시지를 받을 수 있습니다.

웹 애플리케이션에서 SSE를 어떻게 사용하나요?

이제 개념을 이해했으므로, 우리 웹 애플리케이션에 SSE를 어떻게 구현할 수 있는지 살펴보겠습니다. 먼저 클라이언트 측 코드를 작성해 보겠습니다. 이 코드는 HTML과 JavaScript로 작성됩니다.

단계 1: EventSource 객체 생성

먼저 JavaScript 코드에서 EventSource 객체를 생성해야 합니다. 이 객체는 서버와의 연결을 설정합니다.

<h1>실시간 스포츠 점수</h1>
<div id="score"></div>

<script>
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("score_updates.php");
source.onmessage = function(event) {
document.getElementById("score").innerHTML = event.data;
};
} else {
document.getElementById("score").innerHTML = "죄송합니다, 브라우저가 서버 전송 이벤트를 지원하지 않습니다...";
}
</script>

이를 해석해 보면:

  1. 우리는 제목과 div 요소를 생성하여 점수를 표시할 공간을 마련합니다.
  2. 스크립트에서 먼저 브라우저가 EventSource를 지원하는지 확인합니다.
  3. 지원하면 새로운 EventSource 객체를 생성하고, 서버 측 스크립트의 URL을 지정합니다.
  4. 그런 다음 onmessage 이벤트 핸들러를 설정합니다. 서버로부터 메시지를 받을 때마다 이 함수가 호출됩니다.
  5. 함수 내부에서 "score" div 요소의 내용을 서버로부터 받은 데이터로 업데이트합니다.
  6. 브라우저가 SSE를 지원하지 않으면 사용자에게 알림 메시지를 표시합니다.

서버 측 스크립트 для SSE

이제 서버 측 스크립트를 설정하여 이벤트를 전송하는 방법을 살펴보겠습니다. 이 예제에서는 PHP를 사용하지만, 다른 서버 측 언어에서도 비슷한 개념이 적용됩니다.

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

function sendUpdate($score) {
echo "data: $score\n\n";
ob_flush();
flush();
}

$score = 0;
while (true) {
$score++;
sendUpdate("현재 점수: $score");
sleep(5);  // 다음 업데이트 전에 5초 대기
}
?>

이 스크립트를 분석해 보면:

  1. 적절한 SSE 헤더를 설정합니다.
  2. sendUpdate 함수를 정의하여 SSE 형식으로 데이터를 전송합니다.
  3. 무한 루프를 시작합니다(실제 애플리케이션에서는 중지 조건을 설정해야 합니다).
  4. 각 반복에서 점수를 증가시키고 업데이트를 전송합니다.
  5. 다음 업데이트 전에 5초를 대기합니다.

서버 전송 이벤트 처리

이제 클라이언트와 서버 측 코드가 모두 준비되었으므로, 다양한 이벤트를 처리하는 방법을 살펴보겠습니다.

<h1>실시간 스포츠 업데이트</h1>
<div id="score"></div>
<div id="commentary"></div>

<script>
var source = new EventSource("sports_updates.php");

source.addEventListener('score', function(e) {
document.getElementById('score').innerHTML = e.data;
}, false);

source.addEventListener('commentary', function(e) {
document.getElementById('commentary').innerHTML = e.data;
}, false);

source.onerror = function(e) {
console.log("오류: " + e);
};
</script>

이 예제에서:

  1. 우리는 점수와 해설을 표시할 두 개의 div 요소를 생성합니다.
  2. 두 가지 유형의 이벤트('score'와 'commentary')에 대한 이벤트 리스너를 설정합니다.
  3. 각 이벤트는 다른 요소를 업데이트합니다.
  4. 오류 처리를 위해 오류 핸들러를 추가합니다.

서버 측 스크립트는 다음과 같을 수 있습니다:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

function sendEvent($event, $data) {
echo "event: $event\n";
echo "data: $data\n\n";
ob_flush();
flush();
}

$score = 0;
$commentary = ["위대한 세이브!", "까다로운 슛!", "黄 카드!"];

while (true) {
$score++;
sendEvent('score', "현재 점수: $score");

if ($score % 3 == 0) {
$randomComment = $commentary[array_rand($commentary)];
sendEvent('commentary', $randomComment);
}

sleep(5);
}
?>

이 스크립트는 'score' 이벤트를 매 5초마다 전송하고, 'commentary' 이벤트는 점수가 3의 배수가 될 때마다 전송합니다.

메서드 표

사용한 주요 메서드를 요약한 표입니다:

메서드 설명
new EventSource(url) 서버와의 새로운 연결 생성
EventSource.onmessage 특정 이벤트 이름 없이 메시지 처리
EventSource.addEventListener(event, callback) 특정 이벤트 이름을 가진 메시지 처리
EventSource.onerror 연결에서 발생한 오류 처리

결론

이렇게 서버 전송 이벤트의 기본 개념과 클라이언트 및 서버 측 코드 설정 방법을 다루었습니다. SSE는 실시간 웹 애플리케이션을 만드는 강력한 도구이지만, 단방향 통신만을 지원합니다. 양방향 통신이 필요하다면 미래에 WebSocket을 탐구해 보세요.

어떤 프로그래밍 개념이든, 실제로 만들어 보는 것이 가장 중요합니다. 자신만의 SSE 애플리케이션을 만들어 보세요 - 실시간 채팅 시스템이나 주식 정보 티커 등이 될 수 있습니다. 가능성은 무한합니다!

미래의 웹 개발자 여러분, 기억하세요, 모든 전문가는 초보자였습니다. 일단 이해가 되지 않더라도 낙담하지 마세요. 계속 연습하면 곧 프로가 될 것입니다! 행복하게 코딩하세요!

Credits: Image by storyset