Skip to content

Product API ID Precision Loss Issue in Frontend #1

Description

@standard-Chan

문제 현상

Image

모든 값의 ID의 일의자리가 짤리는 현상이 발생

원인 파악 1 - API 응답 확인

/api/products?size=20 API 요청 시 서버 응답에서는 다음과 같은 ID 값이 정상적으로 내려온다.

{
  "id": 323413198667517956
}

원인 파악 2 - FE 응답 확인

하지만 프론트엔드에서 response.json() 으로 파싱한 이후에는 다음과 같이 값이 변경된다.

{
  "id": 323413198667517950 
}

모든 대형 정수(Long/Snowflake ID) 값에서 마지막 자릿수가 손실되는 현상이 발생하고 있다.


원인 분석

JavaScript의 Number 타입은 IEEE 754 double precision 기반이며, 안전 정수 범위는 다음과 같다.

Number.MAX_SAFE_INTEGER
// 9007199254740991

현재 사용 중인 Snowflake ID는 이 범위를 초과하므로, 브라우저 JSON parser(response.json()) 단계에서 정밀도 손실이 발생한다.

문제 발생 지점

const data: T = await response.json();

영향 범위

  • Product ID
  • Snowflake 기반 모든 Long ID
  • 프론트엔드 상태 관리
  • 상세 조회/삭제/수정 API 호출 시 잘못된 ID 전달 가능성 존재

해결 방안

3가지 방법이 있다.

  1. id 값을 String으로 수정한다. (DB는 숫자 그대로)
  2. json 모듈을 뜯어서, BigInt를 받도록 수정한다
  3. snowflake id 생성 값의 범위를 SAFE 범위 이내로 조정한다.
  4. id 값의 타입을 String으로 수정한다.

2의 방법은 복잡하다.
3의 방법은 현재 저장되어있는 DB 값을 모두 수정해야한다.
4의 방법은 DB INDEX 타는 속도가 느리다.
1번 방법이 조금 번거롭긴 하지만(DB타입과 전송 타입이 달라, 매번 확인해주어야한다) 현 시점에는 가장 적합하다.


참고 사항

  • JSON 표준은 BigInt를 지원하지 않는다.
  • response.json() 은 모든 숫자를 JS Number로 파싱한다.
  • Snowflake ID는 일반적으로 문자열로 처리하는 것이 실무 표준이다.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions