JiwonDev

์žก์†Œ๋ฆฌ3

by JiwonDev

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์ด ์ธํ”„๋ผ๋ฅผ ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ

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

์™œ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ? ๋‹ค๋ฅธ ๋ ˆ๋ฒจ(๊ณ ์ˆ˜์ค€, ์ €์ˆ˜์ค€)์ด ์„ž์—ฌ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์˜ํ™” ์˜ˆ๋งคํ•˜๊ธฐ (๊ณ ์ˆ˜์ค€)
  • JPA๋กœ ์˜์†์„ฑ ๊ฐ์ฒด ๋ณด๊ด€ํ•˜๊ธฐ (์ €์ˆ˜์ค€)
  • DB์— SQL ๋‚ ๋ฆฌ๊ธฐ(์ €์ €์ˆ˜์ค€)

์ €์ˆ˜์ค€์ด ๋ฐ”๋€Œ์—ˆ๋Š”๋ฐ ๊ณ ์ˆ˜์ค€์— ์˜ํ–ฅ์ด ๊ฐ„๋‹ค. ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค.

 

๐Ÿ’ญ ํ•ด๊ฒฐ์ฑ… DIP. ๊ณ ์ˆ˜์ค€์˜ ์ž…์žฅ์—์„œ ์ €์ˆ˜์ค€์„ ์ถ”์ƒํ™”ํ•˜๋ผ.

 

์ €์ˆ˜์ค€(JavaMailEmailNotifier)๋ฅผ ๊ณ ์ˆ˜์ค€(EmailNotifier)์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ถ”์ƒํ™”ํ•˜์˜€๋‹ค. ์˜์กด์„ ๋’ค์ง‘์—ˆ๋‹ค.
์‚ฌ์‹ค ์ €์ˆ˜์ค€์˜ ์กด์žฌ์œ ๋ฌด์™€ ์ƒ๊ด€์—†์ด ๋‹จ๋…์œผ๋กœ ๊ณ ์ˆ˜์ค€์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. DIP๋ฅผ ํ†ตํ•ด์„œ

๊ทธ๋Ÿฐ๋ฐ ์ถ”์ƒํ™”ํ•  ๋•Œ ๋งŽ์ด ์‹ค์ˆ˜ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค.

'์ถ”์ƒํ™”'๋ฅผ ํ•˜๋ผ๊ณ  ํ•˜๋‹ˆ ๋‹จ์ˆœํžˆ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์˜ฌ๋ฆฌ๊ณ , High-Class์˜ ์ด๋ฆ„์„ ๋ฝ‘์•„์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ

์‚ฌ์‹ค ์ด๋Š” ์ œ์ผ ์ฒ˜์Œ ๋ดค๋˜ ๊ตฌ์กฐ์™€ ๋‹ค๋ฅธ๊ฒŒ ์—†๋‹ค. ์ƒ์œ„ ๋ชจ๋“ˆ์ด ํ•˜์œ„ ๋ชจ๋“ˆ์„ ์˜์กดํ•˜๊ณ  ์žˆ์œผ๋‹ˆ๊นŒ

์ด๊ฑฐ๋ž‘ ๋‹ค๋ฅธ๊ฒŒ ๋ญ”๋ฐ?

์˜ฌ๋ฐ”๋ฅธ DIP๋Š” ๊ฐ์ฒด ๋ณธ์ธ ์ž…์žฅ์—์„œ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

'์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ'์ด ์•„๋‹ˆ๋ผ '๋‚˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์ €์žฅํ•œ๋‹ค'๊ฐ€ ์ถ”์ƒํ™”์ด๋‹ค.

'๋ฉ”์ผ ์„œ๋น„์Šค์— ์š”์ฒญ'์ด ์•„๋‹ˆ๋ผ '์•Œ๋ฆผ์„ ์ „์†กํ•œ๋‹ค'๊ฐ€ ์ถ”์ƒํ™”์ด๋‹ค.

๋„๋ฉ”์ธ์—๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ๋งŒ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์‘์šฉ(์„œ๋น„์Šค)๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์„ ์‹คํ–‰ํ•œ๋‹ค. ๋„๋ฉ”์ธ์€ ๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.

