TCP 게임 프로젝트의 캐릭터 중복 생성 문제 해결기

ssini·2025년 1월 17일
0

🚨 문제 상황

TCP 게임 프로젝트를 진행하던 중 흥미로운 버그를 발견했다. 플레이어가 게임에 접속할 때마다 해당 플레이어의 캐릭터가 2개씩 생성되는 현상이 발생한 것이다.

원인은 서버에서 위치 정보를 보낼 때 있었다. getAllLocation() 함수에서 모든 플레이어의 위치 정보를 보낼 때, 요청한 플레이어 자신의 정보까지 함께 보내고 있었던 것이다.

🔍 원인 분석

문제가 발생한 과정을 단계별로 살펴보면 이렇다:

  1. 클라이언트는 처음 접속할 때 자신의 캐릭터를 생성한다
  2. 서버에 다른 플레이어들의 위치를 요청하면
  3. 서버가 모든 플레이어의 위치를 알려주는데, 이때 내 위치도 포함된다
  4. 클라이언트는 받은 정보대로 캐릭터들을 생성하는데
  5. 결국 내 캐릭터를 하나 더 만들게 되는 것이다
// 처음에 작성했던 코드
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);
}

개선 효과

  1. 캐릭터 중복 생성 문제가 해결되었다
  2. 불필요한 데이터를 제거하여 네트워크 통신이 최적화되었다

결론

실제 프로젝트를 통해 이론으로만 알고 있던 것들을 직접 경험할 수 있었다:

  1. 서버와 클라이언트 간 데이터 통신에서는 세세한 부분까지 검증이 필요하다
  2. 문제 해결 과정에서 체계적인 디버깅의 중요성을 배웠다

이러한 경험을 통해 실제 서비스 개발에서 발생할 수 있는 문제들을 미리 경험해볼 수 있어서 좋았다.

0개의 댓글