๐Ÿ†” uuid๋Š” Universally Unique Identifier (๋ฒ”์šฉ ๊ณ ์œ  ์‹๋ณ„์ž)๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์ค‘๋ณต ๊ฑฑ์ • ์—†์ด ๊ณ ์œ  ๊ฐ’์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

npm install uuid

import { v4 as uuidv4 } from 'uuid';

const id = uuidv4(); // ์˜ˆ: 'f5d3ff7e-e8c9-4c0a-ae78-b682fab087b0'
console.log(id);

๐Ÿ”ข ์ฃผ์š” ๋ฒ„์ „

๋ฒ„์ „์„ค๋ช…
v1์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ (timestamp + MAC address ์กฐํ•ฉ)
v4๋žœ๋ค ๊ธฐ๋ฐ˜ (๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฒ„์ „) โœ…
v5๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ (๊ณ ์ •๋œ ์ž…๋ ฅ โ†’ ๊ณ ์ •๋œ UUID ์ƒ์„ฑ => ์ž…๋ ฅ์ด ๊ฐ™์œผ๋ฉด ํ•ญ์ƒ ๊ฐ™์€ UUID ๋ฐ˜ํ™˜ (๐Ÿ’ก ID ๊ณ ์ • ๋ชฉ์ ์— ์œ ์šฉ))

๋ณดํ†ต ๋žœ๋คํ•œ ๊ณ ์œ ๊ฐ’์ด ํ•„์š”ํ•  ๋•Œ๋Š” v4๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์‚ฌ์šฉ ์˜ˆ์‹œ

  • ๊ฒŒ์‹œ๋ฌผ, ๋Œ“๊ธ€, ์‚ฌ์šฉ์ž ๋“ฑ์— ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž„์‹œ ID ์ƒ์„ฑ
  • Optimistic UI์—์„œ ์ž„์‹œ key ๋ถ€์—ฌ
  • ์บ์‹œ key, ํŒŒ์ผ๋ช…, ์„ธ์…˜ ์‹๋ณ„์ž ๋“ฑ์—์„œ ๊ณ ์œ  ๊ฐ’ ์ƒ์„ฑ
const newComment = {
  id: uuidv4(),
  text: '์ด ๋Œ“๊ธ€์€ Optimistic UI์ž…๋‹ˆ๋‹ค.',
};

โ“ Optimistic UI๋ž€? ๊ฒฐ๊ณผ๊ฐ€ ์•„์ง ํ™•์ •๋˜์ง€ ์•Š์•˜์ง€๋งŒ, UI๋ฅผ ๋จผ์ € ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๋Š” ์ „๋žต์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ์˜ˆ์‹œ: ๋Œ“๊ธ€ ์ž‘์„ฑ
// ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ“๊ธ€ ์ž…๋ ฅ ํ›„ "๋“ฑ๋ก" ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ„
1. ํด๋ผ์ด์–ธํŠธ์—์„œ ๋Œ“๊ธ€์„ ๋ฐ”๋กœ UI์— ์ถ”๊ฐ€ โ†’ uuid ๋“ฑ์œผ๋กœ ์ž„์‹œ id ๋ถ€์—ฌ
2. ๋™์‹œ์— ์„œ๋ฒ„์— API ์š”์ฒญ
3. ์„œ๋ฒ„ ์‘๋‹ต ์˜ค๋ฉด ์ง„์งœ ID๋กœ ๊ต์ฒด or ์‹คํŒจ ์‹œ ๋กค๋ฐฑ

โœ… ํ•ต์‹ฌ ํฌ์ธํŠธ:

  • uuid๋Š” ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์— ํฌํ•จ๋˜๋Š” id๋ฅผ ์˜๋ฏธํ•˜๋Š”๊ฒŒ ์•„๋‹˜
  • ์˜ค์ง UI์—์„œ ๊ด€๋ฆฌ์šฉ์œผ๋กœ ์“ฐ๋Š” ์ž„์‹œ ID
  • ์„œ๋ฒ„ ์‘๋‹ต์ด ์˜ค๋ฉด, ์ง„์งœ ์‘๋‹ต์œผ๋กœ ์˜จ ID๋กœ ๋ฎ์–ด์“ฐ๊ธฐํ•จ

