[캡스톤디자인] SSE를 통한 알림 기능 구현 (1)

Dev_Sanizzang·2023년 8월 16일
0

캡스톤디자인

목록 보기
12/15

📕 개요

캡스톤디자인 계획 당시 모임에 가입한 사람이 있거나 일정이 업데이트가 되면 해당 모임원들에게 모임에 대한 소식을 알 수 있도록 알림 기능을 만들기로 했었다.
이번 포스팅에서는 알림 기능 구현에 대해 써보겠다.

🤔 어떤 방법을 써야할까?

HTTP 프로토콜 같은 경우 Client가 Server에 Request를 날리면 해당 Request에 대한 Response를 날려주는 방식이다.
또한 HTTP는 비연결성 이라는 특징이 있기 때문에 Request, Response와 같이 용건이 끝나게 되면 바로 연결을 끊어 버린다.

지금 구현하려는 알림기능 같은 경우는 Client의 요청이 없어도 서버에서도 데이터를 전달해줘야한다.

HTTP를 기반으로 이 문제를 해결하기 위해서는 세 가지 방법을 고려해볼 수 있다.

(1) Short Polling 👏

  • Client가 주기적으로 Server로 요청을 보내 데이터가 갱신이 되면 Response를 받는 방식
  • Client와 Server 모두 구현이 단순
  • Server의 부담이 클 수 있다. (Client의 계속된 Request 요청)
  • Connection을 맺고 끊는 것에 대한 비용 부담

(2) Long Polling 👏

  • 요청을 보내고 Server에서 변경이 일어날 때 까지 대기하는 방식
  • 기존 폴링 방식에 비하면 Server 부담이 줄어들 수는 있지만 Request 요청이 많아지게 되면 기존 Short Polling과 큰 차이가 없게되고 결국 Server의 부담이 커지게 된다.

(3) Server-Sent Events(SSE) 👏

  • Server와 한번 연결을 맺고나면 일정 시간동안 Server에서 변경이 발생할 때마다 데이터를 전송 받는다.
  • Client는 Server로부터 데이터만 받을 수 있다. (Client -> Server로 데이터 전송 불가)
  • Server에서 Client로 text message를 보내는 브라우저로 보내는 브라우저 기반 웹 애플리케이션 기술로 HTML5 표준 기술이다.

💡 SSE는 WebSocket과 달리 별도의 프로토콜을 사용하지 않고 HTTP 프로토콜만으로 사용이 가능하기에 훨씬 가볍다.

🧐 그럼 뭘 사용?

나는 각각의 특성을 고려해봤을 때 SSE가 알림 기능이 적절해보였기 때문에 SSE를 사용하여 알림 기능을 구현해보도록 하겠다.

🧠 SSE 통신 방법

SSE의 통신 방법에 대해서는 아래 어썸오님께서 아주 잘 정리해놓으셨다.

💡 Spring에서 Server-Sent-Events 구현하기

위의 글에서는 SSE의 통신 흐름, 코드 구현 방법, 및 SSE를 사용했을 때 주의해야 할 점들까지 잘 정리되어있다. 나는 그 중에서 주의할 점들 몇가지를 적어보겠다.

💣 주의할 점

  • SSE의 만료시간을 설정할 수 있다.(스프링 부트의 내장 톰캣같은 경우 30초가 디폴트 값)
  • SseEmitter를 생성하고 만료시간까지 아무런 데이터를 보내지 않으면 503 에러가 발생할 수 있으니 더미 데이터를 전달해주자.
  • 타임아웃이 발생하면 브라우저에서 재연결 요청을 보내는데, 이때 새로운 Emitter 객체를 다시 생성하기 때문에 기존의 Emitter를 제거해줘야한다.
  • 위를 대비하기 위해 onCompletion 콜백에서 자기 자신을 지우도록 등록해야하는데, 이 콜백이 SseEmitter를 관리하는 다른 스레드에서 실행되기 때문에 thread-safe한 자료구조를 사용해야한다.

위의 문제점들 말고도 더 다양한 주의점들이 있다. 이들을 잘 고려해서 알림 기능을 구현할 때 조심해야겠다.

🚪 마무리

이 포스팅에서는 알림 기능 구현을 어떻게 개발할지에 대한 글을 적었다.
다음 포스팅에서는 실제 알림 기능을 구현한 부분에 대해서 글을 써보도록하겠다.

profile
기록을 통해 성장합니다.

1개의 댓글

comment-user-thumbnail
2023년 8월 16일

정보 감사합니다.

답글 달기