๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ”ฌapplication/- DDD

[DDD] Entity ์™€ ์‹๋ณ„์ž(identifier) ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์ด์•ผ๊ธฐ

by Wonit 2023. 7. 15.

๋ชฉ์ฐจ

  • ์„œ๋ก 
  • ์‹๋ณ„์ž๋ž€ ๋ฌด์—‡์ธ๊ฐ€
  • ์‹๋ณ„์ž์˜ ์ข…๋ฅ˜
    • ์ „์—ญ ์‹๋ณ„์ž์™€ ์ง€์—ญ ์‹๋ณ„์ž
  • ์‹๋ณ„์ž๋Š” ์–ธ์ œ ์ƒ์„ฑ๋˜๋Š”๊ฐ€?
    • ๋น ๋ฅธ ์‹๋ณ„์ž ์ƒ์„ฑ๊ณผ ๋Šฆ์€ ์‹๋ณ„์ž ์ƒ์„ฑ
      • ๋น ๋ฅธ ์‹๋ณ„์ž: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ
      • ๋Šฆ์€ ์‹๋ณ„์ž: ๊ฐ์ฒด๊ฐ€ ์˜์†ํ™” ๋  ๋•Œ
  • 3๊ฐ€์ง€ ์‹๋ณ„์ž ์ƒ์„ฑ ๋ฐฉ๋ฒ•
    1. db ์—์„œ ์ƒ์„ฑ
    2. application ์—์„œ ์ƒ์„ฑ
    3. ๋‹ค๋ฅธ aggregate ์—์„œ ์ƒ์„ฑ

 

์„œ๋ก 

 

์ง€๋‚œ์‹œ๊ฐ„ entity ๋ž€ ๋ฌด์—‡์ธ๊ฐ€์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆด๋‹ค.

 

[DDD] Entity ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ์ด์•ผ๊ธฐ

๋ชฉ์ฐจ ์„œ๋ก  entity ๋ž€ ๋ฌด์—‡์ธ๊ฐ€ ๋„๋ฉ”์ธ ์„ธ์ƒ ์ด์•ผ๊ธฐ vo ์™€ entity ๊ฐ€ ์žˆ๋‹ค ๋ฌด์—‡์ด entity ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š”๊ฐ€? entity ์˜ ์†์„ฑ invariant immutable entity ์˜ ํ–‰์œ„ object autonomy self encapsulation ์„œ๋ก  DDD ์—์„œ๋Š” ์œ ๋น„์ฟผํ„ฐ์Šค

wonit.tistory.com

 

์ง€๋‚œ ์‹œ๊ฐ„์— ์ด์•ผ๊ธฐํ–ˆ๋˜ entity ๋ฅผ ๋‹ค์‹œ ์ •๋ฆฌํ•˜์ž๋ฉด,

 

entity ๋Š” ํ•ต์‹ฌ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ค‘ ํ•˜๋‚˜๋กœ ๋„๋ฉ”์ธ ๊ฐ์ฒด๊ฐ€ ์—ฐ์†์„ฑ์„ ๊ฐ€์ง€๊ธฐ ์œ„ํ•ด ์‹๋ณ„์ž๋ฅผ ๋ถ€์—ฌ๋ฐ›์•„ ์˜์†์„ฑ ์žฅ์น˜์— ์˜์†ํ™”๊ฐ€ ๋˜๋Š” ๋Œ€์ƒ ๊ฐ์ฒด์ด๋‹ค.

 

์ด๋ฒˆ์—๋Š” ์‹๋ณ„์ž์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๋ ค ํ•œ๋‹ค.

 

์‹๋ณ„์ž๋ž€ ๋ฌด์—‡์ธ๊ฐ€, Identifier

 

์‹๋ณ„์ž๋Š” ๊ฐ์ฒด๋ฅผ ์œ ์ผํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์œ ํ•œ ๊ฐ’ ๋˜๋Š” ์†์„ฑ์ด๋‹ค.

 

์‹๋ณ„์ž๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์•ž์„  ์ด์•ผ๊ธฐ์ฒ˜๋Ÿผ ์‹๋ณ„ํ•ด์•ผํ•˜๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด๋Š” ์—”ํ‹ฐํ‹ฐ์ด๋‹ค.

 

๊ฒฐ๊ตญ ์—”ํ‹ฐํ‹ฐ์˜ ๋Œ€ํ‘œ id ์ธ ์…ˆ์ด๋‹ค.

 

