항해99/개발일지

20220317 개발일지 #유저의 disconnect 2탄

paran21 2022. 3. 19. 01:03

중간발표 자료를 금요일 저녁까지 제출해야해서 오늘부터 자료를 만들기 시작했다.

화요일에 중간발표 발제가 있었고, 발표시간은 5분이라서 생각보다 짧았다.

 

발표내용은 프로젝트 시연, 서비스 아키텍처, 트러블 슈팅, 추후 개발 계획으로 구성되었다.

중간발표 전에도 이런 내용을 하면 되지 않을까, 생각했던 부분이라 발표자료를 구성하는 건 어렵지 않았다.

어차피 사전에 발표자료를 공유하는 걸로 알고 있어서 프로젝트 주요 기능 페이지를 추가하고, 발표 때는 생략하기로 했다.

 

트러블 슈팅에 어떤 걸 써야할지가 좀 고민이 됬는데 회의에서 금방 결정이 됬다.

그동안 이슈들은 팀노션에 간단하게라도 정리해뒀었는데 그게 도움이 된 것 같다.

 

#유저의 disconnect 문제

정말정말 고민이 많았던 문제다.

이렇게(https://paran21.tistory.com/123?category=1020008) 문제를 해결했다고 생각했는데, 새로운 문제가 발생했다.

클라이언트 4명 중 한명이 나갔을 때 3명이 동시에 요청을 보내게 되는데, 여기서 한명만 제대로 응답을 받고 나머지 두명은 에러가 발생했다.

이미 유저가 삭제된 경우라면 응답에 null이 담겨서 가야하는데 그것도 아니고 그냥 에러가 떴다.

요청에 방장 변경과 유저 삭제 요청이 함께 들어가 있는데 해당 요청이 동시에 3개 들어오면서 문제가 발생한 것으로 보였다.

그래서 어떻게 해야할지 고민을 많이 해봤는데

(삭제와 업데이트를 분리하고, 이벤트로 연결, 등등)

어떻게 해도 클라이언트가 동시에 요청이 들어오는 것을 제어할 수 있는 방법이 없었다.

 

결국 우리가 찾은 방법은 nodeJS에서 disconnect 이벤트가 발생했을 때 여기서 바로 db에 방장 변경 및 유저 삭제 요청을 하는 것이다.

이렇게 하면 가장 문제인 db에 요청이 여러번 가능것을 막을 수 있고, 방장이 변경됬을 때는 이벤트를 통해 해당 방 클라이언트 모두에게 변경된 방장을 알려줄 수 있다.

기능 구현할 때 쿼리문이 제대로 동작하지 않아서 조금 해맸는데, 결국 성공했다!!

sequelize를 사용하지 않고 쿼리문을 직접 보내다보니 쿼리문 자체에서 sql 문법에 맞춰 ''같은 부분도 신경써야했다.

node에서 로직을 구현하는게 처음에는 부담이 되었는데 생각해보니 필요한 쿼리문만 잘 내보내면 될 것 같아서 우선 진행해보았고, 생각보다 금방 구현할 수 있었다.

테스트를 위해 무한 방만들기-나가기를 해주신 프론트에 감사드린다!!