로그아웃일 때만 해주지 않고 현재 페이지를 벗어날 때 소켓 연결을 끊기
소켓 아이디가 중복으로 계속 생성되는 문제를 방지하기 위해서 내가 했던 작업은 만약, 유저가 로그아웃을 누르게 될 경우 연결을 disconnect 옵션을 통해 끊어버리도록 코드를 작성했다. 하지만, 이렇게 하니 문제점이 하나가 더 있었다. 네비게이션 바를 이용해 채팅 페이지가 아닌 다른 페이지로 넘어갔다가 다시 들어오는 경우, 또 중복해서 소켓 아이디가 생성된다는 점이었다.
이를 해결하기 위한 방법으로 가장 먼저 생각했던 것은, 너무나도 무식한 방법이었다. 지금 우리 코드 상에서 NavBar 는 app.jsx 에 있는데 여기 app.jsx 에 있는 navBar 컴포넌트를 '/chat' 일 때는 나타나지 않게 하고 chattingpage.jsx 에서 navBar 컴포넌트를 가져오고 props 를 생성하여 다른 페이지로 넘어가는 버튼을 눌렀을 때 disconnect 가 실행되도록 하는 함수를 작성하는 것이었다. 좀 너무 하드한 방법이었다. 이렇게 되면 문제점은 SPA 인 리액트지만 '/chat' 에서는 굳이 새롭게 렌더링 하지 않아도 되는 컴포넌트(navBar)가 있음에도 불구하고 완전히 새롭게 페이지를 렌더링 해야한다는 점이다.
조금 더 스마트한 방법이 없을까 고민했는데, 번뜩였던 게 이전 SVG 태그를 사용하면서 발생했던 에러를 해결했던 경험이었다. 이전에 SVG 태그를 useRef 로 참조하고 있었을 때 다른 페이지로 넘어가면 에러가 발생하는 현상이 있었다. 그 문제를 해결하기 위해서 처음에는 document 로 직접 DOM 에 접근을 했었는데, 이후 리팩토링하는 과정에서 useEffect cleanup 함수를 이용해 useRef 와 SVG 사이의 연결을 끊어버리는 로직을 작성하도록 만들어 에러를 해결했었다. socketRef, 이것도 마찬가지로 useRef 를 활용한 것이다. 설마 해서 cleanup 함수에 연결을 끊는 로직을 작성하니, 원하는대로 다른 페이지로 넘어가게 되면 연결은 끊었다.
아, 이제서야 이 에러가 진짜 완전히 끝난 것 같다 ㅠㅠㅠㅠㅠㅠ


'코드스테이츠 > 코드스테이츠 @ 팀 프로젝트' 카테고리의 다른 글
[코드 스테이츠 / Final-Project] 147일차, "에러가 안 나는게 에러같아" (0) | 2021.12.13 |
---|---|
[코드 스테이츠 / Final-Project] 146일차, "이전의 에러 해결은 잘못된 방법이었다" (0) | 2021.12.12 |
[코드 스테이츠 / Final-Project] 144일차, "룸에서 제대로 벗어날 것" (0) | 2021.12.10 |
[코드 스테이츠 / Final-Project] 143일차, "데이터 베이스에서의 말썽" (0) | 2021.12.09 |
[코드 스테이츠 / Final-Project] 142일차, "Socket.io 와 상태의 환상의 에러네이션" (0) | 2021.12.08 |