์‹๋ณ„์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Relation Database ์—์„  Primary Key ๋ผ๊ณ  ๋ถˆ๋ฆฌ๊ณ  document database ์—์„œ๋Š” Key ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋Š”๋ฐ, ์˜์†์„ฑ ์žฅ์น˜์— ์ €์žฅ๋œ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์˜ค๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” row ๊ณ ์œ  ๊ฐ’๊ณผ ๋™์ผํ•˜๋‹ค.

 

์ผ๋ฐ˜์ ์œผ๋กœ key ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๋ณต์žกํ•˜๋‹ค

 

key ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค๋Š” ๊ฒƒ์€ ์‹œ์Šคํ…œ์—์„œ ๊ณ ์œ ํ•œ ๊ฐ’์„ ์ƒ์„ฑํ•ด๋‚ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ ๋‚ด์„ฑ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•˜๋‹ค.

 

๊ทธ๋ž˜์„œ ๋ณดํ†ต์˜ ๊ฒฝ์šฐ key ์˜ ๊ธธ์ด๋ฅผ ๋Š˜๋ ค ์ถฉ๋Œ์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ํ›„๋ณด๊ตฐ์„ ํ™• ๋Š˜๋ ค๋ฒ„๋ฆฌ๊ธฐ๋„ ํ•œ๋‹ค.

 

9141 <- 2^14 ๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜
1924175127931237 <- ๋Œ€์ถฉ 2^49 ๊ฐ€์ง€์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜

 

์ถฉ๋Œ๋‚ด์„ฑ ํŠน์„ฑ์„ ๋งŒ์กฑํ•ด๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ๋‚œ์ˆ˜๋ฉด ๋ ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ผ๋ฐ˜์ ์ธ ์ฃผ๋ฌธ ๋„๋ฉ”์ธ์—์„œ๋Š” id ๋กœ ์†Œํ†ตํ•˜๋Š” ์ผ€์ด์Šค์™€ ์ดํ•ด๊ด€๊ณ„์ž๋“ค์ด ๋งŽ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— uuid ๋‚˜ guid ๊ฐ™์€ ๋ณต์žกํ•œ ๊ฐ’๋ณด๋‹ค human readable ํ•œ ๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค.

 

โŒ 1c0db7f4-1e1e-4d0f-9c7c-f7fc0a486db2
โœ… ORD-20230701-991572

 

๋˜ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•˜๋Š” ํ™˜๊ฒฝ์€ multiple computing engine ์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ์„ฑ์— ๋Œ€ํ•ด์„œ ์•ˆ์ „ํ•˜๋„๋ก ๊ณ ๋ ค๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

 

๋˜ํ•œ key ๋Š” ๋ณด์•ˆ์  ์ธก๋ฉด์—์„œ๋„ ๊ณ ๋ ค๋˜์–ด์•ผ ํ•œ๋‹ค.

 

์–ด๋–ค ๋„๋ฉ”์ธ์—์„œ๋Š” key ์ž์ฒด๊ฐ€ ์œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉด ์•ˆ๋  ์ˆ˜ ์žˆ๋‹ค.

 

key ๊ฐ€ ์ž๋™ ์ฆ๋ถ„์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค๋ฉด ํŠน์ • key ๋ฅผ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์„œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ณ , ์„œ๋น„์Šค์˜ ์ด์šฉ์ž์˜ ์‚ฌ์ด์ฆˆ๋‚˜ ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ์œ ์ถ”๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

A ํšŒ์‚ฌ์˜ ์ฃผ๋ฌธ id ๋ฅผ ์ฆ๋ถ„์œผ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด B ํšŒ์‚ฌ ์ „๋žตํŒ€์—์„œ A ํšŒ์‚ฌ์˜ ์ตœ๊ทผ ์ฃผ๋ฌธ id ๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค ์ด์šฉ์ž๊ฐ€ ํ•˜๋ฃจ๋™์•ˆ ์–ผ๋งˆ๋‚˜ ์ฃผ๋ฌธ์„ ํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

์‹๋ณ„์ž์˜ ์ข…๋ฅ˜

 

์‹๋ณ„์ž์—๋Š” ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ, ์‹๋ณ„์„ ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ์‹๋ณ„์ž์˜ ์ข…๋ฅ˜๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

 

  1. ์ „์—ญ ์‹๋ณ„์ž
  2. ์ง€์—ญ ์‹๋ณ„์ž

 