DIP๋ฅผ ์ž˜ํ•˜๋ ค๋ฉด ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ ์ž…์žฅ์—์„œ ์ถ”์ƒํ™”ํ•ด์•ผํ•œ๋‹ค.

 

๐Ÿ’ญ Aggregate(์ง‘ํ•ฉ), ์ฐธ์กฐ

๋งŽ์€ ๊ฐ์ฒด๋“ค์˜ ๊ด€๊ณ„. ์ˆฒ(๊ณ ์ˆ˜์ค€)์˜ ๊ด€๋ฆฌ๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฌ๊ฒŒ ๋œ๋‹ค.

๋‚˜๋ฌด(๊ฐ ๊ฐ์ฒด)๋“ค์—๊ฒŒ ์ดˆ์ ์ด ๋งž์ถฐ์ง€๊ฒŒ ๋œ๋‹ค.

๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๋™์‹œ์— ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ฐ๊ฐ์˜ ์ฑ…์ž„๊ณผ ์—ญํ• ์ด ๋‚˜๋ˆ„์–ด์ ธ์žˆ๋‹ค.

์ƒ์œ„์ˆ˜์ค€์—์„œ ๊ด€๋ จ๋œ ๊ฐ์ฒด๋ฅผ ๋ฌถ์–ด์„œ ํฐ ๊ทธ๋ฆผ์œผ๋กœ ๋ด์•ผํ•œ๋‹ค.

์ด๋Ÿฌ๋ผ๊ณ  ๋‚˜์˜จ ๊ฐœ๋…์ด Aggregate (n ์—๊ทธ๋ฆฌ๊ฒƒ, v ์—๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ), ํ•œ๊ธ€๋กœ ๊ตฐ์ง‘ํ™”

ํ•œ Aggregate์— ํ•˜๋‚˜์˜ Root๋ฅผ ๋‘๊ณ  ๊ด€๋ฆฌ๋ฅผํ•œ๋‹ค.

  • ๊ด€๋ จ๋œ ๊ฐ์ฒด๋“ค์˜ ๋ฌถ์Œ (์ง‘ํ•ฉ)
  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์‹œ ํ•œ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ๋จ
  • ๋น„์Šทํ•œ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ฐ–๋Š” ๊ฐ์ฒด๋“ค (์‚ญ์ œ ์‹œ ํ•จ๊ป˜ ์‚ญ์ œ๋จ)
  • ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์ง. ํ•œ ๊ฐ์ฒด๋Š” ํ•˜๋‚˜์˜ Aggregate๋ฅผ ๊ฐ€์ง
  • ํ•„์š”์„ฑ : ๋งŽ์€ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋“ค์„ ๊ฐ„๋‹จํ•˜๊ณ  ์ดํ•ด ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์œผ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ์Œ
  • ์—ฐ๊ด€์˜ ๊ฐœ์ˆ˜๋ฅผ ์ค„์—ฌ์„œ ๋ณต์žก๋„๋ฅผ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ
Order order = orderRepository.findById(orderId); // Aggregate ์™„์ „์ฒด๋ฅผ ๊ฐ€์ ธ์˜ด

// ์ž‘์—…์€ Aggregate์˜ Root๋กœ ๋ช…๋ น์„ ๋‚ด๋ฆผ.
// '์ถ”์ƒํ™”๋œ ๋น„์ฆˆ๋‹ˆ์Šค ์ž‘์—…'์„ ์š”์ฒญํ•จ. ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์€ ์ ์ง€ ์•Š์Œ
order.changeShippingInfo(newShippingInfo);
order.cancle();

 

์š”๊ตฌ์‚ฌํ•ญ์„ ์—ด์‹ฌํžˆ ์ณ๋‹ค๋ณด๋ฉด ์‰ฝ๊ฒŒ ์ชผ๊ฐค ์ˆ˜ ์žˆ๋Š” ๊ตฐ์ด ์žˆ์Œ.

ํ•˜์ง€๋งŒ ์• ๋งคํ•œ ๊ฒฝ์šฐ๋„ ๋งŽ์Œ. Moive, Showing, Discount ์–ด๋–ป๊ฒŒ ์ชผ๊ฐœ์•ผ ํ•˜๋Š”๊ฑธ๊นŒ?

