๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿคท๐Ÿผ‍โ™€๏ธ Etc.../- ๊ธฐํƒ€

[์•„ํ‹ฐํด ๋ฆฌ๋ทฐ] ๊ฐ•๋‚จ์–ธ๋‹ˆ ๊ณต์‹ ๋ธ”๋กœ๊ทธ - ํŠธ๋žœ์žญ์…˜์€ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋‹ค

by Wonit 2023. 2. 7.

ํ•ด๋‹น ๊ธ€์€ ๊ฐœ๋ฐœ, ๊ธฐ์ˆ ๊ด€๋ จ ์•„ํ‹ฐํด์ด๋‚˜ ๋ธ”๋กœ๊ทธ ๊ธ€ ํ˜น์€ ์œ ํŠœ๋ธŒ ์˜์ƒ์˜ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ฑฐ๋‚˜ ํ›„๊ธฐ๋ฅผ ์ ๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค.

 

๋ฆฌ๋ทฐํ•  ๊ธ€: '๊ฐ•๋‚จ์–ธ๋‹ˆ ๊ณต์‹ ๋ธ”๋กœ๊ทธ' ์˜ 'ํŠธ๋žœ์žญ์…˜์€ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋‹ค'

 

ํŠธ๋žœ์žญ์…˜์€ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋‹ค

IoC๋ฅผ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ์›์ž์„ฑ ํ™•๋ณด by ๊ฐ•๋‚จ์–ธ๋‹ˆ ๋ธ”๋กœ๊ทธ

blog.gangnamunni.com

 

์ฃผ์ œ์™€ ๊ฐ„๋‹จ ์š”์•ฝ

  • ๊ธ€์“ด์ด์˜ ์ƒํ™ฉ
    • ์„ฑ๊ณผํ˜• ๊ด‘๊ณ  ์‹œ์Šคํ…œ ๋„๋ฉ”์ธ
      • ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋งŽ์€ ๋…ธ์ถœ, ํด๋ฆญ๊ณผ ๊ทธ์— ๋”ฐ๋ฅธ ๊ณผ๊ธˆ์ด ๋ฐœ์ƒํ•จ
    • db ์˜ tx ๋‚˜ ๋‚™๊ด€์  ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ๋„๋ฉ”์ธ ๋ชจ๋ธ์— ๋…ธ์ถœ์ด ๋ ๊ฒƒ ๊ฐ™์Œ
  • ๋ฌธ์ œ ์ƒํ™ฉ ๋ฐœ์ƒ
    • ๋™์‹œ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐ€์ง€ rdb ์ˆ˜์ค€์˜ locking ์˜ ํ•„์š”์„ฑ์ด ๋ฐœ์ƒ
      • pessimistic locking ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋„๋ฉ”์ธ ์„œ๋น„์Šค์— @Transactional ์–ด๋…ธํ…Œ์ด์…˜์ด ํ•„์š”ํ•ด์ง
      • optimisitc locking ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด์— version ์ด๋ผ๋Š” ํ•„๋“œ๊ฐ€ ํ•„์š”ํ•ด์ง
    • ์œ„์˜ ๋‘๊ฐ€์ง€ ์„ ํƒ์ง€๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ์‹ถ์–ด์ง
      • ์ด์œ ๋Š” ๋„๋ฉ”์ธ ์ž์ฒด๊ฐ€ ๊ฐ€์ ธ์•ผํ•  ์ •๋ณด๋“ค์ด ์•„๋‹ˆ๊ธฐ ๋–„๋ฌธ์—
  • ํ•ด๊ฒฐ๋ฒ•
    • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ์ฝ์–ด์™€ ์ˆ˜์ •ํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๋ฌธ์ œ์˜ ์ฝ”๋“œ ํ๋ฆ„ ์ œ์–ด๊ถŒ ๋ฐฐ์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ๋กœํ•จ

AS-IS, locking ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง
TO-BE, ์ฝ”๋“œ ์ œ์–ด๊ถŒ์„ ๋ณ€๊ฒฝํ•จ

 

๋ฆฌ๋ทฐ์™€ ๋‚˜์˜ ํ•ด์„

 