์ „์—ญ ์‹๋ณ„์ž

 

์ „์—ญ ์‹๋ณ„์ž๋Š” ์‹œ์Šคํ…œ์—์„œ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„๋˜์–ด์•ผ ํ•˜๋Š” ๋Œ€์ƒ๋“ค์—๊ฒŒ ๋ถ€์—ฌํ•˜๋Š” ์‹๋ณ„๊ฐ’์ด๋‹ค.

 

์ „์—ญ ์‹๋ณ„์ž๋Š” ์ค‘๋ณต๊ณผ ์ถฉ๋Œ ๊ทธ๋ฆฌ๊ณ  ๋ณด์•ˆ์  ์š”์†Œ๋ฅผ ๋‹ค๋ฐฉ๋ฉด์œผ๋กœ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.

 

์ผ๋ฐ˜์ ์œผ๋กœ ์ „์—ญ์‹๋ณ„์ž๋Š” ๋„๋ฉ”์ธ ํ˜น์€ ํ…Œ์ด๋ธ” ๋‚ด์—์„œ๋งŒ ์‹๋ณ„์„ฑ์„ ๊ฐ€์ง€๋Š”๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ „์ฒด์ ์ธ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์—์„œ ์‹๋ณ„์„ฑ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

 

์ง€์—ญ ์‹๋ณ„์ž

 

๋ฐ˜๋ฉด์— ์ง€์—ญ์‹๋ณ„์ž๋Š” ์‹œ์Šคํ…œ ์ „์—ญ์—์„œ ์‹๋ณ„์„ฑ์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†์ง€๋งŒ, ํŠน์ • ๋ฐ์ดํ„ฐ ๋‚ด๋ถ€์—์„œ๋งŒ ์‹๋ณ„์„ฑ์„ ๊ฐ€์ง€๋ฉด ๋œ๋‹ค.

 

๋น„๊ต์  ์ „์—ญ์‹๋ณ„์ž๋ณด๋‹ค ๋” ์ ์€ ๋…ธ๋ ฅ์œผ๋กœ ์‹๋ณ„๊ฐ’์„ ์ƒ์„ฑํ•ด๋‚ผ ์ˆ˜ ์žˆ๊ณ  ๊ทธ ํ›„๋ณด๊ตฐ ์ž์ฒด๋„ ์ ๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ์— ๋น„๊ต์  ์•ˆ์ „ํ•˜๋‹ค.

 

๋•Œ์— ๋”ฐ๋ผ์„œ๋Š” ์ง€์—ญ ์‹๋ณ„์ž์—๊ฒŒ ์ปฌ๋ ‰์…˜์˜ ์ธ๋ฑ์Šค ํ˜น์€ ๋‚œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

์•„๋ž˜์˜ ๊ทธ๋ฆผ์€ ์ „์—ญ ์‹๋ณ„์ž์™€ ์ง€์—ญ ์‹๋ณ„์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ทธ๋ฆผ์ด๋‹ค.

 

 

๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ๋งŒ๋“  ์ž๋™์ฐจ์˜ ๋ชจ์Šต์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด, Car ์—”ํ‹ฐํ‹ฐ๋Š” ์‹œ์Šคํ…œ ์ „์—ญ์ ์œผ๋กœ ์‹๋ณ„์ด ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ ์‹๋ณ„์ž๋ฅผ ๊ฐ–์ง€๋งŒ, ๋ฐ”ํ€ด(Wheel) ๋Š” ์•ž, ๋’ค, ์ขŒ, ์šฐ๋งŒ ์‹๋ณ„๋˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ญ ์‹๋ณ„์ž๋ฅผ ๊ฐ–๋Š”๋‹ค.

 

์‹๋ณ„์ž๋Š” ์–ธ์ œ ์ƒ์„ฑ๋˜๋Š”๊ฐ€?

 

์‹๋ณ„์ž๋Š” ์–ธ์ œ ์ƒ์„ฑ๋˜์–ด ์—”ํ‹ฐํ‹ฐ์—๊ฒŒ ํ• ๋‹น๋˜๋Š๋ƒ? ์— ๋”ฐ๋ผ์„œ 2๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋  ์ˆ˜ ์žˆ๋‹ค.

 

  1. Entity ๊ฐ€ ์ƒ์„ฑ๋œ ํ›„
  2. Entity ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ „

 