ACG์˜ ๊ฒฝ๊ณ„๋Š” ๊ทœ์น™, ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„๋กœ ์ชผ๊ฐœ๋ฉด ๋จ.

๋‘ ๊ฐœ๊ฐ€ ๋”ฐ๋กœ ๋†€ ์ˆ˜ ์žˆ๋Š”๊ฐ€? = ๋‹ค๋ฅธ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฐ€? = ๋‹ค๋ฅธ ACG์ธ๊ฐ€?

์˜ˆ๋ฅผ ๋“ค์–ด 'ํ• ์ธ'์€ ์˜ํ™”์™€ ํ•จ๊ป˜ ๋™์ž‘ํ•จ

ํ˜ผ์ž์„œ ๋”ฐ๋กœ ๋†€ ์ˆ˜ ์—†์Œ = Movie Aggregate

 

ํ•˜์ง€๋งŒ ํ• ์ธ ์ •์ฑ…์ด ๋ณต์žกํ•ด์ง€๋ฉด? SRP (๋‹จ์ผ์ฑ…์ž„์›์น™)์„ ์ ์šฉํ•ด์•ผํ•จ. -> AGG ๊ฒฝ๊ณ„๊ฐ€ ๋‹ฌ๋ผ์ง

ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„(AGG ๊ฒฝ๊ณ„)๋Š” ์–ธ์ œ๋‚˜ ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ.

 

JPA๋ฅผ ์ฒ˜์Œ ์“ฐ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์ด ๋„ˆ๋ฌด ํŽธํ•จ

๊ทผ๋ฐ ์ด๋Š” ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ. '์˜ค์šฉ'

๋งˆ์น˜ ์ƒ์†์„ ๊ธฐ๋Šฅ ์žฌ์‚ฌ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ์˜์—ญ์˜ ๊ธฐ๋Šฅ์„ ์•„๋ฌด๋ ‡์ง€ ์•Š๊ฒŒ ๋ฐ”๊ฟˆ

์ƒ์˜๊ฐ์ฒด๊ฐ€ Discount๋ฅผ ๋ฐ”๊พธ๋Š”๊ฑด ๋งค์šฐ ์ด์ƒํ•œ ๋™์ž‘์ž„. ํ•˜์ง€๋งŒ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ์— Side-Effect ๋ฐœ์ƒ

+ DBA์™€์˜ ๊ฐˆ๋“ฑ. ๊ฐ์ฒด์—์„œ๋Š” ํŽธํ•˜์ง€๋งŒ SQL๋ฌธ์€ ๋ณต์žกํ•˜๊ฒŒ ๋‚˜๊ฐ. ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง

ํŠนํžˆ ์„ค๊ณ„ ์ดˆ์ฐฝ๊ธฐ์—๋Š” ์ด๋Ÿฐ๊ฒŒ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š์Œ. ํŽธ๋ฆฌํ•จ์— ์ต์ˆ™ํ•ด์ ธ ์ด์ƒํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ฆ.

์„œ๋กœ์˜ ์ฐธ์กฐ๊ฐ€ ๋ณต์žกํ•˜๋‹ค= ์ˆ˜์ •๊ณผ ํ™•์žฅ์ด ํž˜๋“ค๋‹ค = MSA(๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ์•„ํ‚คํ…์ณ)๋Š” ๊ฟˆ๋„ ๊พธ์ง€ ๋งˆ๋ผ

๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์€? AGG๊ฐ„์€ ID๋กœ๋งŒ ์ฐธ์กฐํ•ด๋ผ. ์กฐ๊ธˆ ๋ถˆํŽธํ•˜์ง€๋งŒ ์‘์ง‘๋„๋ฅผ ๋†’์ด๊ณ  ํ™•์žฅ์„ฑ์„ ์ฑ™๊ธธ ์ˆ˜ ์žˆ๋‹ค.

  • ์ฐธ์กฐ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค. (๋ชจ๋ธ๊ณผ ๊ตฌํ˜„์ด ๊น”๋”ํ•ด์ง„๋‹ค)
  • ์˜ค์šฉ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์‘์ง‘๋„๋ฅผ ๊ฐ•ํ™”ํ•œ๋‹ค.
  • AGG๋ณ„ ํ™•์žฅ์ด ์‰ฝ๋‹ค.
  • ์กฐํšŒ ์„ฑ๋Šฅ์ด ์ข‹์•„์ง„๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉํ•˜๊ธฐ ๋ถˆํŽธํ•ด์ง„๋‹ค. ๋” ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ์ƒ๊ธด๋‹ค.

Q/A : ์•„๋Š”๋ฐ.. ์•„๋Š”๋ฐ์š” DBA๊ฐ€ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด์„œ ํ…Œ์ด๋ธ”์„ 8๊ฐœ๋ฅผ ์กฐ์ธํ•ด์„œ ๊ฐ€์ ธ์˜ค๋ž˜์š”

โžก ๊ผญ ORM์ด ์žˆ์–ด์•ผ Aggregate๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์•„๋‹˜.

โžก ๊ตฌ์ฒด์ ์ธ ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ, ์ถ”์ƒํ™”๋œ ๋„๋ฉ”์ธ์„ ์ค‘์‹ฌ์œผ๋กœ Aggregate๋ฅผ ์ƒ๊ฐ.

โžก CQRS๋„ ๊ณ ๋ คํ•ด๋ณผ ๊ฒƒ

 

๐Ÿ’ญ DBA๋ฅผ ์†์ด๋Š” ๋ฐฉ๋ฒ• CQRS

๋ณต์žกํ•œ ๋„๋ฉ”์ธ์˜ ์กฐํšŒ ํŠน์ง• : ์—ฌ๋Ÿฌ AGG์— ๊ฑธ์ณ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•จ

๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•œ๋ฐฉ ์ฟผ๋ฆฌ์—, ํ•œ๋ฐฉ์— ์กฐํšŒํ•ด์•ผํ•จ (Left Join, DB ์ „์šฉ๊ธฐ๋Šฅ ํ•„์š”ํ•ด)

์ด๋ฅผ ํ•˜๋‚˜์˜ ๋ชจ๋ธ๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ•˜๋ฉด, ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์ง„์งœ ๋”๋Ÿฝ๊ฒŒ ๋ณต์žกํ•ด์ง

์ด๋Ÿด ๋•Œ๋Š” Lazy.. ์ด๊ฑฐ๋Š” ๋ชจ์•„์„œ Batch... ์ด๊ฑด Eager..์–ด..? N+1 ๋ฌธ์ œ๊ฐ€ ํ„ฐ์กŒ๋„ค?

 

๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ์ฑ… : CQRS

ํ•˜๋‚˜์˜ ๋ชจ๋ธ๋กœ ์ฒ˜๋ฆฌํ•˜๋˜ ๊ฒƒ์„ [์ƒํƒœ ๋ณ€๊ฒฝ ๋ชจ๋ธ]๊ณผ [์กฐํšŒ ๋ชจ๋ธ]์„ ๋ถ„๋ฆฌ

์ƒํƒœ๋ณ€๊ฒฝ๊ณผ ์กฐํšŒ๋ฅผ ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉ

์ƒํƒœ๋ณ€๊ฒฝ์€ JPA๋ฅผ ์จ์„œ ๊ฐ์ฒด์ ์œผ๋กœ ์‰ฝ๊ฒŒ ์งœ๊ณ  ์กฐํšŒ๋Š” MyBatis ๊ฐ™์€ ๊ฑธ๋กœ SQL์„ ์ง์ ‘ ์งœ๋ฉด ํ•ด๊ฒฐ

โžก ์ƒํƒœ ๋ณ€๊ฒฝ์€ ๋ณดํ†ต 1,2๊ฐœ์˜ ๊ฐœ์ฒด๋ฐ–์— ์•ˆ๊ฑด๋“œ๋ฆผ. (DBA์™€ ์‹œ๋น„ ๋ถ™์„์ผ x)

