서버 전송 이벤트

Server-Sent Events

열린 HTTP 응답을 통해 서버가 브라우저에 이벤트를 연속으로 보냅니다.

···
html
<div class="n-demo"><div class="n-head"><strong>ONE-WAY EVENT STREAM</strong><span>LIVE TRACE</span></div><div class="n-stage"><div class="sse"><div class="sse-server n-box">SERVER</div><div class="sse-wire">→<small id="sse-wire">OPEN</small></div><div class="sse-log n-box"><span id="sse0">id: 41 · ready</span><span id="sse1">id: 42 · update</span><span id="sse2">id: 43 · done</span></div></div></div><div class="n-foot">tap to step · auto replay</div></div>
css
.n-demo{width:min(94vw,760px);height:min(88vh,324px);padding:clamp(9px,2.2vmin,18px);border:1px solid var(--line);border-radius:13px;background:var(--surface);display:flex;flex-direction:column;gap:clamp(5px,1.3vmin,10px);font:600 clamp(12px,2.4vmin,16px)/1.3 "Pretendard Variable",Pretendard,-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo",sans-serif;overflow:hidden}.n-head,.n-foot{display:flex;justify-content:space-between;align-items:center;color:var(--muted)}.n-head strong{color:var(--accent)}.n-head span,.n-foot{font-size:12px}.n-stage{flex:1;min-height:0;position:relative;display:flex;align-items:center;justify-content:center;gap:clamp(4px,1vmin,10px)}.mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.n-box{padding:clamp(5px,1.5vmin,11px);border:1px solid var(--line);border-radius:8px;background:var(--bg);text-align:center}.n-on{border-color:var(--accent)!important;color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 12%,var(--surface))!important}.n-muted{color:var(--muted)}@media(max-width:400px){.n-head span{display:none}}.sse{width:96%;display:flex;align-items:center;gap:8px}.sse-server{width:27%}.sse-wire{display:grid;text-align:center;color:var(--accent);font-size:22px}.sse-wire small{font-size:10px;color:var(--muted)}.sse-log{width:59%;display:grid;text-align:left;gap:4px;padding:6px}.sse-log span{font:600 11px/1.25 ui-monospace,monospace;opacity:.28;transition:opacity .3s}.sse-log span.n-on{opacity:1}@media(min-width:500px){.sse-wire small{font-size:12px}.sse-log span{font-size:12px}}
js
let step=0;function advance(){for(let i=0;i<3;i++)document.getElementById('sse'+i).classList.toggle('n-on',i<=Math.min(step,2));document.getElementById('sse-wire').textContent=step===3?'RECONNECT':'OPEN';step=(step+1)%4}
const clickTarget=document.querySelector('.n-demo');if(clickTarget&&typeof advance==='function'){advance();const timer=setInterval(advance,1050);clickTarget.addEventListener('pointerdown',()=>{clearInterval(timer);advance()})}

Server-Sent Events는 EventSource가 열어 둔 HTTP 연결에서 서버가 텍스트 이벤트를 차례로 보내는 방식입니다. 브라우저는 연결이 끊기면 재접속할 수 있고 마지막 이벤트 ID로 이어받을 수 있습니다.

데모는 한 방향의 이벤트 로그가 쌓이다 연결이 끊긴 뒤 다시 이어지는 흐름입니다. 클라이언트에서 서버로 자주 메시지를 보내야 한다면 다른 양방향 전송 방식이 맞습니다.

언제 쓰나

알림·진행 상황·피드처럼 서버에서 브라우저로만 자주 갱신할 때 사용합니다.

페이지로 열기 ↗