์ด๋ ‡๊ฒŒ Entity ์˜ ์ƒ์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์‹œ์ ์— ๋”ฐ๋ผ์„œ ๋น ๋ฅธ ์‹๋ณ„์ž ํ• ๋‹น๋ฒ• ๊ณผ ๋Šฆ์€ ์‹๋ณ„์ž ํ• ๋‹น๋ฒ• ์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค

 

Entity ๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑ, ๋Šฆ์€ ์‹๋ณ„์ž ์ƒ์„ฑ

 

๋ง ๊ทธ๋Œ€๋กœ ์‹๋ณ„์ž๋ฅผ Entity ๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ ์ƒ์„ฑ & ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜์ ์œผ๋กœ Database ์˜ id ์ƒ์„ฑ ์œ„์ž„์„ ์ด์šฉํ•œ ๊ตฌํ˜„์ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๋‹ค.

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด MySQL ์—์„œ AUTO_INCREMENT๋กœ ์‚ฐ์ˆ  ์ฆ๋ถ„ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100)
);

 

์•ž์„œ key ์ƒ์„ฑ์ด ๋ณต์žกํ•˜๋‹ค๊ณ  ์ด์•ผ๊ธฐ ํ–ˆ๋Š”๋ฐ, ๊ทธ ๋ณต์žกํ•œ ๊ณผ์ •์„ database ์˜ ๊ธฐ์ˆ ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.

 

database ์˜ ์•ˆ์ •์„ฑ๋งŒ ๋ณด์žฅ๋œ๋‹ค๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ thread-safe & concurrent safe ํ•œ id ๋ฅผ ์ฆ๋ถ„ํ•˜์—ฌ ๋ฐœ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ id ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค

 

ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ๋„๋ฉ”์ธ ์ด๋ฒคํŠธ์—์„œ ๋ฐœ์ƒ๋œ๋‹ค.

 

๋„๋ฉ”์ธ ์ด๋ฒคํŠธ๋Š” ๋„๋ฉ”์ธ์—์„œ ๋ฐœ์ƒํ•œ ๋น„์ฆˆ๋‹ˆ์Šค์ ์œผ๋กœ ์˜๋ฏธ์žˆ๋Š” ์ผ์ข…์˜ ์‚ฌ๊ฑด์ด๋‹ค. ๋„๋ฉ”์ธ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์ด๋Š” DDD ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ์ผ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”ํ›„ ๊นŠ๊ฒŒ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

๋Œ€๋ถ€๋ถ„์˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์ƒ์„ฑ๋จ ์ด๋ผ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์ค‘์š”ํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ domain event ๊ฐ€ ๋ฐœํ–‰๋˜๋Š” ์‹œ์ ์—๋Š” ์ฆ‰, ๋„๋ฉ”์ธ ํ•ต์‹ฌ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ƒ์„ฑ๋œ ์‹œ์ ์—๋Š” database ์— ์ ‘๊ทผํ•˜๊ธฐ ์ „์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Šฆ์€ ์‹๋ณ„์ž ํ• ๋‹น์œผ๋กœ domain entity ์˜ id ๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.

 

 

Spring Data ์™€ Spring Events ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Šฆ์€ ์‹๋ณ„์ž ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์ƒ์„ฑ๋จ์— ๋Œ€ํ•œ domain event ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, (์ด๋Š” ์—ญ์‹œ ์ถ”ํ›„ ๋‹ค๋ฃจ๊ธฐ๋กœ ํ•˜๊ฒ ๋‹ค.)

 

Spring Data ์™€ Spring Events ๋ฅผ ํ™œ์šฉํ•œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ id ์ƒ์„ฑ์˜ ์ฃผ์ฒด๊ฐ€ ๋ชจ๋‘ DB ์— ์˜์กด์ ์ด๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

 

๋˜๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์œ ์ผ ์‹๋ณ„์ž๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜์ ์œผ๋กœ call ๋งˆ๋‹ค shared counter ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋Œ€๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋…๋ฆฝ๋œ ์„œ๋ฒ„์—์„œ ๋™์ผํ•œ id ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค

 

Entity ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ „ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑ, ๋น ๋ฅธ ์‹๋ณ„์ž ์ƒ์„ฑ

 

์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๋ฐ”๋กœ ๋น ๋ฅธ ์‹๋ณ„์ž ์ƒ์„ฑ์ด๋‹ค.

 

