프론트 단계에서 .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" === 100
은 false
가 되니깐 조건이 통과되지 않는다.
결국 모든 유저가 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.TEAM
은 String
으로 밖에 오질 않는데 Number
값과 비교하니 false
일 수 밖에 없었다. 그러니 당연히 Red
인것이고.
로컬은 따로 node
에서 로컬서버를 돌리고 있기 때문에 수정된 버전을 사용하고 있었는데 배포사이트에서는 예전 버전을 사용하고 있었다.
따라서, 백서버를 재 빌드 하고 테스트 해보니 배포사이트에서도 잘 되는 것을 확인할 수 있었다.
이번 경험을 통해 몇 가지 중요한 교훈을 얻었다.
타입 안정성의 중요성 : 문자열과 숫자는 엄연히 다르며, 조건 비교 시 주의가 필요하다.
타입스크립트 도입의 필요성 : 타입스크립트였다면 이런 실수를 훨씬 더 빨리 캐치할 수 있었을 것이다.
CI/CD 파이프라인에 대한 이해 부족 : 프론트는 Netlify 로 자동 배포되지만, 백엔드는 CloudType 에서 수동으로 배포해야 한다는 것을 몰랐다. 앞으로는 자동화된 CI/CD 설정을 적용해서 커밋할 때마다 백엔드도 자동으로 최신화되도록 구성하고 싶다.
이번 해프닝은 작은 실수였지만,
타입과 배포 환경의 중요성을 몸으로 배울 수 있었던 좋은 계기가 되었다.
그리고, 나는 다시 테스트한다고 엉망이 된 Elo 점수들을 복구하기 위해서 다시 매치들을 기록해야된다.