๐Ÿ”ข UUID v4, UUID v7, Snowflake ID ๋น„๊ตํ•˜๊ธฐ

์กฐ์ œยท2025๋…„ 3์›” 28์ผ
0

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ UUID(ํŠนํžˆ v4์™€ v7)์™€ Snowflake ID๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋ฐฉ์‹์€ ์žฅ๋‹จ์ ์ด ์žˆ์œผ๋ฏ€๋กœ, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์–ด๋–ค ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€์ง€ ๋น„๊ตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐ŸŽฒ UUID v4: ์™„์ „ํ•œ ๋žœ๋ค์„ฑ

UUID(Universally Unique Identifier) v4๋Š” ์™„์ „ํžˆ ๋žœ๋คํ•œ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ 128๋น„ํŠธ ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด, ์ˆ˜์‹ญ์–ต ๊ฐœ์˜ ๋ฉด์„ ๊ฐ€์ง„ ์ฃผ์‚ฌ์œ„๋ฅผ ๊ตด๋ ค์„œ ๊ณ ์œ ํ•œ ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

โœ… ์žฅ์ 

  • ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ๊ทนํžˆ ๋‚ฎ์Œ: ์ถฉ๋ถ„ํžˆ ํฐ ๋žœ๋ค ๊ณต๊ฐ„์—์„œ ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต๋  ๊ฐ€๋Šฅ์„ฑ์ด ์‚ฌ์‹ค์ƒ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ค‘์•™ ์„œ๋ฒ„ ์—†์ด ์ƒ์„ฑ ๊ฐ€๋Šฅ: ๋ณ„๋„์˜ ID ์ƒ์„ฑ ์„œ๋น„์Šค ์—†์ด ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โŒ ๋‹จ์ 

  • ์ •๋ ฌ์ด ๋ถˆ๊ฐ€๋Šฅํ•จ: ๋žœ๋คํ•œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ƒ‰์ธ(Indexing) ํšจ์œจ์ด ๋–จ์–ด์ง: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ” ์ฝ”๋“œ

UUID uuid = UUID.randomUUID();
System.out.println("Generated UUID: " + uuid.toString());

โณ UUID v7: ์‹œ๊ฐ„ + ๋žœ๋ค ์กฐํ•ฉ

UUID v7์€ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ID๋กœ, ์ƒ์„ฑ๋œ ์‹œ์ ์˜ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํฌํ•จํ•˜๋ฉด์„œ๋„ ์ผ๋ถ€ ๋žœ๋ค ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋Š” UUID v4์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ณ , Snowflake์™€ ์ผ๋ถ€ ์œ ์‚ฌํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

โœ… ์žฅ์ 

  • ์‹œ๊ฐ„ ์ˆœ ์ •๋ ฌ ๊ฐ€๋Šฅ: ํƒ€์ž„์Šคํƒฌํ”„ ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์ •๋ ฌ์ด ์šฉ์ดํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ๋ฑ์‹ฑ ํšจ์œจ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.
  • ์ค‘์•™ ์„œ๋ฒ„ ์—†์ด ์ƒ์„ฑ ๊ฐ€๋Šฅ: UUID v4์ฒ˜๋Ÿผ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ๋„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โŒ ๋‹จ์ 

  • ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ: UUID v4๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ฌ์ „ํžˆ ๊ธธ์ด๊ฐ€ ๊น€: 128๋น„ํŠธ ๊ธธ์ด๋กœ, ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ์ „์†ก ์‹œ ๋ถ€๋‹ด์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€

implementation 'com.github.f4b6a3:uuid-creator:6.0.0'

์ž๋ฐ” ์ฝ”๋“œ

UUID uuid = UuidCreator.getTimeOrderedEpoch();
System.out.println("Generated UUID: " + uuid.toString());

โšก Snowflake ID: ๋ถ„์‚ฐ ํ™˜๊ฒฝ์„ ์œ„ํ•œ ๊ณ ์„ฑ๋Šฅ ID

Snowflake ID๋Š” Twitter์—์„œ ๊ฐœ๋ฐœํ•œ 64๋น„ํŠธ ์ •์ˆ˜ ๊ธฐ๋ฐ˜์˜ ์‹๋ณ„์ž์ž…๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํŠน์ • ๊ทœ์น™์— ๋”ฐ๋ผ ID๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ๋ฑ์‹ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—๏ธ ๊ตฌ์„ฑ (64๋น„ํŠธ ๊ธฐ์ค€)

  • ํƒ€์ž„์Šคํƒฌํ”„ (41๋น„ํŠธ): ID ์ƒ์„ฑ ์‹œ๊ฐ„์„ ํฌํ•จํ•˜์—ฌ ์ •๋ ฌ ๊ฐ€๋Šฅ
  • ์›Œ์ปค ID (10๋น„ํŠธ): ID๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋…ธ๋“œ(์„œ๋ฒ„) ์‹๋ณ„
  • ์‹œํ€€์Šค ๋ฒˆํ˜ธ (12๋น„ํŠธ): ๊ฐ™์€ ๋ฐ€๋ฆฌ์ดˆ ๋‚ด์—์„œ ์ƒ์„ฑ๋œ ID ๊ตฌ๋ถ„

