Spring

Spring 파이널 알림함

chojdsj 2023. 10. 16. 17:55
728x90

 

유저가 자유게시판에 있는 다른 유저의 글에 댓글을 작성하면 실시간으로 위에 알림창의 숫자가 늘어나게 하고 싶었고 알림 내용을 띄우게 하고 싶었다.

 

 

 

 

 

일단 로그인 했을때만 알람 갯수를 조회하는 비동기 함수를 호출한다.

 

  let alertSock;
    alertSock = new SockJS("/alertSock")

    alertSock.onmessage = e => {

        var alertList = JSON.parse(e.data);
        console.log(alertList.length);
        alarmNum.innerHTML = alertList.length;
       
        selectAlarm(alertList)

    }

 

그리고 서버랑 실시간으로 양방향 통신을 가능하게 해주는 SockJS 라는 JavaScript 라이브러리를 사용해서 "/alertSock" 경로와 일치하는 서버와 연결을 시도합니다.

 

 

그러면 servlet-context.xml에서 js에서 보낸 경로와 일치하도록 <websocket:mapping> 요소가  AlarmWebsocketHandler와 연결시켜줍니다.

 

AlarmWebsocketHandelr 클래스는 WebSocket 메세지 이벤트를 처리하고, 클라이언트와 서버간의 실시간 통신을 담당합니다.

 

이제 댓글을 작성하는데 댓글 작성 시, 댓글 테이블에 작성한 댓글이 INSERT가 됐다면 알림 테이블에도 INSERT를 해주고 그러고나서 AlarmWebsocketHandler의 메소드를 호출해서 알림 내용을 클라이언트측으로 보내줍니다.

 

 

이제 댓글번호를 이용해서 댓글을 작성한 게시글의 회원번호를 구하고, 답글을 달았으면 부모댓글의 회원번호를 둘 다를 구해옵니다.

 

회원번호들 board에 담겨있습니다.

 

그리고 지금 로그인 되어있는 회원의 회원번호를 얻기위해서

sessions라는 WebsocketSession 객체의 목록을 반복합니다.  이것은 Websocket 서버에 현재 연결된 모든 클라이언트의 세션 목록을 나타내는데, 현재 세션의 목록중 loginMember라는 속성을 사용하여 현재 로그인한 회원의 번호를 가져옵니다.

 

그래서 현재 로그인한 회원의번호가 댓글이 달려져있는 게시글의 회원번호와 일치히다면, 즉 게시글의 작성자라면 그 회원의번호를 이용해서 알림창에 띄워줄 데이터들을 가져옵니다.

 

 

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------

그리고 CMemberNo가 0이 아니라면, 즉 답글이 달려져있는 부모댓글이 있다면 부모댓글의 회원번호를 구해오고 현재 로그인한 회원의 번호가 부모댓글을 작성한 회원의 번호와 일치하면

 

위와 마찬가지로 회원번호를 이용해서 알림창에 띄워줄 데이터들을 구해옵니다.

 

그리고 이 알림 데이터들을 GSON을 이용해서 JSON형식으로 변환하고 sendMessage 메소드를 통해서 데이터들을 클라이언트측에 보내줍니다.

 

그리고 이제 이 값들을 받아서 알림창에 적절한 형식으로 값을 나타내어 줍니다.

 

 

 

 

이 알림 기능을 하면서 처음에는 WebSocket 방식을 사용하지 않고 그냥 했었다가 실시간으로 알림이 오는것으로 구현해보자 하고서, WebSocket 방식을 찾아보면서 사용해 보았습니다.

 

 

다시한번 정리해보면

 

1. SockJS라는 JavaScript 라이브러리를 사용하여 서버와 양방향 통신을 가능하게 해주고, 서버의 WebSocket과 연결

 

2. 서버에서 websocket:mapping을 이용해서 받아주고 연결시켜준다.

 

3. 데이터 값들을 구하고 sendMessage 메소드를 이용해서 데이터값들을 보내준다.