
๐ 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๋ฅผ ์ฌ์ฉํฉ๋๋ค.
const newComment = {
id: uuidv4(),
text: '์ด ๋๊ธ์ Optimistic UI์
๋๋ค.',
};
โ Optimistic UI๋? ๊ฒฐ๊ณผ๊ฐ ์์ง ํ์ ๋์ง ์์์ง๋ง, UI๋ฅผ ๋จผ์ ๋ฐ๊ฟ์ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅธ ํผ๋๋ฐฑ์ ์ฃผ๋ ์ ๋ต์ ๋๋ค.
๐ ์์: ๋๊ธ ์์ฑ
// ์ฌ์ฉ์๊ฐ ๋๊ธ ์
๋ ฅ ํ "๋ฑ๋ก" ๋ฒํผ์ ๋๋ฆ
1. ํด๋ผ์ด์ธํธ์์ ๋๊ธ์ ๋ฐ๋ก UI์ ์ถ๊ฐ โ uuid ๋ฑ์ผ๋ก ์์ id ๋ถ์ฌ
2. ๋์์ ์๋ฒ์ API ์์ฒญ
3. ์๋ฒ ์๋ต ์ค๋ฉด ์ง์ง ID๋ก ๊ต์ฒด or ์คํจ ์ ๋กค๋ฐฑ
โ ํต์ฌ ํฌ์ธํธ:
UUID๋ ๋ณด์์ฉ ํ ํฐ์ผ๋ก ์ฌ์ฉํ์ง ๋ง ๊ฒ (ex. JWT ๋์ฒด ๋ถ๊ฐ)
โ์ด์ :
uuid๋ ๋๋คํ ๊ฐ์ ์์ฑํ ์๋ ์์ง๋ง,
์ํธํ(Encryption)๋๊ฑฐ๋ ์๋ช (Signed)๋์ง ์์ ๋ฌธ์์ด์ด๊ธฐ ๋๋ฌธ์
๋ก๊ทธ์ธ ๋ํฐ, API ์ธ์ฆ ํค, ๋ฏผ๊ฐํ ์ธ์ฆ ์ ๋ณด์๋ ์ฐ๋ฉด ์๋ฉ๋๋ค.
UUID๋ ๋ก์ปฌ์์ ์์ฑ๋๋ฏ๋ก, ์ค๋ณต ๋ฐฉ์ง๋ฅผ ์ํด ์๋ฒ์์๋ ํ์ธ ํ์
โ์ด์ : UUID๋ ๊ฑฐ์ ์ถฉ๋์ด ์์ง๋ง, ์ด๋ก ์ ์ผ๋ก๋ 0.0000000000000001%๋ผ๋ ์ค๋ณต ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ๊ทธ๋์ ์๋ฒ์์๋ ํด๋น uuid๊ฐ ์กด์ฌํ๋ฉด ๊ฑฐ์ ํด์ผํฉ๋๋ค.
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('๋๊ธ ์์ฑ ์คํจ');
});
}
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์ ์ถฉ๋์ด๋ ์์ธก ๊ฐ๋ฅ์ฑ์ ํผํ๊ณ ๊ณ ์ ์ฑ์ด ๋ณด์ฅ๋๋ ์๋ณ์๊ฐ ํ์ํ ๊ฒฝ์ฐ |