์•ž์„  ๋ฌธ์ œ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ๊ฐ€์ง€ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์œผ๋กœ, ์‹๋ณ„์ž ์ž์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด์„œ entity ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ์ž ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

public class User {

    // id ๋ฅผ ์™ธ๋ถ€์—์„œ ์ƒ์„ฑํ•ด์„œ ์ „๋‹ฌ
    public static User newInstance(long id, String username) {
        return new User(id, username);
    }

    private final long id; // invariant
    private final String username;
    // ...
}

 

์ด๋ ‡๊ฒŒ ๋˜๋ฉด entity ์˜ ์ž…์žฅ์—์„œ๋Š” id ์ƒ์„ฑ ์ฃผ์ฒด๊ฐ€ ๋ˆ„๊ฐ€ ๋˜๋“  ์ƒ๊ด€ ์—†์ด ์ผ๊ด€๋˜๊ฒŒ ๋™์ž‘๋  ์ˆ˜ ์žˆ๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์€ DB ์— ์˜์กด์ ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ•ต์‹ฌ์€ application ๋‚ด์—์„œ id ๋ฅผ ์–ธ์ œ๋“ ์ง€ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์— ์žˆ๋‹ค.

 

domain-event ์— ๋Œ€ํ•ด์„œ๋„ ์•ˆ์ „ํ•˜๊ณ , ์™ธ๋ถ€ ํ†ตํ•ฉ์„ ์œ„ํ•œ message ์˜ id ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์€ ๊ฐœ์ธ์ ์œผ๋กœ ๋„๋ฉ”์ธ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹๋ณ„์ž๊ฐ€ ํŠน์ • ๊ธฐ์ˆ ์— ์˜์กดํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ์‹๋ณ„์ž ์ƒ์„ฑ์— ๋Œ€ํ•ด ๊ฐ€์‹œ์ ์ด๊ณ  ํ†ต์ผ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์ธ์ ์œผ๋กœ ๊ฐ€์žฅ ์„ ํ˜ธํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

์ด ๋น ๋ฅธ ์‹๋ณ„์ž ํ• ๋‹น๋ฒ•์€ ๊ตฌํ˜„๋ฒ•์ด ๋‹ค์–‘ํ•œ๋ฐ, ์•„๋ž˜์—์„œ ๋Œ€ํ‘œ์ ์ธ ๊ตฌํ˜„๋ฒ• 3๊ฐ€์ง€๋ฅผ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž

 

์ •๋ฆฌ

  • ์‹๋ณ„์ž ์ƒ์„ฑ์€ entity ์˜ ์ƒ์„ฑ ์ „๊ณผ ํ›„์— ๋”ฐ๋ผ ๋‚˜๋‰œ๋‹ค.
    • entity ์ƒ์„ฑ ์ „: ๋น ๋ฅธ ์‹๋ณ„์ž ์ƒ์„ฑ
    • entity ์ƒ์„ฑ ํ›„: ๋Š๋ฆฐ ์‹๋ณ„์ž ์ƒ์„ฑ
  • ๋Š๋ฆฐ ์‹๋ณ„์ž ์ƒ์„ฑ
    • ๋ณต์žกํ•œ ์‹๋ณ„์ž ์ƒ์„ฑ์˜ ์ฑ…์ž„์„ ์™ธ๋ถ€์˜ ๋„์›€์„ ๋ฐ›์•„ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•œ๋‹ค
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์กด์ ์ด๋‹ค.
    • domain event ๋‚˜ ์™ธ๋ถ€ ์‹œ์Šคํ…œ ํ†ตํ•ฉ์— ์ œํ•œ์ ์ด๋‹ค
    • ๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ ์œ ์ผ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋น ๋ฅธ ์‹๋ณ„์ž ์ƒ์„ฑ
    • ํŠน์ • ๊ธฐ์ˆ ์ด๋‚˜ ๊ตฌํ˜„์— ์˜์กด์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
    • ์‹๋ณ„์ž ์ƒ์„ฑ์„ ์ œ์–ดํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์˜ ์‹๋ณ„์ž ์ƒ์„ฑ ๋ฐฉ๋ฒ•์ด ํ†ต์ผ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ณต์žกํ•œ ์‹๋ณ„์ž ์ƒ์„ฑ์˜ ์ฑ…์ž„์„ ๊ฐ๋‚ดํ•ด์•ผ ํ•œ๋‹ค

 

