--- id: P-REINFORCE-WIKI-8CF68984 category: "10_Wiki/๐Ÿ’ก Topics/02_Architecture_Principles" confidence_score: 0.95 tags: ['event-sourcing', 'cqrs', 'event-driven-architecture', 'domain-driven-design-(ddd)', 'eventual-consistency', 'architecture-principles'] last_reinforced: 2026-05-02 --- # [[Event Sourcing]] ## ๐Ÿ“Œ Brief ์‹ Summary ์ด๋ฒคํŠธ ์†Œ์‹ฑ(Event Sourcing)์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ถˆ๋ณ€์˜ ์ด๋ฒคํŠธ ์‹œํ€€์Šค๋กœ ์บก์ฒ˜ํ•˜์—ฌ ์ถ”๊ฐ€ ์ „์šฉ ๋กœ๊ทธ(Append-only log)์— ์ €์žฅํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ž…๋‹ˆ๋‹ค [1]. ์‹œ์Šคํ…œ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ง์ ‘ ๋ฎ์–ด์“ฐ๋Š” ๋Œ€์‹  ์ด๋ฒคํŠธ ์ด๋ ฅ์„ ํ†ตํ•ด ๊ณผ๊ฑฐ ์–ด๋А ์‹œ์ ์˜ ์ƒํƒœ๋“  ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํŠน์ง•์ž…๋‹ˆ๋‹ค [2]. ์ฃผ๋กœ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ์™„๋ฒฝํ•œ ๊ฐ์‚ฌ ์ถ”์ (Audit trail), ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ํ•„์š”ํ•œ ์‹œ์Šคํ…œ์— ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค [1, 3]. ## ๐Ÿ“– Core Content * **์ž‘๋™ ์›๋ฆฌ ๋ฐ ์ƒํƒœ ์žฌ๊ตฌ์„ฑ (State Rebuilding):** ์ด๋ฒคํŠธ ์†Œ์‹ฑ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์›น ์„œ๋ฒ„, ํƒ€๊ฒŸ ์‹œ์Šคํ…œ์— ์—ฐ์†์ ์ธ ๋ฉ”์‹œ์ง€ ์ŠคํŠธ๋ฆผ์„ ๋ณด๋‚ด ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค [1]. ์‹œ์Šคํ…œ์˜ ๋ฐ์ดํ„ฐ ์ƒํƒœ๋ฅผ ๋ฎ์–ด์“ฐ๋ฉฐ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋Œ€์‹  ๋ฐœ์ƒํ•œ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•˜๋ฉฐ, ์ด ์ด๋ฒคํŠธ ๊ธฐ๋ก์„ ํ†ตํ•ด ๊ณผ๊ฑฐ์˜ ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์žฌ๊ตฌ์„ฑ(Recreate)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. * **๋””๋ฒ„๊น… ๋ฐ ์‹œ๊ฐ„์  ๋ถ„์„ (Temporal Analysis):** ๋ชจ๋“  ์ƒํƒœ ๋ณ€๊ฒฝ ์ด๋ ฅ์ด ๋ถˆ๋ณ€(Immutable) ์ƒํƒœ๋กœ ๋ณด์กด๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฒคํŠธ๋ฅผ ๋‹ค์‹œ ์žฌ์ƒ(Replay)ํ•จ์œผ๋กœ์จ ๋ฒ„๊ทธ๋ฅผ ์ •ํ™•ํžˆ ์žฌํ˜„ํ•˜๊ณ  ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋””๋ฒ„๊น… ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค [4]. ๋˜ํ•œ, "๊ณผ๊ฑฐ ํŠน์ • ๋‚ ์งœ์˜ ๊ณ„์ขŒ ์ž”์•ก ํ‘œ์‹œ"์™€ ๊ฐ™์€ ์‹œ๊ฐ„์  ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [3]. * **๋น„์ฆˆ๋‹ˆ์Šค ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ๊ฐ์‚ฌ(Audit) ์ ์šฉ:** ๊ธˆ์œต ํŠธ๋žœ์žญ์…˜์˜ ์ปดํ”Œ๋ผ์ด์–ธ์Šค์™€ ์ง€๋ถˆ ๊ฑฐ์ ˆ ์กฐ์‚ฌ, ํ—ฌ์Šค์ผ€์–ด, ์ฃผ๋ฌธ ์ด๋ ฅ์˜ ์ „์ฒด ์ถ”์ ์ด ํ•„์š”ํ•œ ์ด์ปค๋จธ์Šค ๋“ฑ ์—„๊ฒฉํ•œ ๊ฐ์‚ฌ ์ถ”์ ์ด ํ•„์ˆ˜์ ์ธ ์‹œ์Šคํ…œ์— ๋งค์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [3, 5, 6]. ๋กค๋ฐฑ์ด ํฌํ•จ๋œ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์—๋„ ์œ ๋ฆฌํ•˜๋ฉฐ, ๋Œ€ํ‘œ์ ์ธ ์‹ค์ œ ์‚ฌ๋ก€๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” Git์ด ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค [3, 5]. * **CQRS ํŒจํ„ด๊ณผ์˜ ๊ฐ•๋ ฅํ•œ ์‹œ๋„ˆ์ง€:** ์ด๋ฒคํŠธ ์†Œ์‹ฑ์€ ์ข…์ข… **CQRS(Command Query Responsibility Segregation)** ํŒจํ„ด๊ณผ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค [3]. ์ด ์กฐํ•ฉ์„ ํ†ตํ•ด ๊ฐ์‚ฌ ์ถ”์  ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๋™์‹œ์— ๋ฐ์ดํ„ฐ์˜ ์ฝ๊ธฐ(Read) ์ž‘์—…๊ณผ ์“ฐ๊ธฐ(Write) ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 7]. ## โš–๏ธ Trade-offs & Caveats * **๋Ÿฌ๋‹ ์ปค๋ธŒ ๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜:** ๊ธฐ์กด์˜ CRUD(Create, Read, Update, Delete) ์‚ฌ๊ณ ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ์‚ฌ๊ณ ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ ์ด ์š”๊ตฌ๋˜๋ฉฐ, **๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(Domain-Driven Design, DDD)** ์— ๋Œ€ํ•œ ์ „๋ฌธ ์ง€์‹์ด ๋ถ€์กฑํ•œ ํŒ€์—๊ฒŒ๋Š” ๋„์ž…์ด ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค [3, 4]. * **์ผ๊ด€์„ฑ ์ œ์•ฝ (Eventual Consistency):** ์‹œ์Šคํ…œ์ด ์ฆ‰๊ฐ์ ์ธ ์ผ๊ด€์„ฑ(Immediate consistency)๋ณด๋‹ค **๊ถ๊ทน์  ์ผ๊ด€์„ฑ(Eventual consistency)** ์— ์˜์กดํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ, ์ฆ‰๊ฐ์ ์ธ ๋ฐ์ดํ„ฐ ์ผ์น˜๊ฐ€ ํ•„์ˆ˜์ ์ธ ๋‹จ์ˆœ CRUD ์•ฑ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค [3]. * **๋ฒ„์ „ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ:** ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ด๋ฒคํŠธ์˜ ๊ตฌ์กฐ(Schema)๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ, ๊ฐ ๋ฒ„์ „๋“ค์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—…์ด ๋งค์šฐ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค [4]. * **์„ฑ๋Šฅ ๋ฐ ์Šคํ† ๋ฆฌ์ง€ ๋น„์šฉ ๋ฌธ์ œ:** ๋ˆ„์ ๋œ ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ์ด๋ฒคํŠธ๋กœ๋ถ€ํ„ฐ ์ƒํƒœ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ์ƒ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์–ด ์ƒํƒœ๋ฅผ ์š”์•ฝํ•˜๋Š” **์Šค๋ƒ…์ƒท(Snapshots)** ๊ธฐ๋Šฅ์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค [4]. ๋˜ํ•œ, ์ง€์†์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์ด๋ฒคํŠธ ๋กœ๊ทธ๋กœ ์ธํ•ด ์Šคํ† ๋ฆฌ์ง€ ์ €์žฅ ๋น„์šฉ์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค [4]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [์•„ํ‚คํ…์ฒ˜/ํŒจํ„ด ์กฐํ•ฉ] - [[CQRS]] - ์—ฐ๊ฒฐ ์ด์œ : ์ด๋ฒคํŠธ ์†Œ์‹ฑ ํŒจํ„ด๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ์“ฐ๊ธฐ ์ž‘์—…๊ณผ ์ฝ๊ธฐ ์ž‘์—…์˜ ๋ชจ๋ธ์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์ž…๋‹ˆ๋‹ค [3, 4]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ๊ณผ, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด ์ฃผ๋Š” ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋ธ์„ ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ณ  ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - [[Event-Driven Architecture]] - ์—ฐ๊ฒฐ ์ด์œ : ์ด๋ฒคํŠธ ์†Œ์‹ฑ์€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ์˜์†์„ฑ(Persistence) ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 7]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ƒ์„ฑ๋œ ๋ถˆ๋ณ€ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์Šคํ…œ ์ „๋ฐ˜์˜ ๋ธŒ๋กœ์ปค/์ฑ„๋„์„ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋กœ ๋น„๋™๊ธฐ ์ „ํŒŒ๋˜๋Š”์ง€ ํฐ ๊ทธ๋ฆผ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #### [์„ค๊ณ„ ์›์น™ ๋ฐ ๊ธฐ๋ฐ˜ ๊ฐœ๋…] - [[Domain-Driven Design (DDD)]] - ์—ฐ๊ฒฐ ์ด์œ : ์ด๋ฒคํŠธ ์†Œ์‹ฑ์„ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์‹๋ณ„ํ•ด์•ผ ํ•˜๋ฏ€๋กœ DDD ์ „๋ฌธ ์ง€์‹์ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค [3]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ, ์ƒํƒœ ๋ณ€๊ฒฝ์˜ ์ฃผ์ฒด์™€ ์ด๋ฒคํŠธ์˜ ๋‹จ์œ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•ด์•ผ ํ•˜๋Š”์ง€ ํ†ต์ฐฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. - [[Eventual Consistency]] - ์—ฐ๊ฒฐ ์ด์œ : ์ด๋ฒคํŠธ ์†Œ์‹ฑ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ๋™๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ  ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ƒํƒœ๋ฅผ ์ผ์น˜์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๊ฐœ๋…์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [3]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ์ผ๊ด€์„ฑ์„ ๊ฐ–๊ฒŒ ๋˜๋Š” ๊ณผ์ •๊ณผ ๊ทธ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์ผ์‹œ์ ์ธ ๋ฐ์ดํ„ฐ ์ง€์—ฐ(Lag) ํ˜„์ƒ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #### [๊ตฌํ˜„/ํ™œ์šฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜] - [[Append-only log]] - ์—ฐ๊ฒฐ ์ด์œ : ์ด๋ฒคํŠธ ์†Œ์‹ฑ์—์„œ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์ด๋ฒคํŠธ)์„ ์ €์žฅํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [1]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์™œ Update๋‚˜ Delete๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๊ณ  Insert๋งŒ ์ง€์†์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ฌผ๋ฆฌ์  ์ €์žฅ ์›๋ฆฌ๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - [[Snapshots]] - ์—ฐ๊ฒฐ ์ด์œ : ์—„์ฒญ๋‚œ ์–‘์˜ ์ด๋ฒคํŠธ ๋กœ๊ทธ๋กœ๋ถ€ํ„ฐ ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ ์žฌ๊ตฌ์„ฑํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์  ๋ณด์™„ ์žฅ์น˜์ž…๋‹ˆ๋‹ค [4]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ด๋ฒคํŠธ ์†Œ์‹ฑ์˜ ์„ฑ๋Šฅ ํ•œ๊ณ„๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ์ „๋žต๊ณผ, ํšจ์œจ์ ์ธ ์ƒํƒœ ๋ณต์› ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### Deeper Research Questions - ๊ธฐ์กด์˜ CRUD ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•˜์—ฌ, ์ด๋ฒคํŠธ ์†Œ์‹ฑ ์•„ํ‚คํ…์ฒ˜์—์„œ ์ด๋ฒคํŠธ ๊ตฌ์กฐ(Schema)๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - [[CQRS]]์™€ ์ด๋ฒคํŠธ ์†Œ์‹ฑ์„ ๊ฒฐํ•ฉํ•œ ํ™˜๊ฒฝ์—์„œ, ์ด๋ฒคํŠธ๊ฐ€ ์ฝ๊ธฐ ๋ชจ๋ธ(Read Model)๋กœ ๋ฐ˜์˜๋˜๊ธฐ๊นŒ์ง€ ๋ฐœ์ƒํ•˜๋Š” ๊ถ๊ทน์  ์ผ๊ด€์„ฑ(Eventual Consistency)์œผ๋กœ ์ธํ•œ ์ง€์—ฐ(Latency) ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ตœ์†Œํ™”ํ•  ๊ฒƒ์ธ๊ฐ€? - ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ์ด๋ฒคํŠธ ๋กœ๊ทธ๊ฐ€ ์Œ“์ธ ์ƒํ™ฉ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ [[Snapshots]]์˜ ์ƒ์„ฑ ์‹œ์ ๊ณผ ์ฃผ๊ธฐ ์ตœ์ ํ™” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? - ์ƒํƒœ๋ฅผ ๋กค๋ฐฑ(Rollback)ํ•˜๊ฑฐ๋‚˜ ์žฌํ˜„(Replay)ํ•  ๋•Œ, ๋ฉ”์ผ ๋ฐœ์†ก์ด๋‚˜ ์™ธ๋ถ€ ๊ฒฐ์ œ ๋“ฑ ์ด๋ฏธ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™๋˜์–ด ๋ฐœ์ƒํ•œ ๋ถ€์ž‘์šฉ(Side-effects)์„ ์–ด๋–ป๊ฒŒ ๋ฉฑ๋“ฑ์„ฑ(Idempotency) ์žˆ๊ฒŒ ํ†ต์ œํ•  ๊ฒƒ์ธ๊ฐ€? - [[Domain-Driven Design (DDD)]]์˜ ์–ด๋–ค ์›์น™๋“ค์ด ์ด๋ฒคํŠธ ์†Œ์‹ฑ์˜ ์„ฑ๊ณต์ ์ธ ์ด๋ฒคํŠธ ์‹๋ณ„๊ณผ ๋ชจ๋ธ๋ง์— ๊ฒฐ์ •์ ์œผ๋กœ ์ž‘์šฉํ•˜๋Š”๊ฐ€? ### Practical Application Contexts - **Implementation:** ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ (Update)ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œ(Delete)ํ•˜์ง€ ์•Š๊ณ , ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์ƒํƒœ ๋ณ€๊ฒฝ ํ–‰์œ„๋ฅผ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋กœ ์บก์Аํ™”ํ•˜์—ฌ [[Append-only log]] ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์— ์ง€์†์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. - **System Design:** [[CQRS]] ํŒจํ„ด๊ณผ ๊ฒฐํ•ฉํ•ด ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๋ฉฐ, ์ด๋ฒคํŠธ ๋กœ๊ทธ ์ €์žฅ์†Œ์™€ ์ฝ๊ธฐ ์ „์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฌผ๋ฆฌ์ /๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  [[Eventual Consistency]]๋ฅผ ๊ฐ๋‚ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋น„๋™๊ธฐ ๋ฉ”์‹œ์ง€ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. - **Operation / Maintenance:** ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ† ๋ฆฌ์ง€ ๋น„์šฉ์˜ ์ฆ๊ฐ€๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋ฉฐ, ์šด์˜ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ์‹œ์Šคํ…œ ์žฅ์• ๋‚˜ ๋ฒ„๊ทธ์— ๋Œ€ํ•ด ๊ณผ๊ฑฐ ์ด๋ฒคํŠธ๋ฅผ ์žฌํ˜„(Replay)ํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ๊ธฐ์ ์ธ [[Snapshots]] ์ƒ์„ฑ ์Šค์ผ€์ค„๋ง ์šด์˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. - **Learning Path:** ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ CRUD์— ์ต์ˆ™ํ•œ ๊ฐœ๋ฐœ์ž๋Š” ๋จผ์ € [[Domain-Driven Design (DDD)]]์„ ํ•™์Šตํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ํ–‰๋™ ์ž์ฒด๋ฅผ ์ด๋ฒคํŠธ๋กœ ๋„์ถœํ•˜๋Š” '์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‚ฌ๊ณ ๋ฐฉ์‹'์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ํ›ˆ๋ จ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. - **My Project Relevance:** ๊ธˆ์œต, ์˜๋ฃŒ, ์ด์ปค๋จธ์Šค์˜ ์ฃผ๋ฌธ ์ƒํƒœ ์ถ”์ ๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ์˜ ์ƒ์„ฑ ๋งฅ๋ฝ๊ณผ ์™„๋ฒฝํ•œ ๊ฐ์‚ฌ ์ถ”์ (Audit trails), ์‹œ์ ๋ณ„ ์ด๋ ฅ ๋ถ„์„์ด ๋ฒ•์ /๋น„์ฆˆ๋‹ˆ์Šค์ ์œผ๋กœ ํ•ต์‹ฌ์ธ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ตœ์ ์˜ ์ „๋žต์ด ๋ฉ๋‹ˆ๋‹ค. ### Adjacent Topics - [[Microservices Architecture]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์™€ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ด๋ฒคํŠธ ์†Œ์‹ฑ์„ ๊ฒฐํ•ฉํ•˜์—ฌ, ๊ฐ ์„œ๋น„์Šค๊ฐ€ ์ž์œจ์ ์œผ๋กœ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์— ๋ฐ˜์‘ํ•˜๊ฒŒ ํ•˜๋Š” ํŒจํ„ด ์„ค๊ณ„๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. - [[Stream Processing]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹จ์ˆœํžˆ ์ด๋ฒคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์ƒ์„ฑ๋˜๋Š” ์—ฐ์†์ ์ธ ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€ ์ŠคํŠธ๋ฆผ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ถ„์„, ํ•„ํ„ฐ๋ง ๋ฐ ๋ณ€ํ™˜ํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ(์˜ˆ: Kafka ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆฌ๋ฐ) ๊ธฐ์ˆ  ํ•™์Šต์œผ๋กœ ๋ฐœ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. --- *Last updated: 2026-05-02*