โžก ์กฐํšŒ๋Š” ์ •๋ง ์—ฌ๋Ÿฌํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•ด์•ผํ•จ (ํ•œ๋ฐฉ ์ฟผ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ๋‚˜๋ˆ ์„œ ์กฐํšŒํ•œ๋‹ค? DBA ์—ด๋ถˆ ์˜ค๋ฅด๊ธฐ ์‹œ์ž‘)

์—ฌ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐ€์„œ, ์กฐํšŒ ํŠธ๋ž˜ํ”ฝ์ด ์—„์ฒญ๋‚˜๋‹ค๋ฉด ์•„์˜ˆ DB๋ฅผ ์ชผ๊ฐœ์„œ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Œ

CQRS๋ฅผ ํ•˜๋ฉด ๋„๋ฉ”์ธ ์„ค๊ณ„๋ฅผ ํ•˜๋Š”๋ฐ '์กฐํšŒ ์„ฑ๋Šฅ'์„ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†์Œ.

์กฐํšŒ์ชฝ ๋ชจ๋ธ์€ ์บ์‹œ๋ฅผ ์ ์šฉํ•˜๊ณ , ์ฟผ๋ฆฌ๋ฅผ ๋œฏ์–ด๊ณ ์น˜๋ฉด ๋˜๋Š”๊ฑฐ๊ณ 

๋„๋ฉ”์ธ ๋ชจ๋ธ์€ ๊ทธ๋Œ€๋กœ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋จ. (์ƒํƒœ๋ณ€๊ฒฝ์€ SQL๋ฌธ์ด ๋ณต์žกํ•˜์ง€ ์•Š์Œ)

๋‹จ์  : ๊ท€์ฐฎ์Œ. ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๋ฌธ์ œ๋„ ์žˆ๊ณ , CQRS๋กœ ๋‚˜๋ˆ„๋ฉด์„œ ์‹œ์Šคํ…œ์ด ๋ณต์žกํ•ด์ง 

๊ฒฐ๊ตญ ์ด๊ฒƒ๋„ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„์ž„. ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ๊น”๋”ํ•˜๊ฒŒ ๊ฐ€์ ธ๊ฐ€๋Š”๋Œ€์‹ , ์‹œ์Šคํ…œ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ ์ธ๊ฐ€?

CQRS๋ฅผ ๋ฐฐ์šฐ๊ณ  ์ข‹์€ ์„ค๊ณ„์— ๋Œ€ํ•œ ํ•™์Šต์€ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ฒ ์ง€๋งŒ

ํ•œ๋ฒˆ ๋ฐฐ์›Œ๋†“์€๊ฑธ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง„ ์•Š์Œ. ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ๋” ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š”๊ฒŒ ์•„๋‹˜.

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ ๋„๋ฉ”์ธ์ด ๋ณต์žกํ•˜๊ณ  ๋ฏธ๋ž˜์— ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•  ๊ฒƒ์ด ๊ฑฑ์ •๋œ๋‹ค๋ฉด ๋ฏธ๋ฆฌ ์ž‘์—…ํ•ด๋†“์œผ๋ฉด ๋ถ„๋ช… ๋„์›€์ด ๋  ๊ฒƒ์ž„.

 

๐Ÿ’ญ ์ด๋ฒคํŠธ์™€ ํŠธ๋žœ์žญ์…˜

์˜ˆ๋งค๋ฅผ ์ทจ์†Œ๋ฅผ ํ•˜๋ฉด ํ™˜๋ถˆ์„ ํ•ด์ค˜์•ผํ•จ.

์ด๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ• ๊นŒ?

