소켓 채팅방 구현을 여전히 진행중인데 반영해야 하는 요구사항이 추가되었다!!
서버에서 접속 유저들의 상태를 메모리의 객체로 관리하면서
접속한 유저가 방을 나갔을 때, 특히 접속 인원이 모두 방을 떠나거나/게임이 종료되어 메모리 삭제를 해야할 때 확실하게 메시지를 보내주어야 하는 것이다.
따라서,
1. 유저가 대기방 페이지를 벗어나면 '/leave'로 메시지를 보내 전체 접속 유저가 현재 방에서 떠난다는 신호를 보내주고,
2. 마지막 유저 마저 대기방 페이지를 떠나는 것은 방이 삭제되는 것으로 처리해 '/end'로 메시지를 보낸다.
const disconnect = () => {
console.log('Disconnecting from WebSocket');
if (userStatuses.length === 1) {
stompClient.publish({
destination: `/pub/rooms/${params.id}/end`,
});
} else {
stompClient.publish({
destination: `/pub/rooms/${params.id}/leave`,
});
}
stompClient.deactivate();
};
useEffect(() => {
window.addEventListener('popstate', disconnect);
window.addEventListener('beforeunload', disconnect);
return () => {
window.removeEventListener('popstate', disconnect);
window.removeEventListener('beforeunload', disconnect);
};
}, []);
1) popstate 이벤트: 브라우저의 뒤로 가기 버튼이 클릭되었을 때 발생하는 이벤트
2) beforeunload 이벤트: 사용자가 현재 페이지를 떠나기 전에 발생하는 이벤트
그런데 테스트를 계속 해보니 뒤로가기, 앞으로가기도 beforeunload 이벤트로 감지되는 것 같다...
찾아보면 router 이벤트로도 감지한다고 하는데, 지금 상황에서는 사용자가 페이지에서 벗어나는 다른 경우의 수가 발생하지는 않아서 이정도 처리만 해줘도 될 것 같다. 혹시나 다른 예외처리가 필요하게 된다면 다시 추가로 작성하러 오겠다!
'Front-End' 카테고리의 다른 글
[React/Next.js] 모달 컴포넌트 만들기 (0) | 2024.04.19 |
---|---|
[React Native] react-native-keychain 사용하기 (0) | 2024.04.14 |
[React / Next.js + Zustand] StompJS로 채팅 구현하기 (2) - 실시간 채팅 방 상태 관리하기 (2) | 2024.04.05 |
[React / Next.js] StompJS로 채팅 구현하기 (1) - 웹 소켓 연결 (0) | 2024.03.29 |
Next.js에서 Axios Interceptor 작성하기 (feat. Zustand, localStorage) (1) | 2024.03.23 |