• ABOUT
  • POSTS
  • GUESTBOOK

ยฉ 2025 BlueCool12 All rights reserved.

2026.01.14ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๐Ÿ“ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ Long ํƒ€์ž… ID (feat. NestJS)

์ตœ๊ทผ NestJS๋ฅผ ํ™œ์šฉํ•ด ๊ด€๋ฆฌ์ž CMS ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋˜ ๋„์ค‘ ๋ฐฑ์—”๋“œ ์„ค๊ณ„ ์‹œ ๊ณ ์œ  ID ๊ฐ’์œผ๋กœ BigInt๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์น˜๋ช…์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ •๋ฐ€๋„ ์œ ์‹ค ๋ฌธ์ œ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋‹น์žฅ ๋‚ด ์ฝ”๋“œ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋”๋ผ๋„ ์„œ๋น„์Šค๊ฐ€ ์ปค์ ธ ID ๊ฐ’์ด ์ปค์ง€๋Š” ์ˆœ๊ฐ„ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์™œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํฐ ์ˆซ์ž๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ธ์ง€ ์ •๋ฆฌํ•ด๋ณด์ž.


1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ˆซ์ž์˜ ํ•œ๊ณ„: IEEE 754 ํ‘œ์ค€

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ •์ˆ˜(Int)์™€ ์‹ค์ˆ˜(Float)์˜ ๊ตฌ๋ถ„ ์—†์ด ๋ชจ๋“  ์ˆซ์ž๋ฅผ 64๋น„ํŠธ ๋ถ€๋™ ์†Œ์ˆ˜์ (Double Precision) ํ˜•์‹์œผ๋กœ๋งŒ ์ €์žฅํ•œ๋‹ค. ์ด ํ‘œ์ค€(IEEE 754)์— ๋”ฐ๋ฅด๋ฉด 64๋น„ํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฐ๋ถ„๋œ๋‹ค.

  • ๋ถ€ํ˜ธ ๋น„ํŠธ(1๋น„ํŠธ) : ์–‘์ˆ˜์™€ ์Œ์ˆ˜๋ฅผ ๊ฒฐ์ •
  • ์ง€์ˆ˜ ๋น„ํŠธ(11๋น„ํŠธ) : ์†Œ์ˆ˜์ ์˜ ์œ„์น˜๋ฅผ ๊ฒฐ์ •
  • ๊ฐ€์ˆ˜ ๋น„ํŠธ(52๋น„ํŠธ) : ์‹ค์ œ ์ˆซ์ž์˜ ์ •๋ฐ€๋„๋ฅผ ๊ฒฐ์ •

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ์‹ค์ œ ์ •๋ฐ€๋„๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ€์ˆ˜๋ถ€๊ฐ€ 52๋น„ํŠธ๋ฟ์ด๋ผ๋Š” ์ ์ด๋‹ค. ์ด๋กœ ์ธํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ˆ˜์˜ ๋ฒ”์œ„๋Š” ์•ฝ -0.9๊ฒฝ ~ 0.9๊ฒฝ ์‚ฌ์ด๋กœ ์ œํ•œ๋œ๋‹ค.

Number.MAX_SAFE_INTEGER: 9,007,199,254,740,991 (์•ฝ 0.9๊ฒฝ)

๋ฐ˜๋ฉด DB๋‚˜ Java/NestJS์—์„œ ์‚ฌ์šฉํ•˜๋Š” 64๋น„ํŠธ Long(BigInt) ํƒ€์ž…์˜ ๋ฒ”์œ„๋Š” -922๊ฒฝ ~ 922๊ฒฝ์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฒ”์œ„๋ฅผ ํ›จ์”ฌ ์ดˆ๊ณผํ•œ๋‹ค.


2. ์ •๋ฐ€๋„ ์†์‹ค์ด ๋ถ€๋ฅด๋Š” ์—๋Ÿฌ

๋งŒ์•ฝ ์„œ๋ฒ„๊ฐ€ ์•ˆ์ „ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ๋Š” ํฐ ์ˆซ์ž ID๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณด๋‚ธ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ๋ธŒ๋ผ์šฐ์ €๊ฐ€ JSON์„ ํŒŒ์‹ฑํ•˜๋Š” ์ˆœ๊ฐ„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ํ•˜์œ„ ๋น„ํŠธ๋ฅผ ๋ฐ˜์˜ฌ๋ฆผํ•˜๊ฑฐ๋‚˜ ๋ฒ„๋ ค๋ฒ„๋ฆฌ๊ฒŒ ๋œ๋‹ค.

์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ธ ๊ฐ’ = 9,223,372,036,854,775,807
๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐ›์€ ๊ฐ’ = 9,223,372,036,854,776,000 (๊ฐ’์ด ๋‹ค๋ฆ„)

