์ด๋ฒคํธ ์์ฑ (Event Sourcing) ์ ๋ฌด์์ผ๊น?
์ด๋ฒคํธ ์์ฑ(Event Sourcing)์ ์์คํ ์ ์ํ๋ฅผ ์ง์ ์ ์ฅํ๋ ๋์ , ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ์์๋๋ก ๊ธฐ๋กํ๊ณ ์ด ์ด๋ฒคํธ๋ค์ ๊ธฐ๋ฐ์ผ๋ก ์ํ๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ์ค๊ณ ํจํด์ด๋ค. ์ ํต์ ์ธ CRUD ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ๋ชจ๋ ์ํ ๋ณ๊ฒฝ์ ์ด๋ ฅ์ ๊ธฐ๋กํ๊ณ ์ด๋ฅผ ํตํด ํ์ฌ ์ํ๋ฅผ ํ์ ํ๋ค.
์ด๋ฒคํธ ์์ฑ์ ๊ธฐ๋ณธ ๊ฐ๋
- ์ด๋ฒคํธ(Event)
์ด๋ฒคํธ๋ ์์คํ ์์ ๋ฐ์ํ ์ํ ๋ณ๊ฒฝ์ ๊ธฐ๋ก์ด๋ค. ์๋ฅผ ๋ค์ด, ์ํ ์์คํ ์์๋ ๊ณ์ข ๊ฐ์ค, ์ ๊ธ, ์ถ๊ธ ๊ฐ์ ๊ฒ์ด ์ด๋ฒคํธ๊ฐ ๋ ์ ์๋ค. ๊ฐ ์ด๋ฒคํธ์๋ ๋ฐ์ ์๊ฐ, ๊ด๋ จ๋ ๋ฐ์ดํฐ, ๋ณ๊ฒฝ ์ฌํญ์ด ํฌํจ๋๋ค. - ์ด๋ฒคํธ ๋ก๊ทธ(Event Log)
์ด๋ฒคํธ๋ค์ ์๊ฐ ์์๋๋ก ๊ธฐ๋ก๋๋ฉฐ ๋ถ๋ณ(Immutable)์ด๋ค. ์ญ์ ๋๊ฑฐ๋ ์์ ๋์ง ์๊ณ , ๋ชจ๋ ์ํ ๋ณ๊ฒฝ ์ด๋ ฅ์ ๋ณด๊ดํ๋ค. - ๋ฆฌํ๋ ์ด(Replaying)
์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ์ฒ์๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ฌ์ํ์ฌ ์์คํ ์ ์ํ๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ๊ฒ์ ์๋ฏธํ๋ค. - ์ปค๋งจ๋(Command)์ ์ด๋ฒคํธ(Event)
- ์ปค๋งจ๋๋ ์์คํ ์ ์ํํ๋ผ๊ณ ์์ฒญํ๋ ์์ ์ด๋ค. ์๋ฅผ ๋ค์ด, "์ก๊ธํ๊ธฐ"๊ฐ ์ปค๋งจ๋๋ค.
- ์ปค๋งจ๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉด ์ด๋ฒคํธ๊ฐ ์์ฑ๋๋ค. ์๋ฅผ ๋ค์ด, "์ก๊ธ ์๋ฃ๋จ"์ด๋ผ๋ ์ด๋ฒคํธ๊ฐ ๊ธฐ๋ก๋ ์ ์๋ค.
์์๋ก ์ดํด๋ณด๋ ์ด๋ฒคํธ ์์ฑ
์ํ ๊ณ์ข ์์คํ
- ์ด๋ฒคํธ ๋ก๊ทธ:
1. ๊ณ์ข ๊ฐ์ค (์ด๊ธฐ ์์ก: 0)
2. ์
๊ธ (๊ธ์ก: 1000์)
3. ์ถ๊ธ (๊ธ์ก: 500์
- ์ํ ์ฌ๊ตฌ์ฑ:
์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฌ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ํ๋ฅผ ์ฌ๊ตฌ์ฑํ ์ ์๋ค.- ๊ณ์ข ๊ฐ์ค → ์์ก: 0
- ์ ๊ธ (1000์) → ์์ก: 1000
- ์ถ๊ธ (500์) → ์์ก: 500
์ด๋ ๊ฒ ์ด๋ฒคํธ๋ฅผ ํตํด ์์ก์ด 500์์ด ๋ ์ด์ ๋ฅผ ๋ช ํํ๊ฒ ์ ์ ์๋ค.
CRUD ๋ฐฉ์๊ณผ ์ด๋ฒคํธ ์์ฑ์ ๋น๊ต
1. CRUD ๋ฐฉ์
CRUD ๋ฐฉ์์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ฌ ์ํ๋ง ์ ์ฅํ๋ค.
๊ณ์ข ID์์ก
12345 | 500 |
- ์์ก์ด ์ 500์์ด ๋์๋์ง์ ๋ํ ์ด๋ ฅ์ด ๋จ์ ์์ง ์๋ค.
- ๊ณผ๊ฑฐ ์ํ๋ ๋ณ๊ฒฝ ๋ด์ญ์ ์ถ์ ํ๊ธฐ ์ด๋ ต๋ค.
2. ์ด๋ฒคํธ ์์ฑ ๋ฐฉ์
์ด๋ฒคํธ ์์ฑ์์๋ ๋ชจ๋ ์ํ ๋ณ๊ฒฝ์ ์ด๋ฒคํธ๋ก ๊ธฐ๋กํ๋ค.
์๊ฐ์ด๋ฒคํธ ํ์ ๋ฐ์ดํฐ
2024-01-01 | ๊ณ์ข ๊ฐ์ค | ์ด๊ธฐ ์์ก: 0 |
2024-01-05 | ์ ๊ธ | ๊ธ์ก: 1000์ |
2024-01-10 | ์ถ๊ธ | ๊ธ์ก: 500์ |
์ด๋ฒคํธ๋ฅผ ๋ฆฌํ๋ ์ดํ๋ฉด ํ์ฌ ์ํ๋ฟ๋ง ์๋๋ผ ๋ณ๊ฒฝ ์ด๋ ฅ๊ณผ ์์ธ๊น์ง ์ถ์ ํ ์ ์๋ค.
์ฅ์
- ์ด๋ ฅ ๊ด๋ฆฌ์ ๊ฐ์ฌ(Audit)
๋ชจ๋ ๋ณ๊ฒฝ ์ด๋ ฅ์ด ๊ธฐ๋ก๋๋ฏ๋ก ๋ณ๊ฒฝ ์์ธ์ ๋ช ํํ๊ฒ ์ถ์ ํ ์ ์๋ค. - ์ํ ๋ณต์ ๋ฐ ์ฌ๊ตฌ์ฑ
์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ๋ฆฌํ๋ ์ดํ์ฌ ์์คํ ์ํ๋ฅผ ์ํ๋ ์์ ์ผ๋ก ๋๋๋ฆฌ๊ฑฐ๋ ์ฌ๊ตฌ์ฑํ ์ ์๋ค. - ๋๋ฒ๊น
๊ณผ ์๊ฐ ์ฌํ
๊ณผ๊ฑฐ ์ํ๋ก ๋์๊ฐ์ ๋ฌธ์ ๋ฅผ ์ฌํํ๊ณ ๋๋ฒ๊น ํ ์ ์๋ค. - CQRS์์ ์๋์ง
์ฐ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฝ๊ธฐ ๋ชจ๋ธ์ ๋ถ๋ฆฌํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์๋ค. - ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ
๋์์ฑ์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ธ ๊ฐ๋ณ ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐ์ ํ๊ธฐ ๋๋ฌธ์ ๋์์ ๊ฐ์ ์ปดํฌ๋ํธ์ ๋ํด ์์ ์ด ์ด๋ค์ง์ง ์๋๋ค.
๋จ์
- ์ค๊ณ์ ๊ตฌํ์ ๋ณต์ก์ฑ
์ ํต์ ์ธ CRUD๋ณด๋ค ๋ณต์กํ๋ฉฐ, ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ฒ์ ๊ด๋ฆฌํ๋ ๋ก์ง์ด ํ์ํ๋ค. - ์ฑ๋ฅ ๋ฌธ์
์ด๋ฒคํธ๊ฐ ๋ง์์ง๋ฉด ์ํ ์ฌ๊ตฌ์ฑ์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๋ ์ท์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค. - ์ด๋ฒคํธ ์์ ์ ์ด๋ ค์
๊ธฐ๋ก๋ ์ด๋ฒคํธ๋ ๋ถ๋ณ์ด๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ์ด๋ฒคํธ๋ฅผ ์์ ํ๊ธฐ ์ด๋ ต๋ค. ๋์ ๋ณด์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
ํ์ฉ ์ฌ๋ก
- ๊ธ์ต ์์คํ : ๊ฑฐ๋ ์ด๋ ฅ์ ๊ด๋ฆฌํด์ผ ํ๋ ์ํ์ด๋ ๊ฒฐ์ ์์คํ
- ์ด์ปค๋จธ์ค: ์ฃผ๋ฌธ ์ฒ๋ฆฌ ๋ฐ ๋ฐฐ์ก ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์์คํ
- ๊ฒ์ ๊ฐ๋ฐ: ํ๋ ์ด์ด์ ํ๋ ์ด๋ ฅ์ ๊ธฐ๋กํ๊ณ ์ฌ์
- ๋ถ์ฐ ์์คํ : ์๋น์ค ๊ฐ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํด์ผ ํ๋ ์์คํ
- ํ์๊ด๋ฆฌ ์์คํ : ํ๋ก๊ทธ๋จ ์์ค์ฝ๋์ ๋ณํ์ ๋ํ ํ์คํ ๋ฆฌ๋ฅผ ์์ธํ๊ฒ ๊ธฐ๋กํ๋ ์์คํ . (Git, SVN ๋ฑ)
์ด๋ฒคํธ ์์ฑ์ ์ํ ๋ณ๊ฒฝ์ ํฌ๋ช ์ฑ์ ๋ณด์ฅํ๊ณ ์ด๋ ฅ์ ์ถ์ ํ ํ์๊ฐ ์๋ ์์คํ ์ ์ ์ฉํ๋ค.