TCP 게임 프로젝트를 진행하던 중 흥미로운 버그를 발견했다. 플레이어가 게임에 접속할 때마다 해당 플레이어의 캐릭터가 2개씩 생성되는 현상이 발생한 것이다.
원인은 서버에서 위치 정보를 보낼 때 있었다. getAllLocation() 함수에서 모든 플레이어의 위치 정보를 보낼 때, 요청한 플레이어 자신의 정보까지 함께 보내고 있었던 것이다.
문제가 발생한 과정을 단계별로 살펴보면 이렇다:
// 처음에 작성했던 코드
getAllLocation() {
const locations = [];
this.users.forEach((user) => {
locations.push({
userId: user.id,
x: user.x,
y: user.y
});
});
return locations;
}
해결 방법은 의외로 단순했다. 서버에서 위치 정보를 전송할 때 요청한 플레이어의 정보를 제외하도록 로직을 수정했다.
// 수정한 코드
getAllLocation(userId) {
const maxLatency = this.getMaxLatency();
const locationData = this.users
.filter((user) => user.id !== userId) // 자신의 정보는 제외
.map((user) => {
const { x, y } = user.calculatePosition(maxLatency); // 네트워크 지연 고려
return { id: user.id, x, y };
});
return createLocationPacket(locationData);
}
실제 프로젝트를 통해 이론으로만 알고 있던 것들을 직접 경험할 수 있었다:
이러한 경험을 통해 실제 서비스 개발에서 발생할 수 있는 문제들을 미리 경험해볼 수 있어서 좋았다.