์ด๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ์™œ๊ณก์€ ๋‹จ์ˆœํžˆ ์ˆซ์ž๊ฐ€ ํ‹€๋ฆฌ๋Š” ๊ฒƒ์„ ๋„˜์–ด ์ž˜๋ชป๋œ ID ์ฐธ์กฐ๋กœ ์ธํ•ด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.

# ์ž˜๋ชป๋œ ID๋กœ ์ธํ•œ ์ฐธ์กฐ ์—๋Ÿฌ ์˜ˆ์‹œ
Uncaught TypeError: Cannot read properties of null (reading 'id')



3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ๋ฌธ์ž์—ด ์ง๋ ฌํ™”(Serialization)

์ด ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ์„ค๊ณ„ ๊ทœ์•ฝ์€ ํฐ ์ˆซ์ž๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค.

  1. ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€: ๋ฌธ์ž์—ด์€ ๊ธธ์ด์— ์ œํ•œ์ด ์—†์–ด ์„œ๋ฒ„์˜ 64๋น„ํŠธ ์ •์ˆ˜๋ฅผ 1๋น„ํŠธ์˜ ์˜ค์ฐจ๋„ ์—†์ด ๊ทธ๋Œ€๋กœ ๋ณด์กดํ•œ๋‹ค.
  2. ์‚ฐ์ˆ  ์—ฐ์‚ฐ์˜ ๋ถˆํ•„์š”์„ฑ: ๊ณ ์œ  ID(PK)๋Š” ์‹๋ณ„์„ ์œ„ํ•œ ๊ฐ’์ผ ๋ฟ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ๋Š” ๋“ฑ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฌธ์ž์—ด์ด์–ด๋„ ๊ธฐ๋Šฅ์ƒ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.
  3. ํƒ€์ž… ์•ˆ์ •์„ฑ ํ™•๋ณด: API ๋ช…์„ธ์— ID๋ฅผ string์œผ๋กœ ๊ทœ์ •ํ•˜๋ฉด ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€์งˆ๋  ๊ฐ€๋Šฅ์„ฑ์„ ์‚ฌ์ „์— ์ฐจ๋‹จํ•˜๊ณ  ์ผ๊ด€๋œ ํƒ€์ž…์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.


*NestJS์—์„œ๋Š” class-transformer๋ฅผ ํ™œ์šฉํ•ด ์‘๋‹ต DTO ๋‹จ๊ณ„์—์„œ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด ๊ทœ์น™์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

import { Transform } from 'class-transformer';

export class PostResponseDto {
@Transform(({ value }) => value?.toString()) // BigInt๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ „์†ก
id: bigint;
}

์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ๋Š” ํšจ์œจ์ ์ธ BigInt๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ ํด๋ผ์ด์–ธํŠธ์—๋Š” ์•ˆ์ „ํ•œ string ํƒ€์ž…์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

[Tip] ๋ชจ๋“  ์‘๋‹ต์—์„œ BigInt๋ฅผ ์ž๋™์œผ๋กœ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋Š” ๋ฒ•

๋งค๋ฒˆ DTO์— @Transform์„ ๋ถ™์ด๋Š” ๊ฒƒ์ด ๋ฒˆ๊ฑฐ๋กญ๋‹ค๋ฉด main.ts ์ƒ๋‹จ์— toJSON ํ”„๋กœํ† ํƒ€์ž…์„ ์ •์˜ํ•˜์—ฌ ์ „์—ญ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

// main.ts
if (!(BigInt.prototype as any).toJSON) {
Object.defineProperty(BigInt.prototype, 'toJSON', {
value() {
return String(this);
},
configurable: true,
enumerable: false,
writable: true,
});
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ „์—ญ์ ์œผ๋กœ ๋ชจ๋“  BigInt๊ฐ€ JSON ์ง๋ ฌํ™” ์‹œ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋˜์–ด ์ •๋ฐ€๋„ ์œ ์‹ค ๋ฌธ์ œ๋ฅผ ์›์ฒœ ๋ด‰์‡„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ, ์„œ๋ฒ„์—์„œ ๋ณด๋‚ผ ๋•Œ๋Š” ๋ฌธ์ž์—ด๋กœ ์ž๋™ ๋ณ€ํ™˜๋˜์ง€๋งŒ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฌธ์ž์—ด๋กœ ๋ณด๋‚ธ ID๋ฅผ ์„œ๋ฒ„์—์„œ ์ˆซ์ž๋กœ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค๋ฉด BigInt()๋ฅผ ํ†ตํ•ด ์ˆซ์ž๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

์ด์ „ ๊ธ€
๐Ÿง‘โ€๐Ÿ”ง Lombok์˜ ์ƒ์„ฑ์ž ์–ด๋…ธํ…Œ์ด์…˜
๋‹ค์Œ ๊ธ€
๋‹ค์Œ ๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค ( ฮ‡ . ฮ‡)
์žฅ์‹์šฉ ๋กœ๊ณ