티스토리 뷰

카테고리 없음

[네트워크] SSE

Goozy 2019. 12. 24. 23:54

웹에서 알림을 구현하는 방식들

Polling

  • 클라이언트가 주기적인 시간으로 서버에 요청하여 데이터 상태를 확인하는 방식입니다.

  • 서버쪽의 데이터 상태가 자주 변경되지 않는다면 불필요한 요청 및 응답이 발생합니다.

Long Polling

  • Polling 방식과 비슷하지만 서버로 요청하여 일정한 시간동안 연결을 열어두고 서버로부터 응답을 받는 방식입니다.

  • Polling 보다 서버로 잦은 요청을 하지 않는 장점이 있습니다.

Streaming

  • 클라이언트가 한번 요청 이후에 서버는 응답을 완료하지 않고 스트림을 통해 이벤트가 발생할 때마다 데이터를 전송합니다.

  • 무한하게 혹은 지정한 시간만큼만 연결을 유지한 상태로 데이터를 받을 수 있습니다.

WebSocket

  • 클라이언트와 서버가 양방향 통신을 할 수 있도록 지원하는 프로토콜입니다.

Server Sent Events(SSE)

  • 클라이언트에서 폴링을 사용하지 않고 HTTP 커넥션을 통해 서버에서 이벤트 발생시 클라이언트로 데이터를 푸시하는 기술입니다.

  • Stream 방식과 같이 단방향 통신이며, WebSocket은 양방향 통신입니다.

  • HTML5 에서 EventSource API를 활용하여 SSE를 동작시킬 수 있습니다.

이벤트는 서버 내부에서 발생할 수 있고 외부 요청으로 인해 이벤트가 발생할 수도 있습니다.
저는 외부 요청으로 인한 이벤트가 발생시 예제를 만들어봤습니다.

다수의 사용자가 존재할 때,
특정 사용자 A가 이벤트를 발생시키면,
A와 관련된 사용자에게 알림이 가는 상황을 예를 들어보겠습니다.

먼저, B와 C의 사용자는 알림을 받기위해 서버와 연결을 합니다.

NotifyService에서 setUserEmitter() 메소드는 접속한 사용자의 SseEmitter를 Map에 저장합니다.

  • Map은 Thread Safe을 위해서 ConcurrentHashMap 을 사용했습니다.

A의 사용자가 이벤트를 호출합니다.

NotifyService에서 callNotify() 메소드는 특정 이벤트를 호출합니다.

  • 이 코드는 callNotify()를 호출한 사용자가 특정 사용자들에게 알림 이벤트를 발생시킵니다.

더 자세한 코드가 궁금하시다면...
https://github.com/hyperpace/spring-study/tree/study/sse

 

hyperpace/spring-study

Contribute to hyperpace/spring-study development by creating an account on GitHub.

github.com

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함