개발자공부일기
웹소캣게임 트러블슈팅 본문
최고기록 갱신시 접속중인 모든 유저에게 전송
- 배경 : 서버에 저장한다고 가정하는 src쪽 전역변수 highScore에 모든 유저들중 최고기록을 저장하고 갱신될때마다 실시간으로 모든 유저에게 업데이트(브로드캐스트)해주고 싶었는데 새로 접속(새로고침)해야만 최고점수가 갱신되는걸 발견
- 발단 : 이렇게 되면 실시간통신이라 보기 힘들었다.
- 전개 : 그래서 AI와 힘을 합쳐 코드를 천천히 읽어봤다.
- 위기 : 아무리 봐도 코드상으로 이상한게 없었고 못찾을뻔했다.
- 절정 : 데이터가 잘 전달 되는지(서로 응답이 잘 주고받아 지는지) 확인하던 도중 socket.on을 작동시켜줄 이벤트이름이 return 데이터에서 누락된걸 발견했다.
setupSocketListeners(socket) {// 전역 최고 점수 업데이트 수신 (일반 응답)socket.on('response', (response) => {console.log('Received response:', response);if (response.event === 'globalHighScore' && response.data) {this.globalHighScore = response.data.score;}});
// 브로드캐스트된 글로벌 하이스코어 업데이트 수신socket.on('globalHighScore', (data) => {console.log('Received broadcast high score:', data);if (data && data.score !== undefined) {this.globalHighScore = data.score;}});} - 결말 : 단순히 아래 코드처럼 event값을 추가해줘서 해결했다.
return {status: 'success',broadcast: true,event: 'globalHighScore',data: {score: globalHighScore}};
Redis에 저장 문제
- 배경 : 저번에 진행하던 최고스코어 저장을 redis로 옮겼는데 A유저가 갱신하면 B유저의 화면에 표시되는 최고점수가 바로 갱신되지 않고 새로고침을 해야 갱신되는걸 발견했다.
- 발단 : 이러면 의도대로 실시간이 아니게 된다고 생각함
- 전개 : 그래서 로그도 찍어보고 최고점수를 저장하고 화면에 나타내는 부분들을 더 추가해보고 여러 방법을 시도했다.
- 위기 :그랬더니 매 프레임마다 최고점수를 저장하게돼서 redis가 저장을 거부했다.
- 절정 : 그래서 저장하는 부분을 게임 종료시마다 저장하게 바꿨다.
- 결말:저장문제는 해결했으나 동시갱신은 여전히 고치지 못했다.
고치지 못할줄 알았으나 다음날 우분투에 redis를 설치하지 않을걸 알고 설치했더니 redis는 정상작동하고
const socket = io(['http://domain.com:3000','http://localhost:3000','http://12.345.6.789:3000'], {
query: {
clientVersion: CLIENT_VERSION,
},
});
소캣에 내가 배포한 도메인주소를 이런식으로 배열로 집어넣으니 접속도 된다.