ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 9월 25일 월요일 TIL 회고록
    카테고리 없음 2023. 9. 25. 22:17

    개인 프로젝트 알림 기능 구현해보기 -1


    개인 프로젝트에 알림 기능을 구현해보기 전 이론 정리

    댓글이나 좋아요 알림은 유저의 요청 없이도 실시간으로 서버의 변경 사항을 웹 브라우저에 갱신해줘야 하는 서비스이다.

    하지만 전통적인 Client-Server 모델의 HTTP 통신에서는 이런 기능을 구현하기가 어렵다. 클라이언트의 요청이 있어야만 서버가 응답을 할 수 있기 때문이다. HTTP 기반으로 해당 문제를 해결하려면 다음과 같은 방식들이 있다.

     

    실시간 통신의 방법

    Polling

    일정 주기를 가지고 서버의 API를 호출하는 방법이다. 예를 들어, 클라이언트에서 5초마다 한 번씩 알림 목록을 호출한다면,

    업데이트 내역이 5초마다 갱신되며 변경 사항을 적용할 수 있다. 이 방식은 기본적인 HTTP 통신을 기반으로 하기 때문에 호환성이 좋다는 장점이 있다.

     

    하지만 해당 방식은 업데이트 주기가 길다면 실시간으로 데이터가 갱신 되지 않고, 또 짧다면 갱신 사항이 없음에도 서버에 요청이 들어와 불필요한 서버 부하가 발생한다는 단점이 있다.

     

    Long-Polling

    Polling과 비슷하나, 업데이트 발생시에만 응답을 보내는 방식이다. 서버로 요청이 들어올 경우, 일정 시간동안 대기하였다가 요청한 데이터가 업데이트 되면 웹 브라우저에게 응답을 보낸다. Polling에서 불필요한 응답을 주는 경우를 줄이기 위해 사용할 수 있는 방법이다.

    따라서 연결이 된 경우엔 실시간으로 데이터가 들어올 수 있다는 장점이 있다.

     

    하지만 이 방식 또한 데이터 업데이트가 빈번하게 일어난다면 연결을 위한 요청도 똑같이 발생하므로 Polling과 유사하게 서버에 부하가 일어날 수 있다.

     

    SSE (Server-Sent Event)

    웹 브라우저에서 서버쪽으로 특정 이벤트를 구독하면, 서버에서는 해당 이벤트 발생 시 웹 브라우저 쪽으로 이벤트를 보내주는 방식이다. 

    따라서 한 번만 연결 요청을 보내면, 연결이 종료될 때까지 재연결 과정 없이 서버에서 웹 브라우저로 데이터를 계속해서 보낼 수 있다.

     

    다만, 서버에서 웹 브라우저로만 데이터 전송이 가능하고, 그 반대는 불가능하다는 단점이 있다. 또, 최대 동시 접속 횟수가 제한되어 있다.

     

    Web Socket

    서버와 웹 브라우저 사이 양방향 통신이 가능한 방법이다. 변경 사항에 빠르게 반응해야하는 채팅이나, 리소스 상태에 지속적 업데이트가 필요한 문서 동시 편집과 같은 서비스에 많이 사용되는 방법이다.

     

    이 방식은 양방향 통신이 지속적으로 이루어질 수는 있으나, 연결을 유지하는 것 자체가 비용이 들기 때문에 트래픽 양이 많아진다면 서버에 큰 부담이 된다는 단점이 있다.

     

    결론

    Polling 방식은 실시간성을 높이려면 그 주기를 짧게 해야 하는데, 트래픽이 많아질 경우 서버에 걸리는 부하가 커지기 때문에 알림 서비스에는 부적합해보이고 Long-Polling 역시 마찬가지로 트래픽이 많아지면 요청도 그만큼 많아지므로 부적합해보였다.

     

    SSE, WebSocket 방식들은 HTTP 연결 방식에 대한 부담이 적으므로 이 둘 중에 어떤 것을 선택해야할지 고민했다.

    SSE, WebSocket의 가장 큰 차이는 WebSocket의 경우 완전히 양방향 통신을 지원한다. 클라이언트에서 서버로, 서버에서 클라이언트로 통신이 가능하다. 반면 SSE의 경우 서버에서 클라이언트로 보내는 것만 가능하다. 그리고 WebSocket 보다는 가볍고, 스프링부트 기준 구현이 쉽다는 장점을 갖고있다. 

     

    알림 서비스(댓글 알림, 게시글 좋아요 알림, 댓글 좋아요 알림 등등..)의 경우 클라이언트에서 서버로 데이터를 전송하지 않아도 되어서 단방향 통신으로도 구현할 수 있으므로, SSE 방식을 택해서 구현하기로 했다!

    구현은 내일부터..

     


    참고한 블로그


    https://taemham.github.io/posts/Implementing_Notification/

     

    [백엔드 스프링부트] 알림 기능은 어떻게 구현하는게 좋을까?

    This is a wannabe backend developer’s dev blog.

    taemham.github.io

    https://tecoble.techcourse.co.kr/post/2022-10-11-server-sent-events/

     

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

    tecoble.techcourse.co.kr

    https://velog.io/@dhk22/TIL-Day

     

    🔥 TIL - Day 64 SSE를 이용한 실시간 알림

    Springboot - SSE를 이용한 실시간 댓글알림 구현

    velog.io

     

Designed by Tistory.