웹소켓을 사용 시 마주한 문제점

나성민·2023년 12월 1일
0

문제점발생

웹소켓을 사용했을 때 여러페이지에서 공유해서 사용하는 형식으로 사용자별로 하나의 웹소켓세션만을 생성하여 사용하였을 때 특정 페이지가 닫히는 상황에서 연결이 끊기는 문제점이 생길 수 있다. 또한 페이지별로 웹소켓이 연결되었을 때 다르게 보여줘야 하는 부분이 있다.

알림이 왔을 때 페이지별로 다른 처리

  1. 메인페이지 : 토스트창으로 알림띄우기
  2. 채팅방목록 : 실시간으로 안읽은 알림개수 띄우고 최신메시지로 갱신
  3. 채팅방 : 실시간으로 메시지내용 추가해주기

해결책

따라서 각 페이지별로 이동할때마다 별도의 websocket을 생성해서 연결할 수 있도록 하기 위해서 List에 담아주었다.
key로는 로그인한 사용자 아이디를 담아주고 value로 List형태로WebSocketSession객체를 담아주었다.
완전히 연결이 끊기는 경우는 모든 List의 사이즈가 0이 되는 순간이다.

수정한 코드내용

@Slf4j
@Component
public class HandlerChat extends TextWebSocketHandler {
	// (<"bang_id", 방ID>, <"session", 세션>) - (<"bang_id", 방ID>, <"session", 세션>) -
	// (<"bang_id", 방ID>, <"session", 세션>) 형태
	private List<Map<String, Object>> sessionList = new ArrayList<Map<String, Object>>();

	@Override
	public void afterConnectionEstablished(WebSocketSession session) throws Exception {
		String senderId = getMemberId(session); // 접속한 유저의 http세션을 조회하여 id를 얻는 함수
		if (senderId != null) { // 로그인 값이 있는 경우만
			log.info(senderId + " 연결 됨");
//			sessionList.put(senderId, session); // 로그인중 개별유저 저장
		}
	}

이렇게 연결이 되었을 때마다 session을 추가해주었다.

느낀점

오류가 날 때는 콘솔도 찍어보구 로그도 찍어보구 디버깅도 해보면서 순차적으로 문제점을 파악하여서 해결책을 내보는 것이 중요하다고 생각이 들었다... 또한 이러한 문제점이 발생했을 때 팀원들과의 소통을 통해서 아이디어를 도출해내고 실제로 해결해보는 좋은 경험이었던 것 같다.

0개의 댓글