2024. 12. 9. 20:33ㆍ내일배움캠프/Barter
현재 프로젝트에서 '알림 기능' 을 구현할 필요가 생겼다. Spring 에서 '알림 기능' 을 구현하는 방법에 대해 찾아보았는데 그 내용이 적지가 않아 찾아본 정보와 어떠한 방식을 선택하게 되었는지 정리해보려 한다.
0. 대략적인 목표
우선 구현하고자 하는 '알림 기능' 은 사용자에게 '실시간으로 서버의 변경 사항' 을 웹 브라우저에 갱신해주는 서비스이다. 가령 해당 프로젝트의 주 목적인 '물물 교환' 에 대한 상태가 변경되었다면 사용자에게 교환 상태 변경에 대한 알림을 실시간으로 알려주는 것이다.
물론 대략적인 목표로 실제 팀 프로젝트에 적용전에는 좀 더 명확한 목표나 기준을 설정할 필요가 있다.
1. 실시간 통신 방법 파악
해당 프로젝트는 '웹 애플리케이션' 을 구현하는 것이므로 'HTTP 통신' 을 기준으로 위의 실시간 서비스를 구현해야 하는데 'HTTP 통신' 의 경우 클라이언트의 요청이 있을 때 서버가 요청을 수행하고 응답을 할 수 있으므로 아래와 같은 방식을 사용한다고 한다.
1-1. Polling
일정 주기를 가지고 서버의 API 를 호출하는 방식, 클라이언트 쪽에서 주기적으로 API 를 서버에 요청해 알림 정보를 응답하는 방식이다. HTTP 통신을 기반으로 하기에 호환성이 좋다는 장점이 있다.
단, 알림 정보의 업데이트 주기가 길다면 갱신된 정보가 없음에도 서버에 불필요한 요청을 주기적으로 보내게 되므로 서버 부하를 일으킬 수 있다.
1-2. Long-Polling
앞서 말한 'Polling' 과 비슷하나, 알림 정보의 업데이트가 발생했을 때만 응답을 보내는 방식이다. 즉, 클라이언트가 요청을 보내면 서버는 즉시 응답하지 않고 알림 정보의 변경사항이 생길 때까지 기다린 후 변경 이벤트가 발생하면 클라이언트에 응답하는 방식으로 이해하였다.
Polling 과 달리 불필요한 요청을 줄일 수 있다는 장점이 있지만, 알림 정보의 업데이트가 빈번하게 일어난다면 이를 확인하기 위한 요청 또한 빈번하게 발생하므로 '서버 부하' 에 대한 문제를 해결할 수 있는 방식으로 보기에는 어려운 것 같다.
1-3. SSE (= Server-Sent-Events)
클라이언트에서 서버쪽으로 특정 이벤트를 '구독(subscribe)' 하면 서버 쪽에서는 클라이언트가 구독한 이벤트가 발생할 경우 클라이언트 쪽으로 이벤트를 응답하는 방식이다. 즉, 최초 한 번만 '이벤트 구독' 에 대한 요청을 하면 해당 구독이 종료될 때까지 해당 구독에 대한 요청을 할 필요가 없고, 서버에서는 이벤트가 발생할 때마다 이벤트 정보를 클라이언트 쪽으로 응답할 수 있다고 이해했다.
단, 해당 방식은 '단방향 통신(클라이언트 ← 서버)' 이므로 서버쪽에서 클라이언트쪽으로만 데이터를 전송가능하며 반대 방향으로는 불가능하다.
1-4. WebSocket
앞서 말한 'SSE' 와는 다르게 '양방향 통신' 이 가능한 방식이다. 변경 사항에 빠르게 반응해야 하는 '채팅 서비스' 를 구현할 때 많이 사용된다고 한다.
클라이언트와 서버의 연결에는 적지 않은 비용이 소모되는데, 해당 방식을 통해 통신이 지속적으로 이루어질 경우 트래픽 양이 많아진다면 이는 서버에 큰 부담이 될 수 있다.
2. 어떤 방식을 사용할까?
'0. 대략적인 목표' 에서 언급한대로 현재 프로젝트에서 필요한 것은 서버에 알림 정보의 변경이 있다면 이를 클라이언트에 알려주기만 하면된다. 즉, 서버에서 클라이언트로 '단방향 통신' 만 되도 충분하다고 예상되기에 'SSE vs WebSocket' 에서 SSE 로 선택지를 좁힐 수 있었다.
Polling 이나 Long-Polling 의 경우 서버에서 알림 정보를 클라이언트에 응답하기 위해서는 결국 클라이언트에서 서버로 계속해서 요청을 보내야하기에 위 선택지에서 배제하게 되었다.
3. SSE 실습
SSE 가 어떤 녀석인지 간단하게 알아보았지만 프로젝트 적용전에 실습을 통해 어떻게 사용하고 어떤 동작을 하는지 확인해보았다. 실습 프로젝트는 여기서 확인이 가능하다.
일단 SSE 를 활용해 클라이언트에 이벤트를 전달할 수 있는지 확인해보기 위해 작성한 프로젝트로 Local Memory 에 key 로 회원ID, value 로 Ssemitter 를 저장해 특정 회원이 본인의 이벤트에 대한 정보를 응답받을 수 있도록 작성하였다.
하지만 동시 접속자가 많은 경우 서버에 부하를 주기에 이에 따른 문제를 염두할 필요가 있다. 이러한 부분 때문에 단순히 SSE 를 사용한다고해서 팀 프로젝트에 알림 기능을 구현할 수 있을거란 생각이 들진 않는다. 명확하게 어떤 시점에 이벤트를 클라이언트에 전달해야 할지 전체적인 흐름을 그려보고 적절하게 적용할 필요성을 느꼈다.
'내일배움캠프 > Barter' 카테고리의 다른 글
[니꺼, 내꺼] 3주차 - 왜, 추가 API 가 필요한가? (0) | 2024.12.20 |
---|---|
[니꺼, 내꺼] 2주차 - 문제 해결 과정 설명 (0) | 2024.12.13 |
[니꺼, 내꺼] 2주차 - 의사결정 과정 설명 (0) | 2024.12.13 |
[니꺼, 내꺼] 5분 기록 테이블 (0) | 2024.12.04 |