์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•

 

์ผ๋‹จ ๋น ๋ฅธ ์‹๋ณ„์ž ์ƒ์„ฑ์„ ์„ ํƒํ–ˆ๋‹ค๋ฉด ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฑ…์ž„์„ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผํ•œ๋‹ค.

 

๋ช‡๊ฐ€์ง€ ๋ฐฉ๋ฒ•์—๋Š” ์—ญ์‹œ ๋ณต์žกํ•œ id ์ƒ์„ฑ์„ ๋Œ€์‹ ํ•ด์ฃผ๋Š” ์™ธ๋ถ€์˜ ๋„์›€์„ ๋ฐ›์•„ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 3๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž

 

  1. DB ์—์„œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑ
  2. Application ๋‚ด์—์„œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑ
  3. ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฑ…์ž„์ด ์žˆ๋Š” ๋‹ค๋ฅธ Bounded Context ์—์„œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑ

 

DB ์—์„œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑ

 

๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ Database ์˜ ๊ธฐ์ˆ ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ AUTO_INCREMENT ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•˜์—ฌ id ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ์ƒ์„ฑ ์ฃผ์ฒด๊ฐ€ DB ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋Š๋ฆฐ ์‹๋ณ„์ž ์ƒ์„ฑ๋ฒ•์—์„œ๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

 

Application ๋‚ด์—์„œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑ

 

์ด ๋ฐฉ๋ฒ•์€ ๊ฐ€์žฅ ๋ช…์‹œ์ ์ด๊ณ  ๊ฐ€์‹œ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

 

 

Application ๋‚ด์—์„œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” EpochTimeBased Id, UUID ๋‚˜ GUID ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ์ด ๋ฐฉ๋ฒ•๋„ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  • Id ์ƒ์„ฑ์˜ ๋ณต์žก์„ฑ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐ๋‹นํ•ด์•ผ ํ•œ๋‹ค
  • ๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ ์•„์ฃผ ์œ ์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์–ด๋ ต๋‹ค

 

์‹๋ณ„์ž ์ƒ์„ฑ์„ ์œ„ํ•œ Bounded Context ์—์„œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑ

 

์˜ค์ง ์‹๋ณ„์ž ์ƒ์„ฑ์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ๋Š” Bounded Context ๋ฅผ ๋งŒ๋“ค๊ณ , ํ•ด๋‹น BC ์—์„œ id ๋ฅผ ํš๋“ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค

 

 

์‹๋ณ„์ž ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ BC ๋‚ด๋ถ€๋กœ ์บก์Šํ™”๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์€ ๋ถ„์‚ฐํ™˜๊ฒฝ์— ์ดˆ์ ์ด ๋งž์ถฐ์ ธ ์žˆ๋‹ค.

 

๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ๋งŽ์€ ๋…๋ฆฝ๋œ ์„œ๋ฒ„๋“ค ์‚ฌ์ด์—์„œ ์œ ์ผํ•œ id ์ƒ์„ฑ์„ ์œ„ํ•ด์„œ id ์ƒ์„ฑ ์ฃผ์ฒด๋ฅผ ํ†ต์ผ์‹œ์ผœ ์ค‘๋ณต์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  • MySQL Centralizing Auto-Increment
  • MySQL Cluster Mode
  • MongoDB id generation
  • Twitter Snowflake Id Generator
  • Baidu UID generator
  • Sonyflake Id Generator

 

์œ„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ํŠน์ง•๊ณผ ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด์„œ ๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ 7๊ฐ€์ง€ ์œ ์ผ id ์ƒ์„ฑ๋ฒ• ๋น„๊ต ๋ฆฌ๋ทฐ ์—์„œ ์ •๋ฆฌํ•ด๋†“์•˜๋‹ค.

 

๋˜ํ•œ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด id ์ž์ฒด์—๋„ ์˜๋ฏธ์žˆ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์ถ”๊ฐ€์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‚˜, ์ด ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งค์šฐ ์‹ ์ค‘์— ์‹ ์ค‘์„ ๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์€ ์„œ๋กœ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์ด๊ธฐ์— ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ํ•„์š”ํ•˜๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ID ์ƒ์„ฑ ์„œ๋ฒ„ ์ž์ฒด๋Š” ์™„๋ฒฝํ•œ Single Point of Failure ์ด๋ฏ€๋กœ ๋งค์šฐ ๊ฐ•ํ•˜๊ฒŒ HA ๊ตฌ์„ฑ์„ ํ•ด์•ผ๊ฑฐ๋‚˜ ์ˆ˜๋งŽ์€ ์„œ๋ฒ„๋“ค ์‚ฌ์ด์˜ Id ์ƒ์„ฑ์— ๋Œ€ํ•œ Orchestration ์ด ํ•„์š”ํ•˜๋‹ค.

 

