๐Ÿ’ป
Albert's Til
GitHub
  • ๋งค์ผ๋งค์ผ ์กฐ๊ธˆ์”ฉ ์„ฑ์žฅํ•˜๊ธฐ
    • README
    • CS
      • Network
      • HTTP
        • NO-CACHE
      • ์˜ค๋ฅ˜ ์ฝ”๋“œ
      • ORM ๋„๊ตฌ
      • Design Pattern
        • CQRS Pattern
          • Event Sourcing and CQRS pattern
        • Builder Pattern
    • DB
      • MySQL
        • Timeline
        • Pagination
        • Index
        • Database Performance Optimization Strategies
        • B+ tree
        • MySQL Connectors VS MySQL Shell(Scripting) VS MySQL Workbench
        • MySQL Storage Engine Architecture
      • Normalization & Denormalization
      • JPA
        • @Transactional
        • Why JPA?
        • About JPA
        • N+1 Issue
        • Index
        • ElementCollection&CollectionTable
        • orphanRemoval
        • CascadeType
        • Use Subselect
        • Dynamic Instance Creation
        • Paging
        • Order
        • Spefication
        • mappedBy
      • MongoDB
        • ObjectId
      • Why MySQL?
      • ACID properties of transactions
      • Between JPA and JDBC
      • Identifiers in Hibernate/JPA
    • Java
      • Jackson de/serialize
      • Collections.singletonList() vs List.of()
      • Manage dependencies in Gradle
      • Logging Level
      • Bean Validation
      • JVM Internals
        • Threads
          • Frame
        • Shared Between Threads
          • Classloader
            • Class Loader Hierarchy
            • Loading Linking Initialization
      • Java Collection Framework
      • Annotation
      • Generic
      • ๋””๋ฏธํ„ฐ ๋ฒ•์น™
    • Spring
      • Caching
      • Spring Integration Overview
        • ThreadPollTaskExecutor
        • Messaging Bridge
        • Channel Adapter
        • Poller
        • Configuration and @EnableIntegration
        • Message Endpoints
        • Message Channels
      • HATEOAS
      • @Autowired vs Constructor Dependency Injection
      • Spring Security
        • JWT ํ† ํฐ ์‚ฌ์šฉํ•œ ์ธ๊ฐ€
        • OAuth 2 Login
        • OAuth 2 ์ธ์ฆ
        • ์ธ๊ฐ€
        • ์ธ์ฆ
        • PasswordEncoder
      • IoC Container
      • Filter,Interceptor,AOP,Argument Resolver
      • Spring Annotation
      • About Spring
    • Kafka
      • Error Channel
    • Infra
      • Scale Up || Scale Out
      • Docker
        • Dockerfile
        • Docker Hub Deploy
        • Command
      • Cloud ์œ ํ˜•
        • Infrastructure as a Service
        • Platform as a Service
        • Software as a Service
      • ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ
        • ์—”์ง„์—‘์Šค(Nginx)
      • ์ฝ”๋“œ ์ž๋™ ๋ฐฐํฌ
        • Technical
      • AWS EC2
        • PEM(Privacy Enhanced Mail) ํ‚ค
      • AWS RDS
      • AWS S3
    • CodeSquad
      • Spring Boot Project 1์ฃผ์ฐจ ํšŒ๊ณ 
      • Spring Boot Project 2์ฃผ์ฐจ ํšŒ๊ณ 
      • Spirng Boot Project 3์ฃผ์ฐจ ํšŒ๊ณ 
      • Spring Boot Project 4์ฃผ์ฐจ ํšŒ๊ณ 
    • Foody Moody ํ”„๋กœ์ ํŠธ
      • Query Performance Comparison
      • HeartCount Asynchronous Issue
      • DeferredResult
      • ResponseBodyEmitter
      • SseEmitter (Spring)
      • Server-Sent Events (SSE)
      • ๊ธฐ์ˆ  ์Šคํƒ ์ ์šฉ ์ด์œ 
      • NO-CACHE(HTTP)
      • Transactional
    • DDD
      • AggregateId
    • Test
      • RestAssured
    • Coding and Algorithmic Problems
      • 819. Most Common Word
      • 344. Reverse String
      • 125. Valid Palindrome
      • 937. Reorder Data in Log Files
    • Node
      • Async... Await...
      • Custom Transactional Decorator Challenger
    • Python
      • Python Basic Grammar
        • Comments and Input/Output
        • Variable
        • Data type
        • Operations and syntax
        • List,Tuple,Dictionary,Set
        • Function
        • Conditional statement
        • Loop
    • HTML
      • HTML Basic
      • HTML Basic Tags
      • HTML Form Tags
      • HTML Table Tags
    • CSS
      • CSS Basic
      • CSS Practice
