[WIL] 채팅방 인원수 카운팅 오류(Redis)_항해99 9주차

woonie·2022년 3월 13일
0

WIL

목록 보기
9/12

항해 9주차 마무리

웹소켓/STOMP를 이용한 실시간 채팅을 구현하였고 채팅에서 실시간 참여 인원을 redis에 저장해보기로 하였다.
사용자가 구독을 하는 순간 정상적으로 인원수 카운팅이 되었지만, 사용자가 다른 페이지를 가거나 브라우저를 닫으면 연결이 끊기는데 연결이 끊기는 순간 인원수 카운팅이 정상적으로 되지 않았다.
여기서 시간을 많이 쏟아부었다...
단순히 disconnect되는 순간 유저 카운팅을 -1되는 로직으로 구현을 하였는데, 구독한 채널에서 유저 카운팅이 되는게 아닌 엉뚱한곳에서 -1이 되고 있었다.

우리팀은 Redis를 구현하는데 생각보다 시간이 오래걸렸고 반드시 이 문제를 해결하고 싶다는 의지에 불탔다. 계속해서 header값에 log를 찍어보았고 실마리?를 찾았다.

해당 채널을 구독하게 되면 생성되는 SessionId 와 disconnect 시 뿌려주는 SessionId가 동일하는것을 확인했다.
우리는 이걸 활용하면 채팅방 인원수가 정상적으로 카운팅이 가능하겠구나 생각했다.

곰곰히 생각하다 이것저것 많이 시도해보았다. 마지막으로 시도로 RedisTemplate를 활용해서 사용자가 구독한 채널과 SessionId를 매핑하여 disconnect 시 해당 SessionId로 매핑해두었던 구독한 채널을 가져와서 -1 카운팅을 시도했다.

  • 구독한 채널과 SessionId 매핑

  /* 유저가 입장한 채팅방ID와 유저 세션ID 맵핑 정보 저장 */
    public void setUserEnterInfo(String sessionId, String destination) {
        hashOpsEnterInfo.put(ENTER_INFO, sessionId, destination);
    }
  • 매핑 후 disconnect 시 해당 SessionId로 구독한 채널 정보 조회
/* 유저 세션으로 입장해 있는 채팅방 ID 조회 */
    public String getUserEnterRoomId(String sessionId) {
        return hashOpsEnterInfo.get(ENTER_INFO, sessionId);
    }
  • disconnect 로직
else if(StompCommand.DISCONNECT == headerAccessor.getCommand()){

            String sessionId = (String) message.getHeaders().get("simpSessionId");
            log.info("=== DISCONNECT sessionId : " + sessionId);

            String destination = redisChatRepository.getUserEnterRoomId(sessionId);

            /* 채팅방의 인원수를 -1한다. */
            redisChatRepository.minusUserCount(destination);
            log.info(("=== DISCONNECT destination : " + destination));
            

        }

정상적으로 유저 카운팅이 되었다!!!!

profile
동료들과 함께하는 개발의 중요성에 관심이 많습니다. 언제나 호기심을 갖고 꾸준히 노력하는 개발자로서 성장하고 있습니다.

0개의 댓글