πŸ‘¨‍πŸ’» kimtongting
article thumbnail

 

QUOTE THE DAY

“ μ—λŸ¬ μ—†λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“œλŠ” λ°λŠ” 두가지 방법이 μžˆλ‹€. 그런데 μ„Έλ²ˆμ§Έ κ²ƒλ§Œ μž‘λ™ν•œλ‹€. ”

- Alan J. Perlis (μ•¨λŸ° J. νŽ„λ¦¬μŠ€)
 

CQRS (Command Query Responsibility Segregation) 

* CQRS λž€?

πŸ“μ§μ—­ν•˜μžλ©΄ λͺ…λ Ήκ³Ό 쿼리의 역할을 κ΅¬λΆ„ν•œλ‹€λŠ” 것이닀. Create-Insert, Update, Delete 와 같이 데이터λ₯Ό λ³€κ²½ν•˜λŠ” 것과

Select-Read 와 같이 데이터λ₯Ό μ‘°νšŒν•˜λŠ” 것 두 κ°€μ§€μ˜ μ±…μž„μ„ λΆ„λ¦¬ν•œλ‹€λŠ” 것이닀.

 

 

* μ™œ μ‚¬μš©ν• κΉŒ?

μš°λ¦¬κ°€ μ‚¬μš©ν•˜λŠ”(ν˜Ήμ€ μ‚¬μš©ν–ˆλ˜) 전톡적인 CRUD 아킀텍쳐 κΈ°λ°˜μ—μ„œ μ‹œμŠ€ν…œμ„ μœ μ§€λ³΄μˆ˜ν•˜λ‹€ 보면, 좔가적인 μš”κ΅¬μ‚¬ν•­κ³Ό μ •μ±…μ˜ λ³€ν™”λ“€λ‘œ μžμ—°μŠ€λŸ½κ²Œ λ‘œμ§μƒμ˜ Domain Model λ³΅μž‘λ„κ°€ μ¦κ°€ν•˜κ²Œ λœλ‹€. μ‹œκ°„μ΄ 갈 수둝 μœ μ§€λ³΄μˆ˜ λΉ„μš©μ€ μ μ§„μ μœΌλ‘œ μ¦κ°€ν•˜κ²Œ 되며 ν•΄λ‹Ή μ‹œμŠ€ν…œμ€ 첫 κΈ°νšμ˜λ„μ™€λŠ” λ‹€λ₯Έ λ°©ν–₯으둜 λ³€μ§ˆλ˜λŠ” μΌ€μ΄μŠ€λ₯Ό μ’…μ’… λ³Ό 수 μžˆλ‹€. κ·Έλ ‡κ²Œ λͺ¨λ“  μš”κ΅¬μ‚¬ν•­μ„ μΆ©μ‘±ν•˜λ©° ν™•μž₯성을 κ³ λ €ν•œ Domain Model 을 λ§Œλ“œλŠ” 건 ꡉμž₯히 μ–΄λ €μš΄ 일이 λ˜μ–΄λ²„λ Έλ‹€.

 

κ·Έλž˜μ„œ 우리 κ°œλ°œμžλ“€μ€ κ³ λ―Όν•˜κΈ° μ‹œμž‘ν–ˆλ‹€.

무엇이 문제일까? μ™œ λ¬Έμ œκ°€ 될까?

 

κ·Έ μ‹œμž‘μ μ€ λͺ¨λΈμ— μžˆμ—ˆλ‹€.

μ‚¬μš©μž 쑰회, Admin, λŒ€μ‹œλ³΄λ“œ λ“± λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ€ Controller λΆ€ν„° λΆ„λ¦¬λ˜μ–΄ μžˆμ§€λ§Œ ν•˜λ‚˜μ˜ Model을 μ‚¬μš©ν•˜μ—¬ λͺ…λ Ήκ³Ό 쑰회λ₯Ό μˆ˜ν–‰ν•œλ‹€λŠ” 것을 ν™•μΈν–ˆλ‹€.

 

μ‚¬μš©μžκ°€ 개λͺ…을 ν•˜κ²Œλ˜μ–΄ μ΄λ¦„λ§Œμ„ λ°”κΎΈκ³  싢을 뿐인데 Model 자체λ₯Ό λ˜μ Έλ²„λ¦¬λŠ” κ²½μš°κ°€ λ§Žμ•˜κ³ , SumCount 와 같은 κ΄€λ¦¬μš© 데이터 등이 μ‹€μ œ μ‘°νšŒμ—μ„œλŠ” μ‚¬μš©λ˜μ§€ μ•ŠμœΌλ‚˜ μ„ μ–Έλ˜μ–΄ μžˆλŠ” κ²½μš°κ°€ λ§Žμ•˜λ‹€. (이런 내역을 λ‹€ μ•Œμ§€ λͺ»ν•˜λŠ” ν›„λŒ€ κ°œλ°œμžλ“€μ€ μŠ€νŒŒκ²Œν‹° μ½”λ“œκ°€ 된 ν”„λ‘œμ νŠΈλ₯Ό Legacy λͺ¨λ“œλ‘œ λ³€ν™˜μ‹œμΌœ μ°¨μ„ΈλŒ€ ν”„λ‘œμ νŠΈλ‘œ μž¬κ°œλ°œμ„ μ§„ν–‰ν•œλ‹€.)

 

μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λͺ…λ Ή 도메인과 쑰회 도메인을 λΆ„λ¦¬ν•˜κ²Œ λœλ‹€. 

*DDD(Domain-driven design) μ˜ μ‹œμž‘μœΌλ‘œ λ³Ό 수 μžˆμœΌλ‚˜, Bounded Context μ—μ„œλ§Œ μ‚¬μš©λ˜μ–΄μ•Ό ν•œλ‹€.

 

* μ–΄λ–»κ²Œ κ΅¬ν˜„ν• κΉŒ?

λ§ˆν‹΄ νŒŒμšΈλŸ¬λŠ” CQRSκ°€ μ•„λž˜μ™€ 같은 아킀텍쳐 νŒ¨ν„΄κ³Ό 방법둠을 νŒŒμƒν•˜κ±°λ‚˜ ν˜Ήμ€ ν•„μš”λ‘œ ν•œλ‹€κ³  ν–ˆλ‹€.

  • Event Sourcing
  • EagerReadDerivation
  • Domain Driven Design
  • Eventual Consistency

 

μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ κΈ°μ‘΄ λͺ¨λΈ μ•„ν‚€ν…μ²˜μ—μ„œ CQRS νŒ¨ν„΄μ΄ μ μš©λ˜λŠ” λͺ¨μŠ΅μ„ λ³Ό 수 μžˆλ‹€.

CQRS 적용의 λ§ˆμ§€λ§‰ λ‹¨κ³„μ—μ„œ RDBMS와 NoSQL κ΄€κ³„μ—μ„œλŠ” Kafka와 같은 λ©”μ‹œμ§€ 큐가 적용될 수 μžˆλ‹€.

여기에 Redis, Elasticsearch λ₯Ό 곁듀인닀면 μ„±λŠ₯λ©΄μ—μ„œλ„ ν›Œλ₯­ν•œ κ°œμ„ μ΄ 될 λ“― ν•˜λ‹€.

 

좜처: https://www.ibm.com/cloud/architecture/architectures/event-driven-cqrs-pattern/

마치며

CQRS νŒ¨ν„΄μ„ μ•Œκ²Œλœ ν›„, Toy Project μ—μ„œ κ΅¬ν˜„ν•œ κ²½ν—˜μ΄ μžˆλ‹€. 이 ν”„λ‘œμ νŠΈλŠ” 규λͺ¨κ°€ μž‘κ³  ν†΅ν•©ν…ŒμŠ€νŠΈμ˜ Cost κ°€ Production λ‹¨κ³„μ—μ„œμ˜ λ‹¨μœ„ν…ŒμŠ€νŠΈλ³΄λ‹€ μž‘κΈ°μ— μΌ€μ΄μŠ€κ°€ 적은 κ΄€κ³„λ‘œ μ•„μ‰½κ²Œλ„ λ‹Ήμž₯ ν™œμš©μ€ μ–΄λ €μšΈ 것 κ°™μ•˜λ‹€.

Legacy 와 μŠ€νŒŒκ²Œν‹° μ½”λ“œλ‘œ κ°€λ“ν•œ Production ν”„λ‘œμ νŠΈλ“€μ„ κ°œμ„ ν•˜λŠ” μž‘μ—… 진행쀑에 λ°œκ²¬ν•˜μ—¬ μŠ€ν„°λ””ν•œ CQRS νŒ¨ν„΄μ΄ ν›— λ‚  큰 도움이 되기λ₯Ό 바라며 천천히 μ°¨κ·Όμ°¨κ·Ό 진행해보아야겠닀.

λ°˜μ‘ν˜•
profile

πŸ‘¨‍πŸ’» kimtongting

@kimtongting μž…λ‹ˆλ‹€

ν¬μŠ€νŒ…μ΄ μ’‹μ•˜λ‹€λ©΄ "μ’‹μ•„μš”β€οΈ" λ˜λŠ” "κ΅¬λ…πŸ‘πŸ»" ν•΄μ£Όμ„Έμš”!