Powered by GitBook
On this page
  • ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๊ตฌํ˜„ ํ•ญ๋ชฉ:
  • ํ•ญ์ƒ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๊ณผ์ œ:
  • Event Sourcing pattern๊ณผ ๊ฒฐํ•ฉ๋œ CQRS๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ณ ๋ ค์‚ฌํ•ญ
  • ์“ฐ๊ธฐ ๋ชจ๋ธ์„ ๋ฉ”์ธํ”„๋ ˆ์ž„์— ์œ ์ง€
  • ์ผ๊ด€์„ฑ ๋ฌธ์ œ
  • CQRS ๋ฐ ๋ณ€๊ฒฝ ๋ฐ์ดํ„ฐ ์บก์ฒ˜
  • Reference

Was this helpful?

  1. ๋งค์ผ๋งค์ผ ์กฐ๊ธˆ์”ฉ ์„ฑ์žฅํ•˜๊ธฐ
  2. CS
  3. Design Pattern
  4. CQRS Pattern

Event Sourcing and CQRS pattern

Last updated 1 year ago

Was this helpful?

CQRS pattern์€ Event Sourcing pattern๊ณผ ํ•จ๊ป˜ ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. CQRS ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์€ ๋ณ„๋„์˜ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๊ฐ ๋ชจ๋ธ์€ ๊ด€๋ จ ์ž‘์—…์— ๋งž๊ฒŒ ์กฐ์ •๋˜๊ณ  ์ข…์ข… ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋œ ์ €์žฅ์†Œ์— ์žˆ์Šต๋‹ˆ๋‹ค. Event Sourcing ํŒจํ„ด๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์ด๋ฒคํŠธ ์ €์žฅ์†Œ๋Š” ์“ฐ๊ธฐ ๋ชจ๋ธ์ด๋ฉฐ ๊ณต์‹ ์ •๋ณด ์†Œ์Šค์ž…๋‹ˆ๋‹ค. CQRS ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์˜ ์ฝ๊ธฐ ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์ฒดํ™”๋œ ๋ณด๊ธฐ(์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ ๋„๋กœ ๋น„์ •๊ทœํ™”๋œ ๋ณด๊ธฐ)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณด๊ธฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ๋””์Šคํ”Œ๋ ˆ์ด ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์กฐ์ •๋˜์–ด ๋””์Šคํ”Œ๋ ˆ์ด ๋ฐ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ๋ชจ๋‘ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค

ํŠน์ • ์‹œ์ ์˜ ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ์“ฐ๊ธฐ ์ €์žฅ์†Œ๋กœ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์ผ ์ง‘๊ณ„์—์„œ ์—…๋ฐ์ดํŠธ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ์ตœ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๋Š” ์ฝ๊ธฐ ์ €์žฅ์†Œ๋ฅผ ์ฑ„์šฐ๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์ฒดํ™”๋œ ๋ณด๊ธฐ๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์ €์žฅ์†Œ๋Š” ๊ณต์‹์ ์ธ ์ •๋ณด ์†Œ์Šค์ด๋ฏ€๋กœ ์‹œ์Šคํ…œ์ด ๋ฐœ์ „ํ•˜๊ฑฐ๋‚˜ ์ฝ๊ธฐ ๋ชจ๋ธ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋•Œ ๊ตฌ์ฒดํ™”๋œ ๋ทฐ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋ชจ๋“  ๊ณผ๊ฑฐ ์ด๋ฒคํŠธ๋ฅผ ์žฌ์ƒํ•˜์—ฌ ํ˜„์žฌ ์ƒํƒœ์˜ ์ƒˆ๋กœ์šด ํ‘œํ˜„์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒดํ™”๋œ ๋ทฐ๋Š” ์‚ฌ์‹ค์ƒ ๋ฐ์ดํ„ฐ์˜ ๋‚ด๊ตฌ์„ฑ ์žˆ๋Š” ์ฝ๊ธฐ ์ „์šฉ ์บ์‹œ์ž…๋‹ˆ๋‹ค.