๊ทผ๋ฐ ์ž˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด '์™ธ๋ถ€ ์„œ๋น„์Šค'๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋งค์šฐ ๊นŒ๋‹ค๋กœ์›€

  • ํ™˜๋ถˆ์„ ์ฒ˜๋ฆฌํ•˜๋‹ค๊ฐ€ ์™ธ๋ถ€์„œ๋น„์Šค(ex ์ด๋ฉ”์ผ)์ด ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ์‹คํŒจ์ธ๊ฐ€?
  • ํ™˜๋ถˆ์„ ์ฒ˜๋ฆฌํ•˜๋‹ค๊ฐ€ ์™ธ๋ถ€์„œ๋น„์Šค๊ฐ€ ๋ธ”๋Ÿญํ‚น๋˜๋ฉด ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค. ์ด๋ฅผ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๋ฌถ์–ด์„œ ๊ธฐ๋‹ค๋ ค์•ผ ํ• ๊นŒ?
  • ์˜ˆ๋งค ์ทจ์†Œ์™€ ํ™˜๋ถˆ ๋กœ์ง์ด ํ•œ ์ฝ”๋“œ์•ˆ์— ์žˆ๋Š”๊ฒŒ ๋งž์„๊นŒ? SRP๋Š”?
  • ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋ฉด DI๋กœ ์ฃผ์ž…์„..? '๋ฌธ์ž๋กœ ํ™˜๋ถˆ ๋‚ด์—ญ์„ ๋ณด๋‚ธ๋‹ค' ๋ผ๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์— ํ™˜๋ถˆ ๋„๋ฉ”์ธ์„ ๋ณ€๊ฒฝํ•ด์•ผํ• ๊นŒ?

 

์ด๋ฒคํŠธ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

- ๊ณผ๊ฑฐ์— ๋ฒŒ์–ด์ง„ ์–ด๋–ค ๊ฒƒ. ์ฃผ๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ•จ

  • ์˜ํ™” ์ถ”๊ฐ€ํ•จ (NewMoviedCreated)
  • ์˜ˆ๋งคํ•จ (RevervationCreated)
  • ์˜ํ™” ์ƒ์˜ ์ผ์ • ์ถ”๊ฐ€ํ•จ(ShowingAdded)
  • ์˜ํ™” ์ •๋ณด ๋ณ€๊ฒฝํ•จ (MovieInfoChanged)
  • ์˜ํ™” ๊ฐ€๊ฒฉ ์ •์ฑ… ๋ณ€๊ฒฝํ•จ(PricePolicyUpdated)
  • ์˜ˆ๋งค ์ทจ์†Œํ•จ(ReservationCanceled)

์ด๋ฒคํŠธ๋งŒ ์žˆ์œผ๋ฉด ์•„๋ฌด๋Ÿฐ ๋™์ž‘์„ ํ•˜์ง€ ์•Š์Œ.

์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ฃผ์ฒด์™€ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•  ์ฃผ์ฒด๊ฐ€ ์žˆ์–ด์•ผํ•จ.

์ด๋ฒคํŠธ ๋””์ŠคํŒจ์ณ๋Š” ์ƒ์„ฑ๋œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  Handler์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• 

์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ. ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœ

 

๐Ÿ’ญ ๋„๋ฉ”์ธ๊ณผ ์ด๋ฒคํŠธ

๋„๋ฉ”์ธ์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์ด๋ฒคํŠธ๋กœ ํ‘œํ˜„

[~ํ• ๋•Œ, ~๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ๋งŒ์•ฝ ~ํ•˜๋ฉด] ๋“ฑ์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด, ์ด๋ฒคํŠธ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

์ƒํƒœ์˜ ๋ณ€๊ฒฝ์„ ์ด๋ฒคํŠธ๋กœ ๋ณ€๊ฒฝํ•˜๊ฒŒ๋˜๋ฉด, ์ฑ…์ž„์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ.

๋„๋ฉ”์ธ์—์„œ ์ทจ์†Œ๋กœ์ง์„ ๊ฐ€์ง€๊ณ , ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š”๊ฒŒ ์•„๋‹˜

๋„๋ฉ”์ธ์—์„œ๋Š” '์ทจ์†Œ ์ด๋ฒคํŠธ'๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋ฒคํŠธ ๋””์ŠคํŒจ์ณ์— ์ด๋ฒคํŠธ๋ฅผ ๋„˜๊ฒจ์„œ ๋ฐœ์ƒ์‹œํ‚ด

์˜ˆ๋งค๋Š” ๋”์ด์ƒ ํ™˜๋ถˆ๋กœ์ง์— ๋Œ€ํ•ด์„œ ์•Œ ํ•„์š”๊ฐ€ ์—†์Œ. SRP