โš ๏ธ ์ฐธ๊ณ ์‚ฌํ•ญ

  • UUID๋Š” ๋ณด์•ˆ์šฉ ํ† ํฐ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ง ๊ฒƒ (ex. JWT ๋Œ€์ฒด ๋ถˆ๊ฐ€)

    โœ‹์ด์œ :
    uuid๋Š” ๋žœ๋คํ•œ ๊ฐ’์„ ์ƒ์„ฑํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ,
    ์•”ํ˜ธํ™”(Encryption)๋˜๊ฑฐ๋‚˜ ์„œ๋ช…(Signed)๋˜์ง€ ์•Š์€ ๋ฌธ์ž์—ด์ด๊ธฐ ๋–„๋ฌธ์—
    ๋กœ๊ทธ์ธ ๋„ํฐ, API ์ธ์ฆ ํ‚ค, ๋ฏผ๊ฐํ•œ ์ธ์ฆ ์ •๋ณด์—๋Š” ์“ฐ๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

  • UUID๋Š” ๋กœ์ปฌ์—์„œ ์ƒ์„ฑ๋˜๋ฏ€๋กœ, ์ค‘๋ณต ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์„œ๋ฒ„์—์„œ๋„ ํ™•์ธ ํ•„์š”

    โœ‹์ด์œ : UUID๋Š” ๊ฑฐ์˜ ์ถฉ๋Œ์ด ์—†์ง€๋งŒ, ์ด๋ก ์ ์œผ๋กœ๋Š” 0.0000000000000001%๋ผ๋„ ์ค‘๋ณต ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋ฒ„์—์„œ๋„ ํ•ด๋‹น uuid๊ฐ€ ์กด์žฌํ•˜๋ฉด ๊ฑฐ์ ˆํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

UUID ์‚ฌ์šฉ ์˜ˆ์‹œ

์˜ˆ์‹œ 1. ๋Œ“๊ธ€ ์ž‘์„ฑํ•  ๋•Œ ์ž„์‹œ ID ์ƒ์„ฑ (Optimistic UI)

import { v4 as uuidv4 } from 'uuid';

// ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ“๊ธ€ ์ž‘์„ฑ ํ›„ ์„œ๋ฒ„ ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์ „์— ์ž„์‹œ๋กœ ํ™”๋ฉด์— ๋ณด์—ฌ์คŒ
function addComment(text) {
  // 1. ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž„์‹œ ID ์ƒ์„ฑ
  const tempId = uuidv4();

  // 2. ์ž„์‹œ ๋Œ“๊ธ€ ๊ฐ์ฒด ์ƒ์„ฑ
  const newComment = {
    id: tempId,
    text,
    status: 'pending' // ์•„์ง ์„œ๋ฒ„ ์‘๋‹ต ๋Œ€๊ธฐ ์ค‘
  };

  // 3. UI์— ๋ฐ”๋กœ ๋ฐ˜์˜ (์„œ๋ฒ„ ์‘๋‹ต ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ )
  comments.push(newComment);
  renderComments();

  // 4. ์„œ๋ฒ„์— API ์š”์ฒญ
  api.post('/comments', { text })
    .then(response => {
      // 5. ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์‹ค์ œ ID๋กœ ์ž„์‹œ ID ๊ต์ฒด
      const realId = response.data.id;
      const comment = comments.find(c => c.id === tempId);
      if (comment) {
        comment.id = realId;
        comment.status = 'confirmed';
        renderComments();
      }
    })
    .catch(() => {
      // ์‹คํŒจ ์‹œ ์ž„์‹œ ๋Œ“๊ธ€ ์‚ญ์ œ ํ˜น์€ ์—๋Ÿฌ ํ‘œ์‹œ
      comments = comments.filter(c => c.id !== tempId);
      renderComments();
      alert('๋Œ“๊ธ€ ์ž‘์„ฑ ์‹คํŒจ');
    });
}

