본문으로 건너뛰기

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

·174 단어수·1 분· loading
목차

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로는 우리의 snowflake id를 감당할 수 없으니, 프론트에 넘겨줄 때 Long을 String으로 바꿔서 넘겨주는거에요. 프론트에서는 String으로 다루고, 다시 백엔드로 넘어올땐 ArgumentResolver의 힘으로 Long으로 받는거죠.

물론 API명세에 설명하는건 잊지 말고요

하지만 이게 끝이 아니었는데… next