๋˜ํ•œ ์ด๋ฒคํŠธ-๋””์ŠคํŒจ์ณ ๊ตฌ์กฐ๋Š” ์ด๋ฏธ ์•ˆ๋“œ๋กœ์ด๋“œ, UI์—์„œ ์ต์ˆ™ํ•œ ๊ตฌ์กฐ์ž„.

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ธฐ๋„ ์‰ฌ์›€ '๋„๋ฉ”์ธ์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ' OCP

๊ทผ๋ฐ์š”.. ์ด๋ฒคํŠธ๋กœํ•˜๋ฉด... ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š”๋ฐ ๋™๊ธฐํ™”๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?

์šฐ๋ฆฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์€ ํ•ญ์ƒ ์• ๋งคํ•œ ๋‹จ์–ด๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•จ.

'์ด๊ฑฐ ํ•˜์ž๋ง์ž, ์ด๊ฑธ ํ•ด์ฃผ์„ธ์š”' โžก ๊ณผ์—ฐ ์ด๊ฒŒ ์ฆ‰์‹œ์ผ๊นŒ? ์˜ˆ๋งค ์ทจ์†Œํ›„, ๋ฐ”๋กœ ํ™˜๊ธ‰์„ ํ•ด์•ผํ• ๊นŒ?

์ด๋ฉ”์ผ ๋ฐœ์†ก์„ ์ทจ์†Œํ•œ๋‹ค๊ณ  ํšŒ์›๊ฐ€์ž…์„ ๋ชปํ•  ์ด์œ ๊ฐ€ ์—†์Œ.

๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์ด, ์ฆ‰์‹œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜์ดˆ, ์ˆ˜๋ถ„๋’ค์— ํ•ด๊ฒฐ๋˜๋„ ๊ดœ์ฐฎ์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ

๊ทธ๋ž˜์„œ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ๋‹ค๋Š” ๊ฑฐ์ž„.

 

๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ.

  • ๊ณ ๋ฏผ์‚ฌํ•ญ : ์‹คํŒจํ•˜๋ฉด ์žฌ์ „์†ก์€ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๋กœ์ปฌ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ DB์— ์ €์žฅํ•˜๊ณ , ๋Œ€๋ฆฌ์ž(ํฌ์›Œ๋”)๊ฐ€ ์ผ์ •์ฃผ๊ธฐ๋กœ DB๋ฅผ ์ฝ์–ด์„œ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ์ด๋ฒคํŠธ ๋กœ์ง์ด ๋‹จ์ˆœํ•ด์ง. ๊ทธ๋Ÿฌ๋‚˜ ํฌ์›Œ๋”๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์ค˜์•ผํ•จ

 

3๋ฒˆ์งธ ๋ฐฉ๋ฒ•. ๋กœ์ปฌ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ DB์— ์ €์žฅํ•˜๋Š” ๊ฑด ๊ฐ™์€๋ฐ, ๊ทธ๊ฑธ ์ƒ๋Œ€๋ฐฉ์ด ์ฝ๋Š” ๊ฒƒ (pull)

์ด๋ฒคํŠธ๋ฅผ API ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•ด์„œ ๋‹ˆ๊ฐ€ ์ฝ์–ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ.

  • ๊ธฐ์กด์˜ ๋ฉ”์‹œ์ง€ํ(RebbitMQ) ๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ์ค˜์•ผํ•จ. ๊ด€๋ฆฌํ•ด์ค˜์•ผํ•จ.
  • ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์˜ ๋ฉ”์‹œ์ง€ํ(Kafka)๋Š” ํ•˜๋Š” ์ผ์ด ์—†์Œ. ๋งค์šฐ๋น ๋ฆ„. ๋‹ˆ๊ฐ€ ์•Œ์•„์„œ ๊ฐ€์ ธ๊ฐ€๋ผ ์ด๋งˆ๋ฆฌ์•ผ