๋ช…๋ น ๋ฒ„์Šค์™€ ์ด๋ฒคํŠธ ๋ฒ„์Šค ๊ฐ„์˜ ์—ฐ๊ฒฐ์€ ๊ฒŒ์‹œ์— ์ ํ•ฉํ•œ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์˜ ์ ์šฉ์œผ๋กœ ์šฉ์ดํ•ด์ง‘๋‹ˆ๋‹ค . ์ด๋ฒคํŠธ ์†Œ์‹ฑ์€ ๋ฐ์ดํ„ฐ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ˜„์žฌ ์ƒํƒœ์— ๋„๋‹ฌํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธฐ๋ก๋„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ๋ฒ„์Šค์˜ ๊ฐ ๋ช…๋ น์— ๋Œ€ํ•ด ์“ฐ๊ธฐ ๋ชจ๋ธ์€ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•˜๋Š” ์—…๋ฐ์ดํŠธ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฒคํŠธ ๋ฒ„์Šค์— ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ๋ถ€๋ถ„์€ ๋ณ€๊ฒฝ ๋กœ๊ทธ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ–ฅํ›„ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ํ”„๋กœ์ ์…˜์„ ์ž‘์„ฑํ•˜๋Š” ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. "์“ฐ๊ธฐ" ๋ถ€๋ถ„์€ SQL์—์„œ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด ์ฝ๊ธฐ๋Š” ๊ฐ•๋ ฅํ•œ ์ธ๋ฑ์‹ฑ ๋ฐ ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋ฌธ์„œ ์ง€ํ–ฅ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ๋ถ„์‚ฐ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋™์ผํ•œ ์–ธ์–ด ์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. CQRS ๋ฐ ES๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์ธก์ด ์†Œ๊ธ‰ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ์ฟผ๋ฆฌ๋Š” ์ƒˆ ํ”„๋กœ์ ์…˜์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹œ์ž‘ ์‹œ๊ฐ„ ๋˜๋Š” ์ตœ๊ทผ ์ปค๋ฐ‹๋œ ์ƒํƒœ ๋ฐ ์Šค๋ƒ…์ƒท์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ฝ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ๋ชจ๋ธ์€ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 'Command' ๋ถ€๋ถ„์€ ID๋กœ ์ฃผ๋ฌธํ•˜๊ธฐ ๋˜๋Š” ์กฐ์ธ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์ฟผ๋ฆฌ์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ํ‚ค ๊ธฐ๋ฐ˜์˜ ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ๋ฅผ ์—ฌ์ „ํžˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฐฑ๋ณธ์€ pub/sub ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ฉฐ Kafka๋Š” ๊ตฌํ˜„ ๊ธฐ์ˆ ๋กœ ์ข‹์€ ํ›„๋ณด์ž…๋‹ˆ๋‹ค.

์ด ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Read model๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋Š” ์—ฌ๋Ÿฌ ์ฃผ์ œ์˜ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ์กฐ์ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ ํ”„๋กœ์ ์…˜์„ ๊ตฌ์ถ•ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์‹ ์„  ์‹ํ’ˆ ์ฃผ๋ฌธ ๋ฐฐ์†ก์—์„œ ์ฝœ๋“œ ์ฒด์ธ์ด ์ค€์ˆ˜๋˜์—ˆ๋Š”์ง€ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ์ฟผ๋ฆฌ๋Š” ์ด ์งˆ๋ฌธ์— ๋‹ตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ญํ•ด, ์ปจํ…Œ์ด๋„ˆ ๋ฉ”ํŠธ๋ฆญ ๋ฐ ์ฃผ๋ฌธ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. CQRS๊ฐ€ ๋น›๋‚˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

API ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ API ์ •์˜์™€ ๊ด€๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๊ตฌํ˜„ ํ•ญ๋ชฉ:

  • ์ผ๊ด€์„ฑ (๊ฐ ๋ฐ์ดํ„ฐ ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ ์ œ์•ฝ ์กฐ๊ฑด์ด ์ค€์ˆ˜๋˜๋Š”์ง€ ํ™•์ธ)

    • ์ด๋ฒคํŠธ ์†Œ์‹ฑ์ด ์—†๋Š” CQRS๋Š” ๋ฐ์ดํ„ฐ ๋ฐ ์ด๋ฒคํŠธ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋™์ผํ•œ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์†Œ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์“ฐ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฝ๊ธฐ ๋ชจ๋ธ์— ๋Œ€ํ•ด ์ผ๊ด€์„ฑ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ๋ชจ๋ธ์—์„œ ๊ฐ•๋ ฅํ•œ ์ผ๊ด€์„ฑ์€ ์‹œ์Šคํ…œ์˜ ํ˜„์žฌ ์ƒํƒœ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•˜๋ฏ€๋กœ ํŠธ๋žœ์žญ์…˜, ์ž ๊ธˆ ๋ฐ ์ƒค๋”ฉ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ธก๋ฉด์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ์—์„œ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์ผ๊ด€์„ฑ์ด ๋œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ž‘์—…์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž ๊ทธ๋Š” ๊ฒƒ์€ ์ ์ ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ํ™•์žฅ์„ฑ

    • ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋กœ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ๊ณ ๊ฐ€์šฉ์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ˆ˜์ค€์˜ ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ์‘๋‹ต ์‹œ๊ฐ„์„ ๋†’์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ ๋…๋ฆฝ ์‹คํ–‰ํ˜• ์ธ์Šคํ„ด์Šค(Kubernetes์˜ ํฌ๋“œ)๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„œ๋น„์Šค ๊ฐ„์— ์ฟผ๋ฆฌ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค/์„œ๋ฒ„๋ฆฌ์Šค๋กœ์„œ์˜ ๊ธฐ๋Šฅ์€ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ข‹์€ ๊ธฐ์ˆ  ์„ ํƒ์ž…๋‹ˆ๋‹ค.

  • ๊ฐ€์šฉ์„ฑ

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

