SSE(Server-Sent Events)

일반적으로 웹 페이지에서 서버에 데이터를 요청하는 전통적인 방식의 HTTP 프로토콜이지만, 서버가 웹 페이지에 메시지를 푸시할 수 있다. 즉, 서버에서 사용자에게 데이터를 보내는 방식이 가능하다. 수신된 메시지는 이벤트+데이터로 처리될 수 있다.

SSE는 웹 소켓과 거의 동일하게 작동하며, 소켓과 달리 단방향 통신만 가능하다.

const evtSource = new EventSource("ssedemo.php");

evtSource.onmessage = function(event) {
  const newElement = document.createElement("li");
  const eventList = document.getElementById("list");

  newElement.textContent = "message: " + event.data;
  eventList.appendChild(newElement);
}

React Native 모바일 플랫폼에서는 폴리필로 구현된 EventSource 라이브러리를 이용할 수 있다.

GitHub - boy672820/reactnative-sse: React native SSE 테스트, react-native-sse 사용

React Native에서 EventSource 사용

MDN 참조: https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events

Nest.js에서 제공하는 SSE

// controller
@Sse('sse')
sse(): Promise<Observable<unknown>> {
  const receive = await this.userService.subscribeCreatedUser();

  return receive;
}

nest.js에서 핸들러에 @Sse() 데코레이터를 추가하면 간단하게 구현할 수 있다.

또한 이벤트 방식으로 구현하면 클라이언트에서 데이터 변경에 따른 감시를 할 수 있다. eventEmitter 로 간단하게 구현할 수 있다.

// provider
import EventEmitter from 'events';

export const userProviders = [
  {
    provide: 'EVENT_EMITTER',
    useValue: new EventEmitter(),
  },
];
// service
import { fromEvent, Observable } from 'rxjs';

...

subscribeCreatedUser(): Observable<unknown> {
  return fromEvent(this.eventEmitter, 'USER.CREATED');
}