๋‹ค๋งŒ ์ด๋ฒคํŠธ๋ฅผ ๋„์ž…ํ•  ๋•Œ๋Š” ์กฐ์‹ฌํ•ด์•ผํ•จ.

  • ์ด๋ฒคํŠธ ๋„์ฐฉ ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•จ
  • ์ด๋ฒคํŠธ ๋ฐœ์†ก ์‹คํŒจ์‹œ ์žฌ๋ฐœ์†ก์„ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€
  • ์ด๋ฒคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์žฌ์ฒ˜๋ฆฌ ํ•  ๊ฒƒ์ธ๊ฐ€. (*์žฌ๋ฐœ์†ก์‹œ ์ˆœ์„œ๊ฐ€ ๊ผฌ์ž„)
    ๊ทธ๋ž˜์„œ 2๋ฒˆ, 3๋ฒˆ์˜ ๋‹ˆ๊ฐ€ ์•Œ์•„์„œ ํ•ด~ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์†กํ•˜๋Š” ๊ฒƒ.

์ฐธ๊ณ ๋กœ ๊ตณ์ด RebbitMQ, Kafka๊ฐ™์€ ๊ฑธ ์“ธ ํ•„์š” ์—†์Œ. (ํŠนํžˆ ์‹ ์ž…์ด ์ž์ฃผ๊ทธ๋Ÿผ. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๊ฐ€ ์žˆ์–ด๋ณด์ด๋‹ˆ๊นŒ)

๊ธฐ์ˆ ์— ์ง‘์ฐฉํ•˜์ง€๋งˆ๋ผ ์Šคํ”„๋ง + DB๋งŒ ์žˆ์–ด๋„ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๊ฐœ๋ฐœ์ž๋Š” ๊ท ํ˜•๊ฐ์ด ์žˆ์–ด์•ผํ•œ๋‹ค. ๊ฒฐ๊ตญ ๋ชจ๋“  ๊ฒƒ์€ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„์ด๋‹ค. ์ ๋‹นํžˆ ํ•ด์•ผํ•œ๋‹ค.

  • DIP๋ฅผ ํ•œ๋‹ต์‹œ๊ณ  ๋ชจ๋“  ๊ณณ์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ•์ง€๋งˆ๋ผ. ์ธํ„ฐํŽ˜์ด์Šค๋„ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„์ด๋‹ค.
  • Aggregate๋ฅผ ์ง€ ๋ง˜๋Œ€๋กœ ์งœ์ง€๋งˆ๋ผ. ํ˜„์žฌ ์šฐ๋ฆฌ ์„œ๋น„์Šค์˜ ๊ตฌ์กฐ, DBA์™€ ์˜๋…ผํ•˜๊ณ  ์ฒœ์ฒœํžˆ ๋„์ž…ํ•˜๋ผ
  • CQRS, ์ด๋ฒคํŠธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€

๋‹ค๋งŒ ๋‚ด๊ฐ€ ์•„๋Š”๊ฒŒ ์—†๋‹ค๋ฉด? ์ผ๋‹จ ์งˆ๋Ÿฌ๋ณด์ž. ์š•๋จน์œผ๋ฉด์„œ ์–ด๊ฑฐ์ง€๋กœ ์‚ฌ์šฉํ•ด๋ณด์ž. ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์œผ๋ฉฐ ๊ท ํ˜•๊ฐ์„ ๋ฐฐ์›Œ๋‚˜๊ฐ€์ž.

 

 

์งˆ๋ฌธ

 

๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๋Š”๊ฑด ์–ด์ฐŒ๋ณด๋ฉด ์–์‚ฝํ•œ๊ฑฐ์ง€. ๋‹ˆ๊ฐ€ํ•ด!

๋‹ค๋งŒ DDD Actor์—์„œ ๋งํ•˜๋Š” ๋ฉ”์‹œ์ง€๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹์˜ ์—ฐ์‚ฐ์ฒ˜๋ฆฌ์™€ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๊ฐ actor๊ฐ€ ๋ฝ‘์•„๋‚ด๋Š” ์ด๋ฒคํŠธ

 

๊ณ ์ˆ˜์ค€์€ ์ €์ˆ˜์ค€์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค. DIP ์˜์กด์„ฑ์˜ ๋ฐฉํ–ฅ์„ ์—ญ์ „ํ•˜๊ฑฐ๋ผ

 

 

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