뽀미의 개발노트

화상채팅방 오류 해결하기 (아직 못함) 본문

Trouble_Shooting

화상채팅방 오류 해결하기 (아직 못함)

산타는 뽀미 2023. 6. 27. 17:45

문자채팅방은 안 그러는데 화상채팅방만 새로고침할 때마다 상대방의 비디오가 안 보이기도 하고 2명만 들어갈 수 있는 방에 참여 인원이 6명까지 늘어난다거나 뒤로가기 눌러서 roomlist 눌렀을 때 갑자기 똑같은 id의 방이 무지하게 늘어난 것을 볼 수 있다ㅠㅠ

왜 그런가 하고 거슬러 올라가보니 문자채팅은 room 안에 유저정보를 담는 userList에 roomId와 room 객체를 넣는데 반해 화상채팅은 userList에 userUUID와 WebSocketSession을 담고 있었다.

그런데 이 userUUID는 그냥 room에 입장할 때마다 UUID.randomUUID().toString()이라는 걸 이용해서 매번 랜덤문자열을 만들어내고 있는 거였다!! 그래서 새로고침할 때마다 이 userUUID가 바뀌었다.

그래서 아마 예측하기로는 userUUID가 바뀌면서 userList에 자꾸 다른 사람이 입장하는 것처럼 되서 참여 인원이 증가하는게 아닌가 싶다. room에 먼저 userList부터 설정하고 다른거 여러가지 세팅해준뒤 chatroommap에 그 roomid와 room으로 put 해주는데 매번 userList에 인원이 추가되서 리스트가 바뀌므로 여러개의 방이 생성되는 것 같다.

암튼 이걸 처리하기 위해 원래는 비회원으로도 입장 가능했던 화상채팅방을 로그인해야지만 입장 가능하게 만들어놓고, 회원의 loginedMemberId를 userUUID에 넣는 방식을 사용해보겠다!!

그러나 회원의 UUID가 바뀌지 않아도 여전히 참여 인원이 증가하는 현상이 발생한다...

그런데 검색해보니 원래 새로고침이나 창닫기 등 이벤트 발생시 웹소켑 연결은 닫힌다고 한다.

화면에 room.userList를 출력해보니 새로고침할 때마다 websocketsession의 id가 바뀌었다. 즉 새로운 session을 사용하게 된 것!! 그래서 user가 늘어나서 userList 바뀔 때마다 방도 서로 다른 방처럼 취급되어 반 갯수가 늘어난 것이다.

그래서 나는 signalhandler에서 addClient할 때

public Map<String, WebSocketSession> addClient(ChatRoomDto room, String userUUID, WebSocketSession session) {
    Map<String, WebSocketSession> userList = (Map<String, WebSocketSession>) room.getUserList();

    userList.put(userUUID, session);

    return userList;
}

이렇게 되어 있던걸

public Map<String, WebSocketSession> addClient(ChatRoomDto room, String userUUID, WebSocketSession session) {
    Map<String, WebSocketSession> userList = (Map<String, WebSocketSession>) room.getUserList();
    if(userList.containskey(userUUID)) {
    	userList.replace(userUUID, session);
    } else {
    	userList.put(userUUID, session);
    }
    return userList;
}

이렇게 바꾸어 주었으나 별다른 차이는 없었다...

여전히 id는 바뀌고(당연하다 기존의 것을 대체했을 뿐이니까) 방 인원수도 늘었다(이건 왜 그런지 모르겠다.. 기존의 멤버를 새로운 session으로 대체한건데 왜ㅠㅠ)

암튼 이것저것 건들다보니 또 갑자기 내 화면만 나오고 상대방 화면은 안 나와서 원래대로 되돌리고 하느라 오랜 시간이 걸렸지만 아직도 해결책은 찾지 못했다...

일단 지금 있는 기능이나 잘 이해하자..!!


새로고침할 때마다 그만큼 똑같은 방 갯수도 늘어나는건 해결했다!!

signalhandler의 join에서 rooms.put(session.getId(), room);으로 되어있던걸 rooms.put(roomId, room);으로 바꿔주었더니!!

여전히 참여 인원수가 늘어나는건 못 막았지만 방 갯수가 늘어나지는 않게 되었다.

그리고 새로고침만 안 하면 내 비디오랑 상대방 비디오 둘다 잘 보인다.