크롬과 엣지의 웹소켓 연결/해제 순서 문제 분석
안녕하세요 🐸
Node.js 강의를 들으면서 웹소켓에 대해 공부 중 이상한 문제를 만났습니다.
배경 상황
/chat
, /room
으로 나뉘어진 네임스페이스가 있다.
각각 /chat
은 채팅방에 연결되는 소켓을 관리하고
/room
은 채팅방 목록에 연결되는 소켓을 관리한다.
채팅방에서 모든 유저가 방을 나가면 해당 방은 삭제되고 사용자는 메인페이지로 이동한다. 그리고 채팅방이 없어졌음을 /room
에 알려 채팅방 목록에서 해당 채팅방을 제거한다.
문제
크롬에서는 채팅방의 마지막 사용자가 방을 나갈 때 방이 사라지지 않는다.
하지만 엣지에서는 정상적으로 사라진다.
원인
크롬과 엣지 등의 브라우저가 페이지 이동을 처리하는 방식의 차이가 있다.
각각의 브라우저에서 페이지 전환과 소켓 연결/해제 순서는 아래와 같았다.
크롬
- 메인페이지로 이동
- DB의 채팅방 목록 조회 후 화면에 랜더링
/chat
소켓 연결 해제- DB에서 채팅방 삭제
/room
으로 제거된 채팅방 아이디 전달- 클라이언트가
/room
네임스페이스에 연결엣지
- 메인페이지로 이동
- DB의 채팅방 목록 조회 후 화면에 랜더링
- 클라이언트가
/room
네임스페이스에 연결 /chat
네임스페이스 연결 해제- DB에서 채팅방 삭제
/room
으로 제거된 채팅방 아이디 전달
해결
채팅방 목록의 조회를 웹소켓 연결 후로 변경하여 사용자가 최신 정보를 받을 수 있도록 수정
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.