Angular에서의 Sse Handling
어제는 Spring Webflux와 Spring MVC에서 SSE를 사용한 단방향 이벤트 통신이 어떻게 이뤄질 수 있는지 알아보았다.
그렇다면 이 이벤트들을 화면단에 받아서 리액티브한 페이지를 만드려면 어떻게 해야할까?
https://medium.com/swlh/how-do-server-sent-events-sse-or-eventsource-work-in-angular-e9e27b6a3295
EventSource
ReactiveX 재단의 대표 리액티브 라이브러리인 RxJS에서는 Observable을 사용하여 SSE를 이벤트 소스로써 구독하고, 수신한 이벤트를 데이터로써 리액티브하게 다루는 방법을 제공한다.
리액티브 스트림 표준에 알맞게 EventSource는 next
, error
를 통해서 다음 시그널에 대한 데이터를 처리하고 예외를 처리할 수 있도록 지원한다.
어려운 점은 데이터를 리액티브하게 받는 동시에 View 또한 리액티브하게 변경해야 한다는 점이다. 이건 다음 기회에 알아보도록 하는 것으로..
왜 기본 HttpClient에서 지원하지 않을까
지난번에도 알아봤지만, WebSocket과는 달리 Server Sent Event는 HTTP 표준 스펙이다.
그런데 Angular의 기본 HttpClient에서는 SSE를 구독할 수 있는 방법을 제공하지 않는다. 조금 더 찾아보니 React도 마찬가지인 듯 하다.
왜 기본 Http Client에서 표준 http 스펙인 SSE를 지원하지 않을까?
- MS IE와 Edge 브라우저에서는 SSE를 지원하지 않는다.
- 따라서 MS의 브라우저에서 SSE를 지원하려면 polyfill을 사용해야 한다.
- EventSource API는 커스텀 헤더를 지원하지 않는다.
- 제일 중요한 것 같은데, 이미 EventSource가 SSE를 지원하는 표준 API가 된 듯하다. (MDN 문서)
- 그리고 나는 여기에 ReactiveX 재단의 영향력이 상당 부분 미쳤다고 생각한다.
특히 기본 SSE 스펙 자체에 비즈니스적인 로직을 끼얹어 커스텀해서 사용해야 하는 경우에는 EventSource에서 받지 못하는 경우가 많은 것 같다. (특히 토큰 인증 등)
이러한 제약 때문에 RxJs의 EventSource를 사용하지 않고 sse.js와 같은 외부 라이브러리를 사용하는 경우도 있는 것 같다.