오늘 만난 문제
타워를 승급했더니 내 전재산이 null이 돼버린 건에 대하여
01) 문제 발견
프로젝트가 막바지에 들었고, 소소한 수정을 하며 시간을 보내던 중 쎄한 콘솔을 발견했으니, null이란 글자였다... 저 response는 다름 아닌 타워를 승급했을 경우 처리되는 핸들러의 응답이었고, 타워의 능력치는 정상적으로 오르지만, gold 소모에 대한 연산이 무언가 잘못됐음을 직감했다... 문제는 서버에서도 gold 획득과 소모를 기록하고 있었고, 이를 바탕으로 gameEnd에서 검증 및 보너스 점수를 계산하기 때문에, 저런 부정 탄 값이 섞여들어가는 순간 수많은 오류 폭풍이 나타나는 건 따놓은 당상인 수준...
02) 해결 시도
먼저 null이란 자료형의 특성 첫번째!! 비어있음을 명시하기 위해 사용한다는 점에 착안해서, 프로젝트에서 null이 활용되는 부분들을 체크해보기로 했다!! 그런데 이게 웬 걸, 타워 또는 골드, 승급 등등 관련된 모든 로직에 null이 쓰인 부분이 없는 것이다!! 당최 null이 개입될만한 여지가 없었다!! 그래서 하는 수 없이 저 response의 프로퍼티를 직접 확인해보기로 했다!!
그랬더니 오잉? node 환경의 콘솔엔 null이 아니라 NaN이라고 나온다?! 브라우저 환경과 node.js 환경이 다른 건가....? 어쨌든, NaN이면 얘기가 더 쉽다!! 기존 보유 골드와 승급 비용 둘 중 한 넘은 숫자형이 아니란 소리지!!
이에 바로 확인해보니, 잡았다 요 놈!! 초기 골드엔 문제가 없었고, 첫 cost가 undefined인지라, 이후의 모든 값이 NaN이 돼버렸던 것이다!! 그런디 cost 선언부를 보면 Number()까지 써가며 숫자형 보장을 하고 있는데, 어쩌다 undefined가 나온 것인지 궁금해서 추적해보기로 했다!
03) 해결 및 소감
원인은 바로 여기였는데, 서버에서 타워 승급에 따른 능력치 및 재화 변동을 처리하는 함수에서 card란 속성을 활용하고 있었다!! 그런데 뭔가 익숙하지 않아서 저 data가 있는 곳, 바로 assets의 json 파일을 확인해보니 글쎄,
special 타입의 타워에 관한 json 파일에는 있던 card 속성이 pawn 타입의 타워 쪽엔 없는 것이었다!!! 바로 추가해주었고, 확인을 해본 결과!!
제대로 연산이 이뤄지는 모습!! 잘리긴 했지만 위에도 게임 오버가 정상적으로 작동하는 모습이다!! 아마 card를 염두에 두고 로직을 완벽하게 짜놓으셨는데, 모종의 이유로 card 속성이 제거됐던 모양... 소통 오류인지, merge상에서 문제가 생긴 건지, 완벽한 원인을 찾긴 어렵게 됐지만, 추적에 성공한 것이 그래도 뿌듯하다!!
그래서 브라우저 환경엔 왜 null로 나오던 것이 node.js 환경에선 NaN으로 나온 걸까...?
브라우저 출력과 Node.js 출력에 차이가 있는 이유
브라우저에선 JSON 형식의 메세지를 사용하는데, JSON에선 undefined나 NaN 등의 자료 타입을 사용하지 않음!!
따라서 undefined인 값은 생략되거나 null로 대체돼 표현되기도 하고, NaN 역시 null로 대체돼서 출력되는 것!!
예를 들어, { a: 1, b: undefined, c: 3 } 이런 객체를 출력하는 경우, 브라우저에선 value가 undefined인 프로퍼티를 생략하고 { a: 1, c: 3 } 형태로 출력하는 반면, Node.js에선 전부 포함한 { a: 1, b: undefined, c: 3 } 형태로 출력한다!! 한편 [ a, undefined, b ] 이런 배열을 출력하는 경우, 그대로 출력하는 Node.js와 달리, 브라우저는 해당 요소를 null로 대체해 [ a, null, b ]와 같은 형태로 출력한다!!
'TIL&WIL' 카테고리의 다른 글
250102 TIL - any타입, Namespace 기초 (0) | 2025.01.02 |
---|---|
3조 KPT 회고 (0) | 2025.01.02 |
241230 TIL - charAt(), at() (1) | 2024.12.31 |
241227 TIL - 개인과제01 (3) | 2024.12.27 |
241226 TIL - 익명 함수 (0) | 2024.12.26 |