์ •๋ฆฌ

  • id ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•จ
    • DB ์—์„œ id ์ƒ์„ฑ
    • application ๋‚ด์—์„œ id ์ƒ์„ฑ
    • id ์ƒ์„ฑ์„ ์œ„ํ•œ Bounded Context ์—์„œ ์ƒ์„ฑ
  • DB ์—์„œ id ์ƒ์„ฑ
    • ์žฅ์ 
      • ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋‹ค
    • ๋‹จ์ 
      • DB ์˜์กด์ ์ด๋‹ค
      • ๋ถ„์‚ฐํ™˜๊ฒฝ์˜ ์œ ์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค.
  • application ๋‚ด์—์„œ id ์ƒ์„ฑ
    • ์žฅ์ 
      • id ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค
    • ๋‹จ์ 
      • id ์ƒ์„ฑ์˜ ๋ณต์žก์„ฑ์„ ๊ฐ๋‹นํ•ด์•ผํ•œ๋‹ค
      • ๋ถ„์‚ฐํ™˜๊ฒฝ์˜ ์œ ์ผํ•œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค.
  • id ์ƒ์„ฑ์„ ์œ„ํ•œ Bounded Context ์—์„œ ์ƒ์„ฑ
    • ์žฅ์ 
      • ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ๋„ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค
      • id ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค
    • ๋‹จ์ 
      • SPOF ์ด๋‹ค.
      • ๊ด€๋ฆฌ ํฌ์ธํŠธ๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค

 

๋งˆ์น˜๋ฉฐ

 

์•ž์„œ์„œ Entity ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ „๊ณผ ํ›„๋กœ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๊ณ , ์‹๋ณ„์ž ์ž์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋„ ์—ฌ๋Ÿฌ ์„ ํƒ์ง€๋ฅผ ์•Œ์•„๋ณด์•˜๋‹ค.

 

์ด๋ฒˆ ๋‚ด์šฉ์€ DDD ์ž์ฒด์™€๋Š” ์กฐ๊ธˆ ๋จผ ๋‚ด์šฉ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

 

๋‚˜๋Š” DB AI ๋‚˜ UUID ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ˜น์€ Twitter ๋‚˜ Baidu IdGenerator ๋ฅผ ์ด์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ–ˆ๋˜ ์ ๋„, id generation ์„ ์œ„ํ•œ Bounded Context ๋ฅผ ๊ตฌํ˜„ํ•œ ์ ๋„ ์žˆ๋‹ค.

 

๊ฒฐ๊ตญ์—” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ๋ฌธ์ œ์ ์— ๋ด‰์ฐฉํ–ˆ๋˜ ๊ฒฝํ—˜์ด ๋งŽ์€๋ฐ, ๊ทธ๋งŒํผ ์‹๋ณ„์ž ์ƒ์„ฑ์€ ์‰ฝ์ง€ ์•Š์€ ์ฃผ์ œ์ด๋‹ค.

 

๊ฐ๊ฐ์˜ ํ•ด๋ฒ•์ด ๊ฐ€์ง„ ๊ฐ•์ , ๋‹จ์  ๊ทธ๋ฆฌ๊ณ  ๋ณต์žก์„ฑ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์— ์•Œ๋งž์€ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์„ ์Ÿ์•„์•ผ ํ•œ๋‹ค.

 

์‹๋ณ„์ž ์ƒ์„ฑ์€ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ์†Œํ”„ํŠธ์›จ์–ด ๋ฐฉ๋ฒ•๋ก ๊ณผ ๋™์ผํ•˜๊ฒŒ ํ•œ๊ฐ€์ง€ master key ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

๊ฐ๊ฐ์˜ ์ƒํ™ฉ์„ ์ž˜ ๋ถ„์„ํ•˜๊ณ  ์ •ํ™•ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋Š”๋ฐ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค

 

๋Œ“๊ธ€