배포 환경에서만 팀 구분이 잘못됐던 이유

강 진성·2025년 4월 22일
1
post-thumbnail

프론트 단계에서 .rofl 리플레이 파일을 업로드하고, 백엔드에서 이를 파싱해 팀을 나누는 기능을 만들었었다. 내가 이때까지 로컬 환경에서만 경기기록을 업로드 하고 배포사이트에서는 업로드 하지않았기에 버그가 있는 줄 몰랐다.

로컬에서는 정상적으로 작동했지만, 배포 서버에선 모든 플레이어가 레드팀으로만 분류되는 이상한 문제가 발생했다.


문제 상황


로컬 환경에서는 플레이어 10명이 블루팀과 레드팀으로 5:5 로 잘 나눠졌었다.
하지만 배포된 서버에서는 모든 플레이어가 레드팀으로만 처리되고 있었다.

프론트에서 올리는 .rofl 파일 자체는 동일했기 때문에, 문제는 백엔드 코드나 배포 환경 에 있을 것이라 예상했다.

로컬에서는 아래와 같이 Blue와 Red로 팀이 잘 나눠졌었다.

[
  { "nick": "player1", "team": "Blue" },
  { "nick": "player2", "team": "Red" },
]

그런데 배포 서버에서는 모든 팀이 이렇게 나와버렸다.

[
  { "nick": "player1", "team": "Red" },
  { "nick": "player2", "team": "Red" },
]

기존 코드

team: player:Team === "100" ? "Blue" : "Red"

.rofl 파일을 파싱했을 때, player.TEAM 값은 "100" 이라는 문자열로 되어 있었다.
그래서 "100""100" 을 비교하면 당연히 true 이고, Blue 팀으로 잘 분류되었었다.

하지만 배포 환경에서는 이 비교가 통하지 않았다.
즉, player.TEAM === "100" 이 조건이 실패하면서 전부 Red로 분류된 것이다.


왜 이런 일이 생겼을까?

여기서 떠올린 가능성은 다음과 같았다.

혹시 JSON 파싱 과정이나 통신 중에
"100" 이라는 문자열이 숫자 100 으로 자동으로 타입 변환된 건 아닐까?

예를 들어, 배포된 서버에서는 아래와 같은 상태였을 수 있다.

typeof player.TEAM 	// "number"
player.TEAM			// 100

그러면 "100" === 100false 가 되니깐 조건이 통과되지 않는다.
결국 모든 유저가 Red팀으로 들어가게 된다.


해결 방법


그래서 조건을 아래처럼 수행했다.

team: String(player.TEAM) === "100" ? "Blue" : "Red";

이렇게 하면 player.TEAM"100" 이든 100 이든
무조건 문자열 "100"으로 변환해서 비교하기 때문에 타입 차이로 인한 오류를 막을 수 있다.

타입 안정성을 높이는 좋은 습관이긴 했지만,
결과적으로는 이 코드 자체가 배포 서버에 반영되지 않았던 것이 진짜 원인이었다.

진짜 원인

나는 프론트는 Netlify로 배포하고 있고, .rofl 파일의 파싱을 담당하고 있는 백은 CloudType 을 쓰고 있다.

내 착각인건지는 잘 모르겠는데 일단 Netlify 는 커밋 및 푸쉬를 하면 자동으로 재빌드 를 해주었다. 그래서 CloudType 도 그렇게 하면 재빌드를 해주었던것 같았는데 그게 아니었다.

확인을 해보니 예전 빌드를 쓰고있었다.

team: player.TEAM === 100 ? "Blue" : "Red";

이 부분이 문제였다. 당연히 player.TEAMString 으로 밖에 오질 않는데 Number 값과 비교하니 false 일 수 밖에 없었다. 그러니 당연히 Red 인것이고.

로컬은 따로 node 에서 로컬서버를 돌리고 있기 때문에 수정된 버전을 사용하고 있었는데 배포사이트에서는 예전 버전을 사용하고 있었다.

따라서, 백서버를 재 빌드 하고 테스트 해보니 배포사이트에서도 잘 되는 것을 확인할 수 있었다.



느낀 점


이번 경험을 통해 몇 가지 중요한 교훈을 얻었다.

  • 타입 안정성의 중요성 : 문자열과 숫자는 엄연히 다르며, 조건 비교 시 주의가 필요하다.

  • 타입스크립트 도입의 필요성 : 타입스크립트였다면 이런 실수를 훨씬 더 빨리 캐치할 수 있었을 것이다.

  • CI/CD 파이프라인에 대한 이해 부족 : 프론트는 Netlify 로 자동 배포되지만, 백엔드는 CloudType 에서 수동으로 배포해야 한다는 것을 몰랐다. 앞으로는 자동화된 CI/CD 설정을 적용해서 커밋할 때마다 백엔드도 자동으로 최신화되도록 구성하고 싶다.


이번 해프닝은 작은 실수였지만,
타입과 배포 환경의 중요성을 몸으로 배울 수 있었던 좋은 계기가 되었다.

그리고, 나는 다시 테스트한다고 엉망이 된 Elo 점수들을 복구하기 위해서 다시 매치들을 기록해야된다.

profile
완전완전완전초보초보초보

0개의 댓글