[MSA] 7. MSA์ ํธ๋์ญ์ ์ด์ผ๊ธฐ 3 - ์ด๋ฒคํธ ์์ฑ๊ณผ CQRS
์ด๋ฒคํธ ์์ฑ์ ์ฒ์ ์ ํ๊ฒ ๋ ๊ฒ์ 2017 SpringCamp์์์์ต๋๋ค. ๋น์์๋ MSA๋ผ๋ ๊ฐ๋ ์ ๋ํด ์ ์์ง๋ ๋ชปํ๊ณ , MSA๋ ๋๊ธฐ์ ์์๋ ์ธ ์ ์๊ณ , ์ ์ฉ๊ฐ๋ฅํ ์์ฒญ๋๊ฒ ํฐ ์ํคํ ์ฒ์๋ค. ๋ผ๊ณ ๋ง ์ธ์ํ๊ณ ๋ฌด์์ ๋ฐฐ์ ์ ๋์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ, ์ต๊ทผ ์ ๊ฐ ๋ค๋๊ณ ์๋ ํ์ฌ์์ ์ด๋ฒคํธ ์์ฑ๊ณผ CQRS๋ผ๋ ์ฃผ์ ๋ก ์ด์ผ๊ธฐ๋ฅผ ํ์๋๋ฐ์. ๋ค์๊ธ CQRS๋ฅผ ๋ณด๋ ค๊ณ ํ๋, ๊ทธ ๊ฐ๋ ์ด ์ ๊ธฐ์ต๋์ง ์๊ณ , ์ด๋ค ํน์ง์ ๊ฐ์ง๊ณ ์์๋์ง๋ฅผ ํ์ ํ๊ธฐ๊ฐ ์ด๋ ค์์ ์ด๋ ๊ฒ ์ ๋ฆฌํ๊ฒ ๋์์ต๋๋ค.
๊ทธ๋ผ MSA์ ํธ๋์ญ์ ์ด์ผ๊ธฐ 3๋ฒ์งธ ์ด๋ฒคํธ ์์ฑ๊ณผ CQRS ์์ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ ํต์ ์ธ CRUD
๊ฐ๋์ ์ด๋ฐ ์๊ฐ์ด ๋ค ๋๊ฐ ์์ต๋๋ค. ์ ํต์ ์ธ CRUD๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๋ฐฑ์๋ ์์ง๋์ด๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ๋ ํธ๋์ญ์ ๋ก์ง์ ๋ํ ๊ณ ๋ฏผ์ ๋์ด์ฃผ๊ณ , ์ด ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์๋๊ฐ ์๊ฐํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ต๊ทผ MSA๋ฅผ ํ๋ฉด์ ๋๋ฉ์ธ ๋ณ๋ก ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ณ , ๊ทธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ํ ๋ถ๋ฆฌํ๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๊ณตํ๋ ํธ๋์ญ์ ์ ๊ทธ์ผ๋ง๋ก ๋ฌด์ฉ์ง๋ฌผ์ด ๋์์ต๋๋ค. ์๋ก ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ง ์๋ค๋ณด๋ ์ฐธ์กฐ๊ฐ ๋์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์๊ฐ ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ง๋ ํธ๋์ญ์ ์ด์ผ๊ธฐ 2ํธ์์ Two-Phase Commit์ด๋ผ๋ ๊ฑธ ์ด์ผ๊ธฐํ๊ธฐ๋ ํ์์ง์.
๊ทธ๋ฐ๋ฐ, ์ด๋ฌํ ๋ฐฉ๋ฒ์ด MSA์์ ์ด๋ค ๋ฌธ์ ๊ฐ ๋ ๊น์? ์ด๋ ๊ฒ ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์ ์๋ก ๊ด๊ณ๋ฅผ ๋งบ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ์ ๊ต์ฅํ ์ฌ์์ก์ต๋๋ค. ํ์ง๋ง ์๋น์ค๋ฅผ ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๋ MSA์ ๋ชฉ์ ์ ์๋ก์ ์์กด์ฑ์ ๊ฐ๋ฅํ ๋์จํ๊ฒ ๊ฒฐํฉํ๊ณ , ๊ทธ๋ ๊ฒ ํจ์ผ๋ก์จ ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ ํ๊ฐ ๋์ง ์๋๋ก ํ๋ ๊ฒ์ด ๋ชฉ์ ์ด์ง๋ง ์ ํต์ ์ธ CRUD๋ ๋์์ฑ์ ๊ฐํ๊ฒ ์๊ตฌํ๋ ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋์ ์ ๊ทผํ ๋ ๋ฐ์ํ๋ ๋์์ฑ ์ด์๋ฅผ ์คํ๋ ค ๋์ฑ ๊ฐ์ค์ํต๋๋ค.
์ ํต์ ์ธ CRUD์์ ๋ ํ ์ด๋ธ์ด ์์ ๋ A ํ ์ด๋ธ์ด B ํ ์ด๋ธ์ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ ๊ทธ ์ฐธ์กฐํ๋ ํ ์ด๋ธ์ด ์ ๊ฑฐ๋๊ฑฐ๋ ์ฐธ์กฐ๋๋ ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐ์ํ๊ณ , ๋ง์ฝ ๋ ์ธ์คํด์ค๊ฐ ๋จ์ด์ง๋ ๊ฒฝ์ฐ์๋ผ๋ ๋ ํ ์ด๋ธ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๊ด๊ณ์ฑ๋ฆฝ ๋์์ ๋ ๊ฒฐํฉ์ ๊ฐ๋ ฅํ๊ฒ ๋งค๊ฟ์ค๋ค๋ฉด ์๋น์ค๊ฐ ๋ถ๋ฆฌ๋์๋คํ๋๋ผ๋ ์ค๋ฅ ์ ํ์ ๋ํ ๋ฌธ์ ๋ ์ง์๋๋ ๊ฒ์ด์ฃ .
์ด๋ฒคํธ ์์ฑ
์ด๋ ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์ ์ ์ฌ์ฉํ ์๊ฐ ์๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ์ ๋ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์ ํน์ฑ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๊ทธ ์ค ๊ฐ์ฅ ๋ํ์ ์ธ ๊ฒ์ด ์์์ฑ์ธ๋ฐ์.
- ์์์ฑ
ํ๋์ ํธ๋์ญ์ ์ ๋ชจ๋ ์ฑ๊ณตํ์ ๋ ์ฑ๊ณต์ด๊ณ , ํ๋๋ผ๋ ์คํจํ๋ฉด ๊ทธ ํธ๋์ญ์ ์ ์ ์ฉ๋์ง ์์์ผ ํ๋ ์์น
์๋ฅผ ๋ค์ด๋ณด๋ฉด, ์ํ๊ด์์ ์ข์์ ์์ฝํ๋ ์์คํ ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ข์ ์์ฝ์ ์ํด ์ข์ ํ ์ด๋ธ์ด ํ์ํ๊ณ , ๊ฒฐ์ ๋ด์ญ์ ํ์ธํ๊ธฐ ์ํด์ ๊ฒฐ์ ํ ์ด๋ธ์ด ํ์ํฉ๋๋ค. ๋ ํ ์ด๋ธ์ ๊ด๊ณ๊ฐ ์ฑ๋ฆฝ ๋์ด ์๊ณ , ๊ณ ๊ฐ์ด ์ข์์ ์์ฝํ๋ค๋ฉด ์ข์ ํ ์ด๋ธ์ ํด๋น ๊ณ ๊ฐ์ ๋ฒํธ๊ฐ ์๊ณ , ๊ทธ ์ข์์ ์์ฝํ ๊ฒฐ์ ๋ด์ญ์ ๊ฒฐ์ ํ ์ด๋ธ์ ์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฐ๋ฐ, ์ข์ ์์ฝ์ ์ฑ๊ณตํ์ง๋ง ๊ฒฐ์ ๋ ์คํจํ๋ค๋ฉด? ์ด๋ฐ ๊ฒฝ์ฐ ์ด ์ข์์ ์์ฝ์ ์ฑ๋ฆฝ๋์ง ์์์ผ ํฉ๋๋ค. ์ด๋ฌํ ํน์ฑ์ ์ฐ๋ฆฌ๋ ์์์ฑ์ด๋ผ๊ณ ์ด์ผ๊ธฐ ํฉ๋๋ค.
์ด๋ฌํ ์ผ๋ จ์ ํธ๋์ญ์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํด์๋ ๊ฐ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ์ ์ฅํด์ผ ํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ํ ๋ฉด A ๊ณ ๊ฐ์ด ์ข์์ ์์ฝํจ -> A ๊ณ ๊ฐ์ด ํด๋น ์ข์์ ๋ํด ๊ฒฐ์ ๋ฅผ ์งํํจ. ์ฒ๋ผ ์ผ๋ จ์ ์ด๋ฒคํธ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ํจํด์ ์ฐ๋ฆฌ๋ ์ด๋ฒคํธ ์์ฑ์ด๋ผ๊ณ ํฉ๋๋ค.
๊ฐ๋จํ๊ฒ ์ํ๊ด์ ์ข์์ ์์ฝํ๋ ์์คํ ์ ๋ง๋ ๋ค๊ณ ๋ณธ๋ค๋ฉด ์ ํต์ ์ธ CRUD๋ฅผ ์๊ฐํ์ ๋ ์ฐ๋ฆฌ๋ ๊ฐ๋จํ ์ด ์ฌ๋์ด ์ด๋ค ์ข์์ ์์ฝํ๊ณ , ์ด๋ ์๊ฐ ๋์ ์ด๋ ์ํ๋ฅผ ์์ํ๋์ง ์ ๋๋ง ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ, MSA์์๋ ์ด๋ฌํ ํธ๋์ญ์ ์ ์ด๋ฒคํธ๋ณ๋ก ์ผ๊ด ์ ์ฅํจ์ผ๋ก์จ ์ผ๋ถ ํธ๋์ญ์ ์์ Fail์ด ๋ฐ์ํ์ ๋ ์ด๋ฅผ ์์ฐจ์ ์ผ๋ก ๋กค๋ฐฑํ ์ ์๊ฒ ํจ์ผ๋ก์จ ์์์ฑ์ ํ๋ณดํ ์๊ฐ ์์ต๋๋ค. ๊ธฐ์กด์ ์ ํต์ ์ธ CRUD์์๋ ์ด๋ป๊ฒ ์ ํํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ ๊ฒ ๋ชฉํ์๋ค๋ฉด ์ง๊ธ์ ๋ก์ฐ ๋ฐ์ดํฐ๋ฅผ ์ค๊ณํ๊ณ ์ฐจํ ์ ํํ๋ฅผ ํ๋ค๋ ๊ฒ๊น์ง๋ฅผ ๊ณ ๋ คํด์ผํ๋ ์์ฒญ ํฐ ๋น์ฉ์ด ๋๋ ์์ ์ด๋ผ๊ณ ๋ณด๋ค์.
๊ทธ๋ ๋ค๋ฉด ์ด ์ด๋ฒคํธ๋ค์ ์ด๋์ ์ ์ฅ์ ํด์ผํ ๊น์? ๊ทธ๋ฆฌ๊ณ ์ด ์ด๋ฒคํธ๋ฅผ ์ด๋ค ํํ๋ก ์ ์ฅํด์ผ ํ ๊น์? ๊ฐ ์๋น์ค๋ง๋ค ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ๋ณด๊ดํ๋ค๋ฉด ์ด๊ฑธ ์์ธํ ๋ ๋ถํ๊ฐ ์์ฒญ ํฌ์ง ์์๊น์?
๋ค์ํ ์๋ฌธ์ ๋ค์ด ์์ต๋๋ค. ์ด๋ฒคํธ๋ฅผ ๋ณด๊ดํ์ฌ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ค๊ณ ํ์ง๋ง ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ๋ณด๊ดํ๋ค๋ฉด ์ผ๋จ ๋ ๊ฐ์ง ๋ฌธ์ ์ ์ด ์๊น๋๋ค.
- ๊ฐ ์ด๋ฒคํธ ๋ณ๋ก ID๊ฐ ์ฃผ์ด์งํ ๋ฐ, ์ด๋ฒคํธ๊ฐ ๋ฌด์ํ๊ฒ ์์ด๋ฉด ์ถฉ๋์ด ์ผ์ด๋ ์ ์๋ค. ID ์ฒ๋ฆฌ๋ ์ด๋ป๊ฒ ํ๋ ๊ฒ์ด ์ข์๊ฐ?
- ์ผ๋ถ ํน์ํ ์ด๋ฒคํธ๋ฅผ ์กฐํํ์ฌ ๋ณต๊ทํ๊ฑฐ๋ ํธ๋์ญ์ ์ ๋ฐ์ํ๋ ๋ฑ์ ์งํํ ํ ๋ฐ, ๋ฐ์ดํฐ๊ฐ ๋๋์ผ๋ก ์์ด๋ฉด ์์ธ์ด ๋๋ ค์ง ๊ฒ์ด๋ค. ์ด์ ๋ํ ์ ๋ต์ด ์๋๊ฐ?
- 2๋ฒ์ ์ด์ฉํ์ฌ ๊ณผ๊ฑฐ์ ์ด๋ฒคํธ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ์ด๋ ํ ๊ฒ์ด ์์๊น?
Event Store
๋จผ์ ์ด๋ฒคํธ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์๋ ์๋์ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- ์ด๋ฒคํธ ์ ์ฅ์ ํนํ๋ ๋ฐ์ดํฐ ์ ์ฅ์ ์ฌ์ฉ (e.g. eventstore.org)
- NoSQL ์ฌ์ฉ (MongoDB, Redis)
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ (MySQL, PostgreSQL)
์ด๋ฒคํธ์ ๊ตฌ์กฐ๋ ๋จ์ํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ๋ณํ๋๋ ๋ด์ฉ (payload)์ ํด๋น ์ด๋ฒคํธ ํ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๊ณ , ๊ทธ ํ์๋ ์๋น์ค์ ๋ฐ๋ผ ์ฌ๋ฌ๋ถ๋ค์ด ์์ ๋กญ๊ฒ ๊ฒฐ์ ํ์ค ์ ์์ต๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ ๋ NoSQL์ ์ถ์ฒํ์ง๋ง PostgreSQL๊ณผ ๊ฐ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ JSONB์ ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ ์ด์ฉํ๋ ๊ฒ๋ ๊ด์ฐฎ์ ์ ํ์ด๋ผ๊ณ ๋ด ๋๋ค.
Snapshot
๋ง์ฝ ์ด๋ฒคํธ๊ฐ ๋ฌด์ํ ๋ง์์ง๋ฉด ์ด๋จ๊น์? ์ด๋ฒคํธ๊ฐ ์์ฌ์ ์ ์ฒ๋ง๊ฐ, ์ต๊ฐ ์ด๋ ๊ฒ ์ ์ฅ์ด ๋๋ค๋ฉด ํ์ ์๊ฐ์ด ์์ฒญ ๋๋ ค์ง๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ฐ์ด ๊ทธ๋งํผ ๊ธธ์ด์ง๊ณ , ๋๊ธฐํ๊ฐ ๋๋ ค์ง๊ฒ ๋๋๋ฐ์. ์ด ๋ ์ฐ๋ ์ ๋ต์ด ๋ฐ๋ก ์ค๋ ์ท์ ๋๋ค.
์ค๋ ์ท์ ์๋ง์ ์ด๋ฒคํธ ์ค์์ ํน์ ์ด๋ฒคํธ ๊ตฌ๊ฐ์ ๋ณ๋๋ก ์ ์ฅํ๊ณ , ์กฐํํ ๋ ๊ทธ ๊ตฌ๊ฐ์ ๋ฐ์ดํฐ๋ง์ ์กฐํํด์ ์กฐํ ์๊ฐ์ ๋น ๋ฅด๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฒ์ ๋๋ค. ๋ง์ฝ Event Store ์ ์ฉ ์ ์ฅ์๋ผ๋ฉด ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ง์ํด์ฃผ๊ฒ ์ง๋ง NoSQL, ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ด ์ด๋ฒคํธ ํนํ๋ ์ ์ฅ์๊ฐ ์๋ ๊ฑธ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ฌํ ์์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ต๋๋ค.
CQRS
์ด๋ฌํ ์ด๋ฒคํธ ์์ฑ์๋ CQRS๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. CQRS๋ ๋ช ๋ น๊ณผ ์กฐํ ์ฑ ์์ ๋ถ๋ฆฌํ๋ ํจํด์ผ๋ก Command and Query Reponsibility Segregation์ ์ฝ์์ ๋๋ค.
๋ช ๋ น๊ณผ ์กฐํ์ ์ฑ ์์ ๋ถ๋ฆฌํ๋ค? ๋ฌด์จ ์ด์ผ๊ธฐ์ผ๊น์. ๊ฐ๋จํ๊ฒ ์๊ธฐํ๋ฉด CRUD์์ ์กฐํ๋ R(Read)๋ฅผ ๋งํฉ๋๋ค. ๋๋จธ์ง๋ ์ ์ฅ๊ณผ ๊ด๋ จ์ด ์์ง์. ๋ณดํต์ CRUD๋ ๋ช ๋ น๊ณผ ์กฐํ๋ฅผ ๊ฐ์ด ํ์ง๋ง, CQRS๋ ์์ฑ, ์ญ์ , ์์ ๊ณผ ์กฐํ(Read)๋ฅผ ๋ถ๋ฆฌํด์ ํ๋๋ก ํ๋ ๊ฑธ ๋งํฉ๋๋ค.
์ ๊ทธ๋ฆผ์ ๋ณด์๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์กฐํ์ ์์ฑ/์์ ์ ์ํด ๋ณ๊ฐ์ API๋ฅผ ๋ถ๋ฅด๊ณ ์์์ ๋ณผ ์ ์์ต๋๋ค. Event Store์์๋ ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋กํ๊ณ , ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋กํ ๋ค์๋ Event Broker ๋ฑ์ ํตํด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ View Store๋ก ์ ์ฅํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์กฐํํ ์ ์๋๋ก ํ๋ ํํ์ ๋๋ค.
๊ทธ๋ฐ๋ฐ, CQRS๋ฅผ ์ฌ์ฉํด์ผ ํ ์ด์ ๊ฐ ์์๊น์? Event Store์์ ์ด๋ฏธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ํ์ฉํ๊ณ ์๋๋ฐ, Event Store์์ ํ์ ์ ์ ํด์ฃผ๊ณ , ๊ทธ์ ๋ง๋ ์ปฌ๋ผ๊ณผ ํจ๊ป Payload๋ง ๋ถ๋ฅผ ์ ์๋ค๋ฉด ๊ทธ๊ฑธ๋ก ์กฑํ์ง ์์๊น์?
Event Store์์ ๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ํด๋นํ๋ ๋ชจ๋ ๋ก์ฐ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๊ณ , ์ฌ๊ธฐ์๋ ๋ฌผ๋ก ์กฐํ๋ ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๋ฌด์ํ ์์ด๊ธฐ ์์ํ๋ฉด ๋ฐ์ดํฐ์ ์กฐํ๋ ๊ทธ๋งํผ ๋๋ ์ด๊ฐ ๊ฑธ๋ฆฌ๊ณ , ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ํ์ํด์ ํด๋น API์ ๋ง๋ ์ด๋ฒคํธ ํ์ ์ ๋ ๊ฒ์ํด์ผํ๋๋ฐ, ์ด๋ ๊ฒ ๋๋ฉด ์๊ฐ์ด ์์ฒญ ๊ธธ์ด์ง๋๋ค.
์ด๋ด ๋๋ ํด๋น ๋น์ฆ๋์ค ๋ก์ง์ ํด๋นํ๋ ํ ์ด๋ธ์์ ๋ฐ๋ก ์กฐํํ๋ ๊ฒ์ด ํ๋ช ํฉ๋๋ค. ๋ฐ๋ผ์ ๋น์ฆ๋์ค ๋ ๋ฒจ์์ ๊ณ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ ๋ณผ ๋๋ ๊ทธ ๊ฒฐ๊ณผ๋ง์ ๋ฐ๋ผ๋ณด ๋, ์์คํ ์ ์ด์ํ๋ ์ ์ฅ์์๋ ๊ทธ ๊ณผ์ ์ ๋ณด๋ ๊ฒ์ด ์ค์ํ๋ฐ, ์ด๋ค ๋์ ๋ชจ๋ ๋ง์กฑํ๊ธฐ ์ํด์ ์ด๋ฌํ ํจํด์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง ๋งค์ฐ ๊ธด ๊ฐ๋ ์ MSA ํธ๋์ญ์ ์ด์ผ๊ธฐ๋ฅผ ์ข ๋ ์ด์ด๋๊ฐ ๋ดค์ต๋๋ค. ์ธ๋ฏ๋ณด๋ฉด Saga ํจํด๊ณผ ์ ์ฌํ์ง๋ง ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์์๋ ์ ์ฌํ๊ณ , ์ฌ๊ธฐ์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ถ๊ฐํ ๊ฒ์ด ์ด๋ฒคํธ ์์ฑ, ์ด๊ฑธ ๋ํด์ ์ฝ๊ธฐ์ ์ข ๋ ์ต์ ํ ๋ ๊ฐ๋ ์ ๋ถ์ธ ๊ฒ์ด CQRS๋ ๋ผ๊ณ ๋ณด์ ๋ค๋ฉด ์ดํดํ๋ ๋ฐ ๋์์ด ๋ ์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค์.
๋ง๋ถ์ฌ์ ์ค๋ ์ท์ ํตํ ์ฒ๋ฆฌ๋ฅผ ์ข ๋ ๋ณด์ถฉํด์ ์ค๋ช ๋๋ฆฌ์๋ฉด, 1๋ง ๊ฐ์ ์ด๋ฒคํธ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ณณ์์๋ 1000๋ฒ ID์ ํด๋นํ๋ ์ด๋ฒคํธ๋ฅผ ์กฐํํ๊ณ ์ ํ ๋, 900๋ฒ์งธ ๋ฐ์ดํฐ ๊ฐ๋ถํฐ ์ค๋ ์ท์ผ๋ก ์ ์ฅํ๋ค๊ณ ํ๋ค๋ฉด 900๋ฒ๋ถํฐ ์์ธ ๋ฐ์ดํฐ๋ง์ ์กฐํํ๋ฉด ์ฝ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
๋์ผ๋ก CQRS์ ๋ํ ์ด์ผ๊ธฐ์ ๋๋ค๋ง Event Sourcing ํจํด์ Write์ ์ง์ค๋ ์ ๋ต์ด์์ต๋๋ค. ํ์ง๋ง ์ด๋ฅผ ๋ค์ ๋ถ๋ฌ์ค๊ธฐ ์ํด์๋ ์๋ง์ ์ ์ฐจ๊ฐ ํ์ํ๋ฉฐ ๊ทธ๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ REST API ์๋น์ค์ ์์ด ์๊ฐ์ ์ธ ์๋ชจ๊ฐ ๋งค์ฐ ํฌ๋ฆฌํฐ์ปฌํ๊ฒ ์์ฉ๋๊ฒ ๋ฉ๋๋ค. ๋ฌผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ ๊ณณ์์๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๊ฐ์ํด์ผ ํ ํ์๊ฐ ์๊ฒ ์ง๋ง ๋น์ฆ๋์ค ๋ก์ง์ด ๋ฐฉ๋ํ๊ณ ํฐ ์๋น์ค๋ผ๋ฉด ์ด์ผ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋๋ค.
๋ฐ๋ผ์ Event Sourcing์ ์ํด CQRS๋ ํ์๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค. ๋ค๋ง ๋ฐ๋๋ก CQRS๋ฅผ ์ํด ์ด๋ฒคํธ ์์ฑ์ ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค. ์ฃผ์ฒด๋ฅผ ์ฐ๊ธฐ์ ์ฝ๊ธฐ๋ก ๊ตฌ๋ถ์ง์ด์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ทธ๋ด ์ ์๊ฒ ์ง๋ง ๊ทธ๊ฒ์ ๋ฐ๋์ ์ด๋ฒคํธ๋ก ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ํ์๊ฐ ์๋๋ฉฐ. ์ด๋ ์ํํธ์จ์ด ์์ง๋์ด๋ฅผ ํ๊ณ ๊ณ์ ์ฌ๋ฌ๋ถ๋ค์ ์ฌ๋์ ๋๋ค.
๋ค์ ํฌ์คํธ๋ ์ด๋ฅผ ์ด์ด์ ๋ณธ๊ฒฉ์ ์ธ Spring + Axon Framework๋ฅผ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
(์ด์ ๋ถํฐ ์ ์ฃผ์ ์ ๋ํด ๊ธ์ ์จ๋ณด๊ธฐ๋ก ํ๋๋ฐ, ๋ง์ด ๋ฆ์ด์ง ์ ์ฃ์กํฉ๋๋ค.)
์ฐธ๊ณ : https://edykim.com/ko/post/eventsourcing-pattern-cleanup/