โœ… ์žฅ์ 

  • ์ˆซ์ž๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ปดํŒฉํŠธ: UUID๋ณด๋‹ค ์งง์•„ ์ €์žฅ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ •๋ ฌ ๊ฐ€๋Šฅ: ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ ์ธ๋ฑ์‹ฑ ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.
  • ๊ณ ์„ฑ๋Šฅ: ๋†’์€ ์ƒ์„ฑ ์†๋„๋กœ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ํ™˜๊ฒฝ์—์„œ๋„ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

โŒ ๋‹จ์ 

  • ์šด์˜ ๋ถ€๋‹ด ์ฆ๊ฐ€: ์›Œ์ปค ID๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๊ณ , ์‹œํ€€์Šค ์ถฉ๋Œ์ด๋‚˜ ์‹œ๊ฐ„ ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€์ ์ธ ์ธํ”„๋ผ ํ•„์š”: Snowflake ID๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ „์šฉ ์„œ๋น„์Šค ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ” ์ฝ”๋“œ

https://github.com/callicoder/java-snowflake/blob/master/src/main/java/com/callicoder/snowflake/Snowflake.java

Snowflake snowflake = new Snowflake(1); // ๋…ธ๋“œ ID ์„ธํŒ…
String id = String.valueOf(snowflake.nextId());
System.out.println("Generated ID: " + id);

โš ๏ธ Snowflake 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 ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 

Snowflake ID๋Š” 64๋น„ํŠธ ์ •์ˆ˜์ด์ง€๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” 53๋น„ํŠธ๊นŒ์ง€ ์ •์ˆ˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— JavaScript์—์„œ Snowflake ID๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์—์„œ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด:

console.log(10765432100123456789);

์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” 10765432100123458000์ด ๋ฉ๋‹ˆ๋‹ค.

์ด๋Š” JavaScript๊ฐ€ 64๋น„ํŠธ ์ •์ˆ˜๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์ง€ ๋ชปํ•˜๊ณ , ์ผ๋ถ€ ์ˆซ์ž๋ฅผ ๋ฐ˜์˜ฌ๋ฆผํ•˜์—ฌ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ JavaScript์—์„œ๋Š” Snowflake ID๋ฅผ ๋ฌธ์ž์—ด(String)๋กœ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ ๊ฒฐ๋ก : ์–ธ์ œ ์–ด๋–ค ID๋ฅผ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ?

๐Ÿ†” ID ๋ฐฉ์‹โณ ์ •๋ ฌ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๐Ÿ“ ์ €์žฅ ํฌ๊ธฐ๐Ÿ” ์‚ฌ์šฉ ์˜ˆ
UUID v4โŒ (๋žœ๋ค)ํผ (128๋น„ํŠธ)์ผ๋ฐ˜์ ์ธ ์œ ๋‹ˆํฌ ID ํ•„์š” ์‹œ
UUID v7โœ… (์‹œ๊ฐ„ ์ˆœ)ํผ (128๋น„ํŠธ)์ •๋ ฌ์ด ํ•„์š”ํ•œ ๋กœ๊ทธ, ์ด๋ฒคํŠธ ID
Snowflakeโœ… (์‹œ๊ฐ„ ์ˆœ)์ž‘์Œ (64๋น„ํŠธ)๊ณ ์„ฑ๋Šฅ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ, ๋ถ„์‚ฐ ์‹œ์Šคํ…œ

๐ŸŽฏ ์ถ”์ฒœ

  • ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” UUID v4 ๋˜๋Š” v7์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ด€๋ฆฌ๊ฐ€ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ •๋ ฌ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ UUID v7์ด ๋” ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ๋Š” Snowflake๊ฐ€ ์„ฑ๋Šฅ์ ์œผ๋กœ ๋” ๋‚˜์€ ์„ ํƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šด์˜ ๋ถ€๋‹ด์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ID ๋ฐฉ์‹์ด๋“  ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ, ์„ฑ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ, ์šด์˜ ํŽธ์˜์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

profile
์กฐ์ œ

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