Snowflake ID 도입 후의 삽질_1(JS)

snowflake-js-conflict

Snowflake ID 도입 후의 삽질_1(JS)

INTRO

최근에 진행 중인 Spring Boot 사이드 프로젝트에서, JPA의 @Id에 Snowflake ID를 적용하기로 했어요.
(다들 GenerationType 말고, 직접 통제 가능한 방식을 써보고 싶어 했거든요.)

그냥 ID만 넣어주면 끝일줄 알았는데... 뜻밖의 삽질들이 기다리고 있었어요.

JS

?? 스프링 부트라며 ? 뜬금없이 JS?

첫 번째 삽질은 프론트엔드 쪽에서 응답을 받기 시작하면서 터졌어요.
Snowflake로 생성한 id를 { id: Long } 형태로 넘겼을 뿐인데,
프론트엔드 팀원이 id 가 잘못 넘어온다고 하시더라고요.

처음엔 로직이 꼬이거나, DTO 매핑이 잘못됐나 싶었어요.
하지만 백엔드 로그는 죄다 정상이였죠...

문제는 자바스크립트였어요.
Is Js rasist?

JS의 Number 타입은 정확하게 표현가능한 정수 범위가 제한적이에요.

-2^53(-9007199254740991) ~ 1, 2^53 - 1 (9007199254740991) 까지만 정확하게 표현할 수 있고, 그 이상부터는 숫자가 깨지거나, 이상하게 동작하게 되요. (심지어 부동소숫점도 Number를 사용해서...)

자바 Long의 범위는 -2⁶³  ~  2⁶³ - 1인데
AutoIncrement를 사용했다면 한평생이 걸리겠지만
SnowFlake를 사용했다면 시작부터 JS가 감당하지 못하는 숫자를 뿜어내요.

해결방법

결국 js Number로는 우리의 Id를 감당할 수 없으니,
프론트에 넘겨줄 때 Long을 String으로 넘겨주면 되요.
프론트에서는 String으로 다루고, 다시 백엔드로 넘어올땐, ArgumentResolver의 힘으로 Long을 받아 처리하는거죠.

하지만 이게 끝이 아니였는데...