SSE(Server Sent Events)
Polling

- 클 → 서 일정한 주기로 지속적 요청
- 리소스 낭비
Web Socket

- 실시간 양방향, TCP
- 채팅이나 게임 같이 사용자가 서버의 데이터에 즉각 반응해야 하는 경우라면 WebSocket을 사용하는 것이 더 효율적이겠지만 많은 경우 클라이언트 측에서의 반응은 필요가 없습니다. 주식차트, 뉴스피드, 푸시 노티피케이션 등이 대표적인 예입니다.
SSE

- 서 → 클: 단방향, http 프로토콜 기반으로 Real-Time Push Notification 전송
- 클라이언트의 요청에 의해 한 번 연결이 맺어지면 서버가 원하는 시점에 클라이언트에게 원하는 메시지를 전송할 수 있다. 이러한 특징 덕분에 최소의 오버헤드로 모니터링 시스템의 그래프 갱신, 채팅 및 메신저 등의 비지니스에 광범위하게 적용할 수 있다.
- 실시간 알림에서 클라이언트로부터 요청은 필요 없을 것으로 예상, 웹소켓보다 가벼움
- 별도 프로토콜 사용 X
- 자동 재연결
- 최대 동시 접속 수는 HTTP/1.1의 경우 브라우저 당 6개이며, HTTP/2는 100개까지 가능
- IE 지원 X
- HTML과 JavaScript만으로 구현할 수 있으므로 현재 지원되지 않는 브라우저(IE 포함)도 polyfill을 이용해 크로스 브라우징이 가능
- UTF-8 인코딩된 문자열 지원, JSON 마샬링
Event Stream
// 고유 id 같이 보내기. // id 설정 시 브라우저가 마지막 이벤트를 추적하여 서버 연결이 끊어지면 // 특수한 HTTP 헤더(Last-Event-ID)가 새 요청으로 설정됨. // 브라우저가 어떤 이벤트를 실행하기에 적합한 지 스스로 결정할 수 있게 됨. id: 12345\n data: first line\n data: second line\n\n
- 예시
// JSON 형식 예시 data: {\n data: "msg": "hello world",\n data: "id": 12345\n data: }\n\n // event 이름 설정 id: 12345\n event: sse\n data: {"msg": "hello world", "id": 12345}\n\n
SSE - Spring
- Spring 4.2부터 SSE 통신 지원하는 SseEmitter클래스 지원
- Spring 5부터는 WebFlux로도 가능
클라이언트
- 처음 연결 필요
- 서버로부터 스트림을 받아 EventSource 객체를 통해 서버가 푸시하는 데이터를 받아 처리하면 됨
var es = new EventSource(stream_url); es.onmessage = function (event) { // 이벤트 설정이안된 기본 데이터 처리 }; es.addEventListener('myevent', function(e) { // 'myevent' 이벤트의 데이터 처리 }, false);
onmessage
- 기본 메시지가 왔을 때 호출
onopen
- 접속이 맺어졌을 때 호출
onerror
- 오류 발생 시 호출
EventSource
의addEventListener()
를 사용하면 위 3개의 이벤트뿐만 아니라 따로 지정된 이벤트의 데이터도 받아 처리할 수 있습니다.
- 서버에서 연결을 만료해도 클라이언트의 브라우저 레벨에서 자동으로 EventStream의 새로운 생성을 요청하기 때문에 큰 흐름에서 EventStream은 유지된다
서버
- EventSource를 통해 날아오는 요청을 처리
- MIME 타입 (text/event-stream)

- Last-Event-ID?
- sse 연결이 끊어졌는데 알림이 발생할 때 → 클라이언트에 도달X
- 클라이언트가 마지막으로 수신한 데이터의 id값을 의미
- 유실된 데이터 다시 보낼 수 있기 위함
- 항상 담겨있는 것은 아님
Last-Event-Id = 3_1631593143664 {3_1631593143664, data1} //여기까지 제대로 전송된 상태 확인 가능 {3_1831593143664, data3} {3_1731593143664, data2}
${userId}_${System.currentTimeMillis()}
형식MODI에서 알림은?
파티 공유 계정 변경 알림
- 공유계정 변경 (아이디와 비밀번호 모두 변경 가능?, 몇 번까지 얼마나 자주 변경 가능한지?)
공유계정 정보가 변경되었습니다.
- 파티장 파티원 모두?
파티 생성/참여 관련 알림
- 파티가 1일 후 시작됩니다 startDate -1
- mustFilled false
- mustFilled true && 인원이 모두 찼을 때
- 파티가 1일 후 시작됩니다.
- 파티의 인원이 다 채워지지 않아 파티가 삭제됩니다
- mustFilled true && 인원이 모두 차지 않았을 때
- 파티가 1일 후 만료됩니다
- endDate -1
- 파티원 참여시 파티장에게 파티원 참여 알림
- 파티가 만료되었습니다.
- 알림 읽음 기능 Patch
- 유저의 모든 알림 확인 기능
- 1 유저 N 멤버: 어떤 형식으로?
참고
samouss • Updated Nov 30, 2021