์šฐ์„  ์ด ๊ธ€์„ ์ฝ๊ณ  ๋„ˆ๋ฌด๋‚˜๋„ ๋ฐ˜๊ฐ€์› ๋‹ค. ๋‚˜๋„ ์ด๋Ÿฐ ์ด์Šˆ๋ฅผ ๋™์ผํ•˜๊ฒŒ ๊ฒฝํ—˜ํ–ˆ๋˜ ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์„ ์ด์•ผ๊ธฐํ•ด๋ณด์ž๋ฉด, domain model ๊ณผ persistence entity model ์„ ๋ถ„๋ฆฌํ•˜์—ฌ RDB ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ACID ๊ฐ€ ์ง€์ผœ์ง€์ง€ ์•Š๋Š” ๊ฒƒ ์ด๋‹ค.

 

์ด์œ ์ธ ์ฆ‰, ์˜์†์„ฑ ์žฅ์น˜๊ฐ€ ACID ๋ฅผ ๋ณด์žฅํ•ด์ฃผ๋Š” ๋ฒ”์œ„๋Š” ์˜์†์„ฑ ์žฅ์น˜๊ฐ€ ์ธ์ •ํ•˜๋Š” ์˜์† ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์˜์†์„ฑ ์žฅ์น˜๊ฐ€ ์ธ์ •ํ•˜๋Š” ์˜์† ๋ชจ๋ธ์ด๋ž€ @Entity ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ JPA entity ๋ผ๋˜์ง€, @Table ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ชจ๋ธ์„ ์˜๋ฏธํ•œ๋‹ค.

 

์ด๋Ÿฐ ๊ฒฝ์šฐ ๋น„๊ด€์ /๋‚™๊ด€์  ์ž ๊ธˆ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๋Š”๋ฐ, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ธ€์“ด์ด๋Š” repository ๋กœ ๋„๋ฉ”์ธ ์„œ๋น„์Šค์˜ ๋กœ์ง์„ ์œ„์ž„์‹œ์ผฐ๋‹ค.

 

๋„๋ฉ”์ธ ๋กœ์ง์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•œ ๊ณ ๋ฏผ๊ณผ ๊ทธ ๊ณ ๋ฏผ ์‚ฌ์ด์— ์žˆ์—ˆ๋˜ ๊ธ€์“ด์ด์˜ ํ†ต์ฐฐ๋ ฅ์ด ๋ฌป์–ด๋‚˜์˜ค๋Š” ๊ธ€์ด์—ˆ์ง€๋งŒ ์กฐ๊ธˆ ์•„์‰ฌ์šด์ ์ด ์žˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด EventHandler ์˜ ๋„๋ฉ”์ธ ๋กœ์ง์ด repository ๋กœ ๋ฐ€์–ด์ ธ๋ฒ„๋ฆฌ๊ฒŒ๋œ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด JpaRepository ๋„ DomainRepository ๋ฅผ Compsite ํ•œ CampaignRepository ๊ฐ€ ๋„๋ฉ”์ธ ๋กœ์ง์„ ์•Œ๊ฒŒ๋˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋Š” Spring ์— ๊ด€๋ จ๋œ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋˜ํ•œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ๋˜๋ฉด ๊ณ„์†๋˜๋Š” ๋„๋ฉ”์ธ๋กœ์ง์— Repository ๋งŒ ์ปค์ ธ๊ฐˆ ๊ฒƒ์ด๋‹ค.

 

์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋ฉด ์ข‹์„๊นŒ? ๋Š” ๊ธ€์„ ์“ฐ๋Š” ์™€์ค‘์—๋„ ๊ณ„์† ๊ณ ๋ฏผ์ด๋˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

 

๋ช‡๊ฐ€์ง€ ๋“œ๋Š” ์ƒ๊ฐ์€, ๊ณผ์—ฐ EventHandler ๋Š” ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด์ผ๊นŒ? application layer ์ด์ง€ ์•Š์„๊นŒ?

 

๊ทธ๋ƒฅ version ์ •๋ณด๋ฅผ ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด์— ์นจํˆฌ์‹œ์ผœ๋ฒ„๋ฆฌ๋ฉด ์•ˆ๋˜๋Š”๊ฑธ๊นŒ? ๊ทธ๋ฆฌ๊ณค ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ์ ‘๊ทผ์ œ์–ด์ž๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ? (<- ์ด ๋ฐฉ๋ฒ•์€ ์ด์ „์— ๋‚ด๊ฐ€ ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ๋ฒ•์ด๋‹ค.)

 

๋Œ“๊ธ€