์˜ˆ์‹œ 2. ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋‚˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋™์‹œ์— ์ƒ์„ฑํ•ด๋„ ์ถฉ๋Œ ์—†๋Š” ID ํ•„์š”ํ•  ๋•Œ

import { v4 as uuidv4 } from 'uuid';

function createNewUser(name) {
  return {
    id: uuidv4(), // ์ „ ์„ธ๊ณ„์—์„œ ์œ ์ผํ•œ ID ์ƒ์„ฑ
    name
  };
}

const user1 = createNewUser('Alice');
const user2 = createNewUser('Bob');

console.log(user1.id); // ์˜ˆ: 'f5d3ff7e-e8c9-4c0a-ae78-b682fab087b0'
console.log(user2.id); // ์˜ˆ: 'b1a94c54-3c7b-4f9b-8b0d-1c3d1f9d9d8a'

โœ‹์„ค๋ช…:
์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค ๋•Œ, ๊ฐ ๋ฐ์ดํ„ฐ์— ๊ณ ์œ ํ•œ ID๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ๋‹จ์ˆœํžˆ ์ˆซ์ž๋ฅผ 1, 2, 3 ์‹์œผ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด, ๋™์‹œ์— ์ƒ์„ฑํ•  ๊ฒฝ์šฐ ID๊ฐ€ ๊ฒน์น  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
uuidv4() ํ•จ์ˆ˜๋Š” ์ „ ์„ธ๊ณ„ ์–ด๋””์„œ๋‚˜ ์ค‘๋ณต๋  ํ™•๋ฅ ์ด ๊ฑฐ์˜ ์—†๋Š” ๊ณ ์œ ํ•œ ๋ฌธ์ž์—ด ID๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ๋‚˜ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ด๋„ ID ์ถฉ๋Œ ๊ฑฑ์ • ์—†์ด ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์˜ˆ์‹œ์—์„œ createNewUser ํ•จ์ˆ˜๋Š” ์ƒˆ ์‚ฌ์šฉ์ž ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ, uuidv4()๋กœ ๊ณ ์œ  ID๋ฅผ ์ž๋™์œผ๋กœ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ ID๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ธฐ๋ณธ ํ‚ค(primary key)๋กœ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž ๊ตฌ๋ถ„์šฉ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ์š”์•ฝ ์ •๋ฆฌ

์‚ฌ์šฉ ์ƒํ™ฉ์„ค๋ช…
์„œ๋ฒ„์—์„œ ์•„์ง ID๋ฅผ ์•ˆ ๋‚ด๋ ค์คฌ์„ ๋•Œ์„œ๋ฒ„ ์‘๋‹ต ์ „์— ์ž„์‹œ๋กœ ๊ณ ์œ  ID๋ฅผ ์ƒ์„ฑํ•ด UI์— ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ ํ‘œ์‹œ ๊ฐ€๋Šฅ
๋ถ„์‚ฐ๋œ ํ™˜๊ฒฝ์—์„œ ๊ณ ์œ  ์‹๋ณ„์ž๊ฐ€ ํ•„์š”ํ•  ๋•Œ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋‚˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋™์‹œ์— ์ƒ์„ฑํ•ด๋„ ์ค‘๋ณต ๊ฑฑ์ • ์—†๋Š” ์‹๋ณ„์ž ํ•„์š”
์ž๋™ ์ฆ๊ฐ€ ์ˆซ์ž ID ๋Œ€์‹  ์œ ๋‹ˆํฌ ID๊ฐ€ ํ•„์š”ํ•  ๋•Œ์ˆซ์ž ID์˜ ์ถฉ๋Œ์ด๋‚˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ํ”ผํ•˜๊ณ  ๊ณ ์œ ์„ฑ์ด ๋ณด์žฅ๋˜๋Š” ์‹๋ณ„์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ

๐ŸŽฏ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ค‘๋ณต ๊ฑฑ์ • ์—†์ด ๊ณ ์œ  ID๊ฐ€ ํ•„์š”ํ•  ๋•Œ uuid๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

profile
๋‹จ์ˆœ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ, ์ดํ•ดํ•˜๊ณ  ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก.

0๊ฐœ์˜ ๋Œ“๊ธ€