All ContentsCategoryAbout

왜 DB에 2147483647이 들어가는가

19 March, 2021 - Database - 1 min read

최근 진행 중인 프로젝트에서 배송현황 업데이트를 구현해야 했다. 풀필먼트 업체의 API로부터 송장번호가 포함된 주문정보를 가져와 무료 배송조회 API를 호출하여 배송현황을 가져온 뒤 송장번호와 배송상태(state)를 자사 DB에 넣어주는 작업이다. 이를 node-cron으로 한 시간마다 작동하도록 구현했다.

그런데, DB를 살펴보던 도중 이상한 현상을 목격하게 되었다. 송장번호가 입력되어야 하는 필드에 모두 동일한 번호 2147483647 이 인서트 되어있는 게 아닌가. 처음엔 이게 송장번호인줄 알았는데, 조회를 해보니 송장번호는 아니었다. 이미 서비스를 오픈된 상태이기에 난 똥줄이 탔다. 도저히 감이 안 오니까 더욱 그랬다.

어차피 내 머리로는 알 수가 없었기에 구글링을 해보면 뭐라도 나오겠지 싶어 구글에서 2147483647를 검색해봤다. 그랬더니 이게 웬걸. 답이 나왔다.

간단히 요약하자면, 이 번호는 메르헨 소수라는 친구로 32비트 환경에서 내놓을 수 있는 최대값의 integer라는 것이다. 여기서 대충 감이 왔던 나는 해당 필드의 데이터타입을 확인했고, 아니나 다를까 INT(11)이었다. 검색결과에서는 이것을 BIGINT로 수정하면 된다고 했지만, 불안했던 나는 보다 확실하게 VARCHAR(50)로 변경했다. 그리고, 배송현황업데이트를 실행해보니! 마침내 송장번호가 제대로 입력되는 것을 확인할 수 있었다. 해피엔딩.

레온하르트 오일러

© 2023 intzzzero, Built with

Gatsby