ํ•ญ์ƒ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ๊ณผ์ œ:

  • ์ด๋ฒคํŠธ ๊ตฌ์กฐ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • ์ด๋ฒคํŠธ ์ €์žฅ์†Œ(ํžˆ์Šคํ† ๋ฆฌ)์— ๋ณด๊ด€ํ•  ๋ฐ์ดํ„ฐ์˜ ์–‘์€ ์–ผ๋งˆ์ž…๋‹ˆ๊นŒ?

  • ๊ถ๊ทน์ ์ธ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ์ดํ„ฐ ๋ณต์ œ๋ฅผ ์ฑ„ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Event Sourcing pattern๊ณผ ๊ฒฐํ•ฉ๋œ CQRS๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ณ ๋ ค์‚ฌํ•ญ

  • ์“ฐ๊ธฐ ๋ฐ ์ฝ๊ธฐ ์ €์žฅ์†Œ๊ฐ€ ๋ถ„๋ฆฌ๋œ ๋ชจ๋“  ์‹œ์Šคํ…œ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์‹œ์Šคํ…œ์€ eventually ์ผ๊ด€์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ๋˜๋Š” ์ด๋ฒคํŠธ์™€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ์‚ฌ์ด์— ์•ฝ๊ฐ„์˜ ์ง€์—ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํŒจํ„ด์€ ์ด๋ฒคํŠธ๋ฅผ ์‹œ์ž‘ ๋ฐ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ฟผ๋ฆฌ ๋˜๋Š” ์ฝ๊ธฐ ๋ชจ๋ธ์— ํ•„์š”ํ•œ ์ ์ ˆํ•œ ๋ทฐ ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์–ด์…ˆ๋ธ”ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žก์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Event Sourcing ํŒจํ„ด๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ CQRS ํŒจํ„ด์˜ ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด ์„ฑ๊ณต์ ์ธ ๊ตฌํ˜„์ด ๋” ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹œ์Šคํ…œ ์„ค๊ณ„์— ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒคํŠธ ์†Œ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋„๋ฉ”์ธ์„ ๋” ์‰ฝ๊ฒŒ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์˜๋„๊ฐ€ ๋ณด์กด๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๊ธฐ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ƒˆ ๋ณด๊ธฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

  • ํŠน์ • ์—”ํ„ฐํ‹ฐ ๋˜๋Š” ์—”ํ„ฐํ‹ฐ ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์žฌ์ƒํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ฝ๊ธฐ ๋ชจ๋ธ ๋˜๋Š” ํ”„๋กœ์ ์…˜์—์„œ ์‚ฌ์šฉํ•  ๊ตฌ์ฒดํ™”๋œ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์ƒ๋‹นํ•œ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„๊ณผ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ๋œ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ๊ฒ€์‚ฌํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์žฅ๊ธฐ๊ฐ„์— ๊ฑธ์ณ ๊ฐ’์„ ํ•ฉ์‚ฐํ•˜๊ฑฐ๋‚˜ ๋ถ„์„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํŠนํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋ฐœ์ƒํ•œ ํŠน์ • ์ž‘์—…์˜ ์ด ์ˆ˜ ๋˜๋Š” ์—”ํ„ฐํ‹ฐ์˜ ํ˜„์žฌ ์ƒํƒœ์™€ ๊ฐ™์€ ์˜ˆ์•ฝ๋œ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์Šค๋ƒ…์ƒท์„ ๊ตฌํ˜„ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์“ฐ๊ธฐ ๋ชจ๋ธ์„ ๋ฉ”์ธํ”„๋ ˆ์ž„์— ์œ ์ง€

์ผ๊ด€์„ฑ ๋ฌธ์ œ

๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋™๊ธฐํ™”ํ•˜๋Š” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์“ฐ๊ธฐ ๋ชจ๋ธ์€ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

  2. ์†Œ๋น„์ž๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

  3. ์†Œ๋น„์ž๋Š” ํŽ˜์ด๋กœ๋“œ ๋ฐ์ดํ„ฐ๋กœ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

  4. ์†Œ๋น„์ž๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜ ๋กœ๊ทธ์— ์ด๋ฒคํŠธ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  5. ๋กœ๊ทธ์˜ ๊ฐ ์˜ค๋ฅ˜๋ฅผ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ €์žฅ ์ž‘์—…์„ ์žฌ์ƒํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ฃผ๋ฌธ ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฃผ์ œ์—์„œ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ด€๋ฆฌ API๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ์žฌ์ƒํ•ฉ๋‹ˆ๋‹ค.

CQRS ๋ฐ ๋ณ€๊ฒฝ ๋ฐ์ดํ„ฐ ์บก์ฒ˜

์ด ์ด์ค‘ ์ž‘์—… ์ˆ˜์ค€์„ ์ง€์›ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ์—์„œ ๋ณ€๊ฒฝ ๋ฐ์ดํ„ฐ ์บก์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ด ๋กœ๊ทธ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค. IBM Infosphere CDC ์ œํ’ˆ์€ ์ด ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

CDC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” CQRS ๊ตฌํ˜„์€ ๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฃผ๋ชฉํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ์ ์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ ํŽ˜์ด๋กœ๋“œ์—์„œ ์œ ์—ฐํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Reference

Kafka๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ JDBC๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์–ด ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ํ…Œ์ด๋ธ”์„ ํด๋งํ•œ ๋‹ค์Œ Kafka์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ์—์„œ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ ์ถ”์ถœ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋ณ€๊ฒฝ ๋ฐ์ดํ„ฐ ์บก์ฒ˜ ์†”๋ฃจ์…˜, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฝ์ž…, ์—…๋ฐ์ดํŠธ ๋ฐ ์‚ญ์ œ ์ž‘์—…์— ์‘๋‹ตํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค . MySQL, Postgres, MongoDB ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ๋ฌธ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์“ฐ๊ณ  ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ ์ด๋ฒคํŠธ ํ…Œ์ด๋ธ”์— ์”๋‹ˆ๋‹ค( ). ๊ทธ๋Ÿฐ ๋‹ค์Œ ํด๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ด๋ฒคํŠธ ํ…Œ์ด๋ธ”์—์„œ Kafka๋กœ ๋ณด๋‚ผ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ด๋ฒคํŠธ๊ฐ€ ์ „์†ก๋˜๋ฉด ํ…Œ์ด๋ธ”์˜ ํ–‰์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

์ฃผ๋ฌธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค
Kafka Consumers
Kafka Connect๋Š”
Debezium์ด
"outbox pattern"
์ฝ”๋“œ ์ฐธ์กฐ
https://learn.microsoft.com/en-us/azure/architecture/patterns/cqrs
https://ibm-cloud-architecture.github.io/refarch-eda/patterns/cqrs/
https://martinfowler.com/bliki/CQRS.html
์ด๋ฒคํŠธ ์†Œ์‹ฑ ํŒจํ„ด
์“ฐ๊ธฐ ๋ชจ๋ธ์„ ์ง€์›ํ•˜๋Š” ํ•˜๋‚˜์™€ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์ธ ๋‘ ๊ฐœ์˜ ๊ฐœ๋ณ„ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค
์œ„์˜ ๊ทธ๋ฆผ์—์„œ ์“ฐ๊ธฐ ๋ชจ๋ธ์€ ๋ฉ”์ธํ”„๋ ˆ์ž„์—์„œ ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๊ณ  ๋ถ„์‚ฐ๋œ ์„ธ๊ณ„์— ๋Œ€ํ•œ ์‹ค์‹œ๊ฐ„ ๊ฐ€์‹œ์„ฑ์„ ์–ป๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์บก์ฒ˜ ํ‘ธ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฒคํŠธ ๋ฐฑ๋ณธ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค
์ด๋ฒคํŠธ ์†Œ์‹ฑ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹ ๋ขฐ์˜ ์†Œ์Šค๋Š” ใ…‡ใ…Ÿ ๋‹ค์ด์–ด๊ทธ๋žจ๊ณผ ๊ฐ™์ด ๋ฒ„์ „ ์ œ์–ด ์‹œ์Šคํ…œ ์—ญํ• ์„ ํ•˜๋Š” ์ด๋ฒคํŠธ ์†Œ์Šค์ž…๋‹ˆ๋‹ค.