์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ณ ์ ํ ์๋ณ์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ๋ํ์ ์ผ๋ก UUID(ํนํ v4์ v7)์ Snowflake ID๊ฐ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ๊ฐ์ ๋ฐฉ์์ ์ฅ๋จ์ ์ด ์์ผ๋ฏ๋ก, ์ด๋ค ์ํฉ์์ ์ด๋ค ๋ฐฉ์์ ์ ํํ๋ ๊ฒ์ด ์ข์์ง ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค.
UUID(Universally Unique Identifier) v4๋ ์์ ํ ๋๋คํ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ 128๋นํธ ์๋ณ์์ ๋๋ค. ์ฝ๊ฒ ๋งํด, ์์ญ์ต ๊ฐ์ ๋ฉด์ ๊ฐ์ง ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค์ ๊ณ ์ ํ ๊ฐ์ ๋ง๋๋ ๋ฐฉ์๊ณผ ๋น์ทํฉ๋๋ค.
UUID uuid = UUID.randomUUID();
System.out.println("Generated UUID: " + uuid.toString());
UUID v7์ ์๊ฐ ๊ธฐ๋ฐ ID๋ก, ์์ฑ๋ ์์ ์ ํ์์คํฌํ๋ฅผ ํฌํจํ๋ฉด์๋ ์ผ๋ถ ๋๋ค ์์๋ฅผ ์ถ๊ฐํ ๋ฐฉ์์ ๋๋ค. ์ด๋ UUID v4์ ๋จ์ ์ ๋ณด์ํ๊ณ , Snowflake์ ์ผ๋ถ ์ ์ฌํ ํน์ฑ์ ๊ฐ์ง๋๋ค.
implementation 'com.github.f4b6a3:uuid-creator:6.0.0'
UUID uuid = UuidCreator.getTimeOrderedEpoch();
System.out.println("Generated UUID: " + uuid.toString());
Snowflake ID๋ Twitter์์ ๊ฐ๋ฐํ 64๋นํธ ์ ์ ๊ธฐ๋ฐ์ ์๋ณ์์ ๋๋ค. ์๊ฐ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ํน์ ๊ท์น์ ๋ฐ๋ผ ID๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ์ด ๊ฐ๋ฅํ๊ณ ํจ์จ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
Snowflake snowflake = new Snowflake(1); // ๋
ธ๋ ID ์ธํ
String id = String.valueOf(snowflake.nextId());
System.out.println("Generated ID: " + id);
๊ฐ ๋ ธ๋๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์, ์์คํ ๊ฐ ์๊ฐ์ด ์ ํํ ๋๊ธฐํ๋์ง ์์ผ๋ฉด ID ์ถฉ๋์ด๋ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด NTP(Network Time Protocol) ๋ฑ์ ํ์ฉํ์ฌ ์๋ฒ ์๊ฐ์ ๋๊ธฐํํด์ผ ํฉ๋๋ค.
๊ฐ ๋ ธ๋์ ๊ณ ์ ํ Worker ID(๋จธ์ ID)๋ฅผ ์ค์ ํด์ผ ํ๋ฉฐ, ์ด ๊ณผ์ ์์ ์ค๋ณต์ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. Worker ID ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ์ค๋ณต๋ ID๊ฐ ์์ฑ๋ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก ์ ์คํ ๊ด๋ฆฌ๊ฐ ์๊ตฌ๋ฉ๋๋ค.
Snowflake๋ ๋์ผํ ๋ฐ๋ฆฌ์ด์ ์ต๋ 4096๊ฐ์ ๊ณ ์ ID๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด ํ๊ณ๋ฅผ ์ด๊ณผํ๋ฉด ๋ค์ ๋ฐ๋ฆฌ์ด๊น์ง ๋๊ธฐํด์ผ ํ๋ฏ๋ก, ๊ณ ๋ถํ ์ํฉ์์ ์ง์ฐ์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ๋๋ ํธ๋ํฝ์ด ๋ฐ์ํ๋ ์์คํ ์์๋ ๋ถํ ๋ถ์ฐ ์ ๋ต์ด ํ์์ ์ ๋๋ค.
Snowflake๋ 41๋นํธ์ ํ์์คํฌํ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ 69๋ ๊ฐ(2^41 ๋ฐ๋ฆฌ์ด) ์ ํจํฉ๋๋ค. ์ดํ์๋ ํ์์คํฌํ๊ฐ ์ํ๋๋ฉด์ ์ค๋ณต๋ ID๊ฐ ์์ฑ๋ ์ํ์ด ์์ต๋๋ค. ์ฅ๊ธฐ์ ์ธ ์์คํ ์ค๊ณ ์ ์ด๋ฅผ ๊ณ ๋ คํ์ฌ Epoch ์๊ฐ์ ์กฐ์ ํ๋ ๋ฐฉ์์ ๋ง๋ จํด์ผ ํฉ๋๋ค.
Snowflake ID๋ ๋๊ท๋ชจ ๋ถ์ฐ ์์คํ ์์ ๋์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ๋ณด์ฅํ์ง๋ง, ์๊ท๋ชจ ํ๋ก์ ํธ์์๋ ๋ณต์กํ ์ค์ ๊ณผ ์ด์ ๋ถ๋ด์ ๊ฐ์ํ ํ์๊ฐ ์์ ์๋ ์์ต๋๋ค. ๋จ์ผ ์๋ฒ ๋๋ ๊ฐ๋จํ ๋ถ์ฐ ํ๊ฒฝ์์๋ UUID v7 ๊ฐ์ ๋ ๊ฐ๋จํ ๋์์ด ๋ ์ ํฉํ ์ ์์ต๋๋ค.
Snowflake ID๋ 64๋นํธ ์ ์์ด์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ์์๋ 53๋นํธ๊น์ง ์ ์๋ฅผ ์ ํํ๊ฒ ํํํ ์ ์์ต๋๋ค. ์ด ๋๋ฌธ์ JavaScript์์ Snowflake ID๋ฅผ ์ฌ์ฉํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ์ฝ์์์ ๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ฉด:
console.log(10765432100123456789);
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ 10765432100123458000
์ด ๋ฉ๋๋ค.
์ด๋ JavaScript๊ฐ 64๋นํธ ์ ์๋ฅผ ์ ํํ๊ฒ ํํํ์ง ๋ชปํ๊ณ , ์ผ๋ถ ์ซ์๋ฅผ ๋ฐ์ฌ๋ฆผํ์ฌ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ JavaScript์์๋ Snowflake ID๋ฅผ ๋ฌธ์์ด(String)๋ก ๋ค๋ฃจ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
๐ ID ๋ฐฉ์ | โณ ์ ๋ ฌ ๊ฐ๋ฅ ์ฌ๋ถ | ๐ ์ ์ฅ ํฌ๊ธฐ | ๐ ์ฌ์ฉ ์ |
---|---|---|---|
UUID v4 | โ (๋๋ค) | ํผ (128๋นํธ) | ์ผ๋ฐ์ ์ธ ์ ๋ํฌ ID ํ์ ์ |
UUID v7 | โ (์๊ฐ ์) | ํผ (128๋นํธ) | ์ ๋ ฌ์ด ํ์ํ ๋ก๊ทธ, ์ด๋ฒคํธ ID |
Snowflake | โ (์๊ฐ ์) | ์์ (64๋นํธ) | ๊ณ ์ฑ๋ฅ ํธ๋ํฝ ์ฒ๋ฆฌ, ๋ถ์ฐ ์์คํ |
์ด๋ค ID ๋ฐฉ์์ด๋ ํ๋ก์ ํธ์ ๊ท๋ชจ, ์ฑ๋ฅ ์๊ตฌ์ฌํญ, ์ด์ ํธ์์ฑ์ ๊ณ ๋ คํ์ฌ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.