ํ์ฌ ์ฝ๋์๋ ํด๊ฒฐํ์ง ๋ชปํ ๋ฌธ์ ๊ฐ ์์๋ค.
Elasitcsearch์ keycloakd์ ์ธ๋ถ์์ ๋์๊ฐ๋๋ฐ
ํ๋์ ํธ๋์ญ์ ์์ ๊ด๋ฆฌํ๋ ค๋ค ๋ณด๋
DB์ ๊ฐ ํ๋ก๊ทธ๋จ ์ ๋ฐ์ดํฐ๊ฐ ์ด๊ธ๋ ๊ฐ๋ฅ์ฑ์ด ์์๋ค.
๊ทธ๋์ ์ด๋ฒ์ ์ด ์ฝ๋๋ฅผ ์์ ํด ๋ณผ ๊ฒ์ด๋ค.
1. ๋ฌธ์
๋ฐ์ดํฐ ์ ํฉ์ฑ ๋ฌธ์ ๋ฅผ ์๊ณ ์์๋ค. ๊ทธ๋์ ๊ทธ๋ ๋น์ ๋ด๊ฐ ํ ์ ์๋ ๋ฐฉ๋ฒ์ธ ์๋ ๋๊ธฐํ๋ก ์ ์ฒด ๋๊ธฐํ ๋ฉ์๋(syncAllToElasticsearch)๋ฅผ ๋ง๋ค์๋ค.
Q. ๋ฐ์ดํฐ ์ ํฉ์ฑ์ด๋?
A. ์๋ก ์ฐ๊ด๋ ๋ฐ์ดํฐ๊ฐ ์ ํด์ง ๊ท์น์ ๋ง๊ฒ ์ผ์นํ๋ ์ํ๋ฅผ ๋งํ๋ค.

์ผ๋จ ๊ฐ์ฅ ์ฒซ ๋ฒ์งธ๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์ด์ผ๊ธฐํด ๋ณด๊ฒ ๋ค. Elasticsearch(๊ฒ์์ฉ)์ Keycloak(๋ก๊ทธ์ธ์ฉ)์ DB์ ๊ฐ์ ๊ณต๊ฐ์ด ์๋ ์ธ๋ถ์ ์กด์ฌํ๋ ์์คํ ์ด๋ค. ๊ทธ๋์ DB์ Elasticsearch(ํน์ Keycloak)๋ ๋ฐ๋ก ๊ด๋ฆฌ๋ฅผ ํด์ผ ํ๋ค. (Keycloak์ ๋ค์ ํฌ์คํ ์์...)
๊ทธ๋ฌ๋ค ๋ณด๋ ๋ํ์ ์ธ ๋ฌธ์ ์ธ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ด ๊นจ์ง๋ ์ผ์ด ๋ฐ์ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด์ ์ฌ์ฉ์๊ฐ ๊ณ ๊ฐ์ ์ด๋ฆ์ ์์ ํ๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋ฐ๋ฐ ์ด๋ค ์ด์ ๋ก DB๋ ์์ ์ ์คํจํ๋ค. DB๋ ์์์ ๋กค๋ฐฑ์ ํ๊ณ ์ด์ ๊ฐ์ผ๋ก ๋์๊ฐ๋ค. ๊ทธ๋ฐ๋ฐ Elasticsearch์ Keycloak์ ๋กค๋ฐฑ์ด๋ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ ์์ ๋ ๊ฐ์ ๊ทธ๋๋ก ๊ฐ์ง๊ฒ ๋๋ค. ๊ทธ๋์ DB์ Elasticsearch(ํน์ Keycloak)๊ฐ ์๋ก ๋ค๊ณ ์๋ ๋ฐ์ดํฐ๋ค์ด ์ด๊ธ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
[Elasticsearch]
์ฒ์์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด syncAllToElasticsearch() ์ ์ฒด ๋๊ธฐํ ๋ฉ์๋๋ฅผ ๋ง๋ค์๋ค. DB์ Elasticsearch๊ฐ ์๋ก ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ค์ด ๋๊ฐ์์ง ํ์ธํ๋ ๊ฒ์ด๋ค.
| ์์ ์ ํ๋ฆ | |
| 1. ์ฌ์ฉ์๊ฐ ๊ณ ๊ฐ ์ด๋ฆ์ ์์ | |
| 2. CustomerService.update( ) ์คํ | |
| 3. MySQL ๊ณ ๊ฐ ์ ์ฅ ์์ฒญ | |
| 4. Elasticsearch ๊ณ ๊ฐ ์ ์ฅ ์์ฒญ | |
| 5. MySQL ํธ๋์ญ์ ์ปค๋ฐ |
์ด ๋ฉ์๋๋ MySQL ๊ณ ๊ฐ ๋ชฉ๋ก์ ์ฝ์ด์ Elasticsearch์ ๋ค์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ด๋ค. ๋ฌผ๋ก ์ด ์ ๋ ์์ ์ฅ์น๋ฅผ ํด๋ฌ๋ ํ ํ๋ก์ ํธ์ ์ผ๋ คํ ๋ฌธ์ ๊ฐ ์ผ์ด๋์ง ์๋ ๊ฒ ๊ฐ๋ค. (๋ฐ์ํ์ง ์์์ ๋ฟ, ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์๋ค) ๊ทธ๋ฐ๋ฐ ๊ณต๋ถ๋ฅผ ๋ ํ๋ฉด์ ์๊ฐ๋ณด๋ค ์ด ๋ฐฉ๋ฒ์ด ์ฉ ์ข์ ๋ฐฉ๋ฒ์ด ์๋๋ผ๋ ๊ฑธ ์๊ฒ ๋์๋ค.
์ด ์๋ ๋๊ธฐํ๋ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ๋ ๋ฒ์งธ ๋ฌธ์ ๊ฐ ์๋ค. ํด๋น ๋๊ธฐํ ๋ฉ์๋๋ MySQL ๊ณ ๊ฐ ๋ชฉ๋ก์ ์ฝ์ด์ Elasticsearch์ ๋ค์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ด๋ผ๊ณ ์ค๋ช ํ์๋ค. ์ฆ, ์ญ์ ๋ ๊ณ ๊ฐ์ ์ ๊ฑฐํ์ง ๋ชปํ๋ค. 101๋ฒ ๊ณ ๊ฐ๊ณผ 102๋ฒ ๊ณ ๊ฐ์ด ์๋ ๊ฒ์ ์๊ฒ ๋๋ฉด ๋ค์ ES(Elasticsearch)์ ์ ์ฅํ๋ค. ๊ทธ๋ฌ๋ 103๋ฒ ๊ณ ๊ฐ์ด MySQL์ ์๋ ๊ฒฝ์ฐ ES์๋ง ๋ฐ์ดํฐ๊ฐ ๋จ์์์ ์ ์๋ค. ์ด๋ฐ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์๋ฌธ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทธ๋ฆฌ๊ณ ์ธ ๋ฒ์งธ ๋ฌธ์ ๊ฐ ๋ ์๋ค. ์ด ๋ฌธ์ ๊ฐ ๋ฐฉ๊ธ์ ๋ฌธ์ ๋ณด๋ค ์ค์ํ๋ค. ๋์์ ๋ ๊ฐ์ง ์์ ์ด ์งํ๋๋ ์ํฉ์ด๋ผ๊ณ ๊ฐ์ ํ์. A์์ ์ ์ ์ฒด ๋๊ธฐํ ์ค์ด๊ณ B ์์ ์ ๊ด๋ฆฌ์์ ๊ณ ๊ฐ ์ด๋ฆ์ ์์ ํ๊ณ ์๋ ์ค์ด๋ค.
| 1. ์ ์ฒด ๋๊ธฐํ A๊ฐ MySQL์์ ํ๊ธธ๋์ ์ฝ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ดํ๋ค. (8์) |
| 2. ๊ด๋ฆฌ์ B๊ฐ ์ด๋ฆ์ ์ฒญ๊ธธ๋์ผ๋ก ์์ ํ๊ณ MySQL๊ณผ ES์ ๋ฐ์ํ๋ค. (8์ 1์ด) |
| 3. ๋๊ธฐํ A๊ฐ ์์ ์ฝ์๋ ํ๊ธธ๋์ ES์ ์ ์ฅํ๋ค. (8์ 2์ด) |
| 4. MySQL์ ์ฒญ๊ธธ๋, ES๋ ํ๊ธธ๋์ผ๋ก ์ ์ฅ๋๋ค. (8์ 3์ด) |
์ด ๋ฌธ์ ๋ฅผ ๊ฒฝ์ ์ํ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ฌ๋ฌ ์์ ์ด ๋์์ ์คํ๋๋ฉด์ ์ด๋ค ์์ ์ด ๋จผ์ ๋๋๋์ง์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ํ์์ ๋งํ๋ค. ์ด ํ์์ ์ ์ฅ์์๋ง ๋ฐ์ํ๋ ๊ฒ์ด ์๋๋ผ ์ญ์ ๋ ์ผ์ด๋๋ค. ์ ์ฒด ๋๊ธฐํ๊ฐ ๊ณ ๊ฐ์ ์ฝ์ ์์ ์์ ๊ด๋ฆฌ์๊ฐ ํด๋น ๊ณ ๊ฐ์ ์ญ์ ํ ํ ์ ์ฒด ๋๊ธฐํ๊ฐ ๋ง์ ์๋ฌด๋ฅผ ์ํํ๋ค๋ฉด MySQL์ ์ญ์ ๋์์ด๋ ES์๋ ๋จ์์๊ฒ ๋๋ ๊ฒ์ด๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์ ์ฒด ๋๊ธฐํ API๋ฅผ ์ค์ผ์ค๋ฌ๋ก ์ฃผ๊ธฐ์ ์ผ๋ก ์คํํด๋ ์ ํฉ์ฑ ๋ฌธ์ ๋ ํด๊ฒฐ๋์ง ์๋๋ค!
์ด ๋ด๋ง์ ์์ธํ ์๊ณ ๋๋ ์ ๊ณ ์น ์๊ฐ ์์๋ค. ์ฌ์ค ์ด ํ๋ก์ ํธ๋ ๋ด๊ฐ ์ง์ ์ฝ๋๋ฅผ ์ฐพ์๋ณด๋ฉฐ ์์ฑํ์๋ค. ๋ฌผ๋ก ํ๋ฐ๋ถํฐ๋ AI ๋์์ ๋ฐ์์ง๋ง ๋ง๊ตฌ๋ง๊ตฌ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ ์ต๋ํ ๋ด๊ฐ ์ค์ค๋ก ๊ณต๋ถํ๊ณ ์ฝ๋๋ฅผ ์์ฑํ ๋ค ๊ณ์ํด์ ์๋์ด ์คํจ๋๋ฉด AI์๊ฒ ๋ญ๊ฐ ๋ฌธ์ ์ธ์ง ๋ฌผ์ด๋ณด๋ ๋ฐฉ์์ผ๋ก ์งํํ์๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋ ์์ ๋ฉด์ ์ค๋น๋ฅผ ํ๋ฉด์ ์ ์ฝ๋์ ๋ฌธ์ ์ ์ ํ๋๋์ฉ ๋ฐ๊ฒฌํ๋ ์ค์ด๋ค.
2. ๋ค์ํ ํด๊ฒฐ ๋ฐฉ๋ฒ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ณ ๋ คํด์ผ ํ ๊ฒ๋ค์ด ์๋ค. ์ฒซ ๋ฒ์งธ๋ MySQL๊ณผ ES ์์ ์ฑ๊ณต์ ๋ชจ๋ ๋ณด์ฅํ ๊ฒ. ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ์งธ๋ ์ต๋ํ ์ถ๊ฐํ๋ ์ธํ๋ผ ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ด๋ค. ์ธํ๋ผ๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ํด๊ฒฐํ๊ณ ์ ํ๋ ์ด์ ๋, ์ด ํ๋ก์ ํธ๊ฐ ๋ค์์ ์ฌ์ฉ์๋ฅผ ์ํด ๋ง๋ ํ๋ก๊ทธ๋จ์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ฒ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ ๋น์ ๋๋ฆ๋๋ก ์คํ ๋ฆฌ๋ผ์ธ์ด ์์๋ค. ๋ง์ฝ ๋ด๊ฐ ์ด๋ ๋ธ๋๋๋ฅผ ๋ง๋ค์๊ณ ๊ทธ ๋ธ๋๋๊ฐ ๋๋ฆ ์ปค์ ธ์ VIP ์ด์ ๊ณ ๊ฐ์ ์ํด ์ฐ๋ง ์ด๋ฒคํธ๋ฅผ ์ฐ๋ค๋ ๊ฒ์ด์๋ค. ๊ทธ๋์ ๊ณ ๊ฐ์ ๊ด๋ฆฌํ๊ณ ๊ฐ ๊ณ ๊ฐ์ ๋ฑ๊ธ์ ๋ง๋ ์ฌ์ดํธ๋ฅผ ์ฐ๊ฒฐํด์ ์ผํ์ ํ ์ ์๋๋ก ์งํํ๋ ๊ฒ์ด์๋ค. ๋ฌผ๋ก ๋ง๋ค๋ค ๋ณด๋ DB์ ๊ด๋ จ๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์ถ์ ๋ง์์ด ์๊ฒจ ์ฝ๊ฐ์ ๋ฐฉํฅ์ด ์์ ๋์์ง๋ง ์ด์จ๋ ์ด ํ๋ก์ ํธ๋ ์ฌ์ฉ์ ๊ท๋ชจ๊ฐ ํฌ์ง ์๋ค. ๊ทธ๋์ ๊ตณ์ด ๋ค๋ฅธ ์ธํ๋ผ๋ฅผ ์ถ๊ฐํ๋ฉด์๊น์ง ๊ด๋ฆฌํ์ง ์์๋ ๋์ง ์์๊น๋ผ๊ณ ์๊ฐํ๋ค.
- ์๊ณ ๊ฐ๋ฉด ์ข์ ๊ฐ๋ ๋ค
Q. ์ด์ค ์ฐ๊ธฐ(Dual Write)๋?
A. ํ๋์ ๋น์ฆ๋์ค ์์ ์ ์ํํ๋ฉด์ ์๋ก ๋ค๋ฅธ ๋ ์์คํ ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๋ ๊ฒ์ ๋งํ๋ค.
ํ์ฌ ํ๋ก์ ํธ์์๋ ๊ด๋ฆฌ์๊ฐ ๊ณ ๊ฐ์ ์ด๋ฆ์ ํ๊ธธ๋์์ ์ฒญ๊ธธ๋์ผ๋ก ๋ณ๊ฒฝํ ๊ฒ์ ์๋ค. ๋ณ๊ฒฝ ์์ฒญ์ ์ํด MySQL์ ๊ณ ๊ฐ ์ ๋ณด๋ ์์ ๋๊ณ ES์ ๊ฒ์ ๋ฐ์ดํฐ๋ ์์ ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ํ๋์ ์์ฒญ์์ ๋ ์ ์ฅ์์ ์ฐ๊ธฐ ์์ ์ด ๋ฐ์ํ ๊ฒ์ ์ด์ค ์ฐ๊ธฐ๋ผ๊ณ ํ๋ค.
Q. flush( )์ commit์ ์ฐจ์ด๋?
A. flush( )๋ SQL์ DB์ ์ ๋ฌํ๋ ๋์์ด๋ค. commit( )์ ํธ๋์ญ์ ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ์ต์ข ํ์ ํ๋ ๊ฒ์ ๋งํ๋ค.
์ฌ๊ธฐ์ ํท๊ฐ๋ฆฌ๋ฉด ์ ๋๋ ๊ฒ์ flush( )๋ ์ ๋ฌ๋ง ํ๊ณ ์ต์ข ํ์ ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋กค๋ฐฑ(์ปค๋ฐ์ด ๋์ง ์์ ํธ๋์ญ์ ์ ๋ณ๊ฒฝ ์ทจ์)์ด ๊ฐ๋ฅํ๋ค. commit์ ๋น์ฐํ ์ต์ข ํ์ ์ด ๋๊ธฐ ๋๋ฌธ์ ๋กค๋ฐฑ์ด ๋์ง ์๋๋ค.
Q. @Transactional์ด๋?
A. @Transactional์ ์คํ๋ง ํ๋ ์์ํฌ(Spring Framework)์์ ์ ์ธ์ ํธ๋์ญ์ (Transaction)์ ๊ด๋ฆฌํ๊ธฐ ์ํด ํด๋์ค๋ ๋ฉ์๋์ ๋ถ์ด๋ ์ด๋ ธํ ์ด์ ์ด๋ค. ํ์ฌ ํ๋ก์ ํธ์์ ์ผ๋ฐ์ ์ผ๋ก MySQL์ ๋ก์ปฌ ํธ๋์ญ์ ์ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
- ์์ฒญ ์์์ ์ง์ ๋๊ธฐํ (ํ์ฌ ๋ฐฉ๋ฒ)
์์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด MySQL๊ณผ ES์ ์ฐจ๋ก๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
| ์ฅ์ | • ๊ตฌํ์ด ๋จ์ํ๋ค • ์ธ๋ถ ์ธํ๋ผ ์์ด ๊ตฌํ ๊ฐ๋ฅํ๋ค |
| ๋จ์ | • ์ด์ค ์ฐ๊ธฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค • ES๊ฐ ์ค๋จ๋๋ฉด ๊ณ ๊ฐ ์์ ์์ฒญ๊น์ง ์คํจํ ์ ์๋ค • MySQL ์ปค๋ฐ ์ ์ ES ๋ณ๊ฒฝ์ด ์ฑ๊ณตํ๋ฉด ์ ์ฅ์ ์ฌ์ด์ ๋ถ์ผ์น๊ฐ ์๊ธธ ์ ์๋ค |
| ๊ฒฐ๋ก | • ๊ตฌํ์ ๊ฐ๋จํ๋ค • ๊ทธ๋ฌ๋ ์ฅ์ ์ํฉ์์ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ์์ ์ ์ผ๋ก ๋ณต๊ตฌํ๊ธฐ ์ด๋ ต๋ค |
- ์ปค๋ฐ ํ ์ด๋ฒคํธ๋ฆฌ์ค๋
ES ๋ฐ์ ์์ ์ ๋ฐ๊ฟ์ MySQL์ ๊ณ ๊ฐ ์ ๋ณด๋ฅผ ์ปค๋ฐํ ๋ค์ ES ์ ์ฅ ์์ฒญ์ ์คํํ๋ ๋ฐฉ๋ฒ์ด๋ค. Spring์์ @TransactionalEventListener๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
| ์ฅ์ | • DB ์ปค๋ฐ ํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค • MySQL์ด ๋กค๋ฐฑ๋์๋ ES์ ๋ณ๊ฒฝ์ด ๋ฐ์๋๋ ๋ฌธ์ ๋ฅผ ์ค์ผ ์ ์๋ค. |
| ๋จ์ | • ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์คํ ์ ์๋ฒ ์ข
๋ฃ๊ฐ ๋ ๊ฒฝ์ฐ ES ๋๊ธฐํ ์์
์ด ์ ์ค๋๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค. • ๊ธฐ๋ณธ์ ์ผ๋ก Spring์ ๋ด๋ถ ์ด๋ฒคํธ ๋งค์ปค๋์ฆ์ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ์ด๋ฒคํธ๊ฐ ์๊ตฌ์ ์ผ๋ก ์ ์ค๋ ์ ์๋ค. • ์๋ฒ ์ข ๋ฃ ํ ๋ณต๊ตฌํ๊ธฐ ์ํด ๋ณ๋ ์ฅ์น๊ฐ ํ์ํ๋ค. • ์ฅ์ ์ฌ์๋๋ฅผ ์ํ ์ถ๊ฐ ๊ตฌํ์ ํด์ค์ผํ๋ค. |
| ๊ฒฐ๋ก | • ES ๋ฐ์ ์์ ์ ๋ณ๊ฒฝํ์ฌ ๋ฌธ์ ๋ฅผ ์ค์ผ ์ ์๋ค. • ๊ทธ๋ฌ๋ ์ฅ์ ์ํฉ์์์ ๋ฐ์ดํฐ ์ ํฉ์ฑ ๋ณด์ฅ์ด๋ ์๋ ๋ณต๊ตฌ ๊ธฐ๋ฅ๊น์ง ์ ๊ณตํ์ง ์๋๋ค. |
- Transactional Outbox (์ฑํ! ๊ตฌ์ฒด์ ์ธ ์ค๋ช
์ ๋ฐ์)
Outbox๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ๊ณผ ๋ฉ์์ง ๋ธ๋ก์ปค(Kafka, RabbitMQ ๋ฑ) ๊ฐ์ ์์์ฑ์ ๋ณด์ฅํ์ฌ, ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ์์ ๋ฐ์ดํฐ ์ ์ค์ด๋ ์ ํฉ์ฑ ๊นจ์ง์ ๋ฐฉ์งํ๋ ๋์์ธ ํจํด์ ๋งํ๋ค. ๋ฌผ๋ก ์ด ํ๋ก์ ํธ์์๋ ๋ฉ์์ง ๋ธ๋ก์ปค๋ ์ ์ธํ ๊ฒ์ด๋ค. ๊ณ ๊ฐ ์ ๋ณด ๋ณ๊ฒฝ๊ณผ ๋ณ๊ฒฝ ์ฌ์ค์ ๊ธฐ๋ก์ ํ๋์ MySQL ํธ๋์ญ์ ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
๊ณ ๊ฐ ์ด๋ฆ ์์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ํ๋์ ํธ๋์ญ์ ์ด ์์ํ๋ค. customers ํ ์ด๋ธ ์์ ์ด ์ด๋ค์ง๊ณ outbox ํ ์ด๋ธ์ ๋๊ธฐํ ์์ ์ ์ ์ฅํ๋ค. ๊ทธ ํ commit์ด ๋๋ฉด ์ค์ผ์ค๋ฌ๊ฐ Outbox ์์ ์ ํ์ธํด ES์ ๋ฐ์ํ๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ MySQL๊ณผ ES๋ฅผ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์๋ค๋ ๋ป์ด ์๋๋ผ๋ ์ ์ด๋ค. ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ธ ๊ฒ์ MySQL ๊ณ ๊ฐ ๋ฐ์ดํฐ ๋ณ๊ฒฝ๊ณผ MySQL Outbox ์์ ๊ธฐ๋ก์ด๋ค. ES๊ฐ ์ ์ ๊ณ ์ฅ ๋๋๋ผ๋ ๊ณ ๊ฐ์ ๊ฒ์ ์ธ๋ฑ์ค์ ๋ฐ์ํด์ผ ํ๋ค๋ ์ฌ์ค์ MySQL์ ๋จ๊ฒ ๋๋ค.
๋ฌผ๋ก ๋จ์ํ Transactional Outbox๋ง ์ฌ์ฉํ๋ค๊ณ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์๋๋ค. ๊ทธ๋ฌ๋ค๋ฉด ์ง์์ ์ฌ์ฉํ์ ๊ฒ์ด๋ค. Transactional Outbox๋ ๋น์ฆ๋์ค ๋ฐ์ดํฐ์ ์ด๋ฒคํธ๋ฅผ ๋์ผํ DB ํธ๋์ญ์ ์ผ๋ก ์์ ํ๊ฒ ์ ์ฅํ๋ ์ญํ ๋ง ๋ด๋นํ๋ค. ์์ ํ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ฌ์ฑํ๋ ค๋ฉด ๋ณ๋์ ์ฒ๋ฆฌ๊ธฐ์ ์ถ๊ฐ์ ์ธ ์์ ์ฅ์น๋ค์ด ์์ด์ผ ํ๋ค.
| ์ฅ์ | • ์ธํ๋ผ ๊ตฌ์ถ ๋ฐ ์ด์ ๋น์ฉ์ด ๋ฐ๋ก ๋ค์ง ์๋๋ค. • ๋ฐ์ดํฐ ์ ์ค์ ๋ฐฉ์งํ์ฌ ์์์ฑ์ ํ๋ณดํ๋ค. |
| ๋จ์ | • ํธ๋ํฝ์ด ๋ง์์ง๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์์ ์ธ I/O ๋ถํ์ ๋ฝ ๊ฒฝํฉ์ ์ ๋ฐํ๋ค. • ์ฌ๋ฌ ๋์ ์๋ฒ๊ฐ ๋์์ ํด๋ง(ํ๋์ ์ฅ์น๋ ํ๋ก๊ทธ๋จ์ด ๋ค๋ฅธ ์ฅ์น๋ ์๋ฒ์ ์ํ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฒ์ฌ)์ ๋๋ฆด ๋ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ์ค๋ณต์ผ๋ก ์ฒ๋ฆฌํ์ง ์๋๋ก ๋ฐฐํ ๋ฝ ๋ก์ง์ DB๋ณ๋ก ๊ตฌํํด์ผํ๋ค. |
| ๊ฒฐ๋ก | • ํธ๋ํฝ์ด ํญ์ฆํ์ง ์๋ ํ๊ฒฝ์์ ์ธํ๋ผ ์ถ๊ฐ ์์ด ๊ฐ๋จํ๊ณ ํ์คํ๊ฒ ์ด๋ฒคํธ ์ ์ค๋ง ๋ง์ ์ ์๋ค. • ๊ทธ๋ฌ๋ ๋๊ท๋ชจ ํธ๋ํฝ์ด๋ ๋ณต์กํ ๋ง์ดํฌ๋ก์๋น์ค ๊ตฌ์กฐ๋ก ํ์ฅ๋๋ฉด DB ๋ถํ์ ํด๋ง ํ๊ณ ๋๋ฌธ์ Kafka๋ CDC ๊ธฐ๋ฐ์ผ๋ก ์ ํํด์ผํ๋ค. |
- Kafka์ RabbitMQ
๋ฉ์์ง๋ธ๋ก์ปค๋ ์์คํ ์ฌ์ด์์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๊ณ ๋ณด๊ดํ๋ ์ญํ ์ ํ๋ ์ํํธ์จ์ด๋ค.
์๋ฅผ ๋ค์ด์ ๊ด๋ฆฌ์๊ฐ ๊ณ ๊ฐ ์ ๋ณด๋ฅผ ์์ ํ๋ฉด ๊ณ ๊ฐ ์๋น์ค๋ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ธ๋ค.
{
"event": "CUSTOMER_UPDATED",
"customerId": 101
}
๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ์์ ES์ ๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค. ๋ฌผ๋ก Kafka์ RabbitMQ๋ ๋ชจ๋ ๋ฉ์์ง์ ์ง์ํ์ง๋ง ๋ด๋ถ ๊ตฌ์กฐ์ ์ฌ์ฉ ๋ฐฉ์์ ์๋ก ๋ค๋ฅด๋ค. ๋ค๋ง ๋จ์ํ๊ฒ ๋ ๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ ๋ค๋ฅธ ์ฒ๋ฆฌ๊ธฐ๋ก ์ ๋ฌํ ์ ์๋ ๊ธฐ์ ์ด๋ผ๋ ๊ฒ๋ง ์๊ณ ๋์ด๊ฐ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฌ๋ฉด ๋ฉ์์ง ๋ธ๋ก์ปค๋ฅผ ํ์ฉํ๋ฉด ๋ชจ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊น? ์๋๋ค. ๋๋๊ฒ๋ ์ฌ์ ํ ์ด์ค ์ฐ๊ธฐ ๋ฌธ์ ๊ฐ ๋จ๋๋ค. ๊ณ ๊ฐ ์์ ์ ์ปค๋ฐ์ด ์ด๋ค์ง๊ณ ๊ทธ ํ ๋ฉ์์ง ์ ์ก์ ์๋ํ๋ค๊ณ ํ๋๋ผ๋ Kafka์ ๋ฉ์์ง๊ฐ ๋์ฐฉํ์ง ์์ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ES๋ฅผ ์์ ํด์ผ ํ๋ค๋ ์ฌ์ค์ Consumer(๋ฉ์์ง๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ํ๋ก๊ทธ๋จ)๊ฐ ์ ์ ์๋ค. ๋ฐ๋๋ก ๋ฉ์์ง๋ฅผ ๋จผ์ ๋ณด๋๋๋ฐ MySQL ์ปค๋ฐ์ด ์คํจํ๋ค๋ฉด ์ค์ ํ์ ๋์ง ์์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ์๋น์ค์ ์ ๋ฌ๋ ์๋ ์๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ๋ฉ์์ง ๋ธ๋ก์ปค๊ฐ ์๋ค๊ณ ํด์ MySQL ํธ๋์ญ์ ๊ณผ ๋ฉ์์ง ๋ฐํ์ด ์๋์ผ๋ก ํ๋์ ์์์ ์์ ์ด ๋๋ ๊ฒ์ด ์๋๋ค.
๊ทธ๋์ ๋ง์ ๊ธฐ์ ๊ณผ ํ๋ก๊ทธ๋จ์์ Kafka์ OutBox๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค. Kafka๋ ๋ฉ์์ง์ ์ ๋ฌ๊ณผ ๋ถ๋ฐฐ ๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ญํ ์ ๋ด๋นํ๋ค. Outbox๋ ์ ๋ฌํด์ผ ํ ์์ ์ ์ ์ค ๋ฐฉ์ง ์ญํ ์ ๋งก๋๋ค.
| ์ฅ์ | • OutBox ํ
์ด๋ธ์ ๋จ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ํ ์ฌ์๋๊ฐ ๊ฐ๋ฅํ๋ค. • ์ฅ์ ์ํฉ์์๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ณด์ฅํ๋ค. • ์์ ์ ์ธ DB ํธ๋์ญ์ ์์ Kafka์ ๊ฐ๋ ฅํ ๋์ฉ๋ ์ฒ๋ฆฌ, ํํฐ์ ๋, ํ์ฅ์ฑ์ ๊ฒฐํฉํ ์ ์๋ค. |
| ๋จ์ | • ์ถ๊ฐ ์ธํ๋ผ์ ์ด์ ๋ณต์ก๋๊ฐ ์ปค์ง๋ฉฐ ๊ฐ๋ฐ ๋น์ฉ์ด ์ฌ๋ผ๊ฐ๋ค. • ๋ชจ๋ ์ด๋ฒคํธ ๋ฐ์๋ง๋ค DB ์ฐ๊ธฐ ์์ ์ด ์ถ๊ฐ๋ก ๋ฐ์ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ค ๋ถํ๋ฅผ ์ค ์ ์๋ค. • ๋คํธ์ํฌ ์ฌ์๋ ๋ฑ์ผ๋ก ์ธํด ์ด๋ฒคํธ ์ค๋ณต ์์ ํ ์ ์์ด Consumer ์ธก์ ๋ฉฑ๋ฑ์ฑ ๋ก์ง ๊ตฌํ์ด ํ์์ ์ด๋ค. |
| ๊ฒฐ๋ก | • ๋ฐ์ดํฐ ์ ํฉ์ฑ๊ณผ ์ ์ค ๋ฐฉ์ง์์ ๊ฐ์ฅ ์ ๋ขฐํ ์ ์๋ ํ์ค ์ํคํ
์ฒ ํจํด์ด๋ค. • ๊ตฌํ ๋ณต์ก๋์ ์ธํ๋ผ ๋น์ฉ์ด๋ผ๋ ํธ๋ ์ด๋์คํ๊ฐ ์กด์ฌํ๋ฏ๋ก ๊ธ์ ๊ฑฐ๋๋ ์ฃผ๋ฌธ ๋ฑ ์ ํฉ์ฑ์ด ์๋ช ์ธ ํต์ฌ ๋๋ฉ์ธ์ ์ง์ค์ ์ผ๋ก ์ ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค. |
- CDC
CDC๋ Change Data Capture, ์ฆ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ๋ ๊ธฐ์ ์ด๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ํ ๋ณ๊ฒฝ ๊ธฐ๋ก์ ์ฝ์ด ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์์ ๋์๋์ง ๊ฐ์งํ ์ ์๋ค. MySQL์๋ binlog๋ผ๋ ๊ธฐ๋ฅ์ด ์๋ค. binlog(Binary Log)๋ MySQL์์ ๋ฐ์ํ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ๋ฑ์ ๊ธฐ๋กํ๋ ๋ก๊ทธ์ด๋ค.
์ฝ๊ฒ ๋งํด์ DB๊ฐ ์ํํ ๋ณ๊ฒฝ ์ด๋ ฅ์ ๋ค๋ฅธ ์์คํ ์์ ํ์ฉํ ์ ์๋๋ก ๊ธฐ๋กํด ๋๋ ์ฅ์น๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์๋ฅผ ๋ค์ด์ id๊ฐ 101๋ฒ์ ์ด๋ฆ์ ์ฒญ๊ธธ๋์ผ๋ก UPDATE ํ๋ SQL์ด ์คํ๋์๋ค๊ณ ๊ฐ์ ํ์. (์ด ๊ฐ์ ์ MySQL์์ ์ผ์ด๋ ๊ฒ์ด๋ค) CDC ๋๊ตฌ๋ MySQL์ ๋ณ๊ฒฝ ๋ก๊ทธ๋ฅผ ์ฝ์ด ๊ณ ๊ฐ 101์ ๋ณ๊ฒฝ์ ๊ฐ์งํ ์ ์๋ค. ์ด๋ ๋ํ์ ์ธ ๋๊ตฌ๋ Debezium์ด๋ค. Debezium์ MySQL ์ปค๋ฅํฐ๋ binlog๋ฅผ ์ฝ์ด INSERT, UPDATE, DELETE ๋ฑ ํ ๋จ์ ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ฅผ ์์ฑํ ์ ์๋ค.
CDC๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑฐ์น์ง ์๊ณ ์คํ๋ SQL ๋ณ๊ฒฝ๋ ๊ฐ์งํ ์ ์๋ค. ๊ผญ CustomerService๊ฐ ์๋, ๊ฐ๋ฐ์๊ฐ ์ง์ UPDATE SQL์ ์คํํ๊ฑฐ๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ด DB๋ฅผ ์์ ํด๋ MySQL CDC๋ ์ด๋ฅผ ๊ฐ์งํ ์ ์๋ค. ๋ฌผ๋ก CDC๊ฐ ๊ฐ์งํ ๋ณ๊ฒฝ์ ์ฌ๋ฐ๋ฅธ ES ๋ฌธ์ ๋ณ๊ฒฝ์ ๋ณํํ๋ ๋ก์ง์ ๋ณ๋๋ก ํ์ํ๋ค.
๋ค๋ง CDC๋ฅผ ์์ ์ ์ผ๋ก ์ด์ํ๋ ค๋ฉด ์ถ๊ฐ๋ก ๊ณ ๋ คํ ๋ด์ฉ์ด ๋ง๋ค. binlog ์ค์ , CDC ๋๊ตฌ๊ฐ ๋ก๊ทธ๋ฅผ ์ฝ์ ์ ์๋๋ก ๊ถํ ์ค์ , ์ฅ์ ์ค ๋ก๊ทธ๊ฐ ์ฌ๋ผ์ง์ง ์๋๋ก ๋ณด์กด ๊ธฐ๊ฐ ๊ด๋ฆฌ, Debezium ๋ฑ์ ๋๊ตฌ ์คํ ๋ฐ ๊ด๋ฆฌ, ๋ณ๊ฒฝ ๋ฐ์ดํฐ๋ฅผ ES์ ์ ํฉํ ํํ๋ก ๋ณํ, ๊ธฐ์กด DB ๋ฐ์ดํฐ๋ก๋ถํฐ ๋๊ธฐํํ๊ธฐ ์ํ ์ ์ฐจ, CDC ์ค๋จ ํ ์ฝ๋ ์์น๋ถํฐ ๋ค์ ์ฒ๋ฆฌํ๋ ์ฅ์ ๋ณต๊ตฌ ๋ฑ์ด ์๋ค.
| ์ฅ์ | • DB ๋ก๊ทธ๋ฅผ ์ง์ ์ฝ์ด ์ฒ๋ฆฌํ๋ฏ๋ก ์ฝ๋ ๋ณต์ก๋๊ฐ ๋ฎ์์ง๋ค. • DB ๋ณ๊ฒฝ ์ฌํญ์ ๊ฑฐ์ ์ค์๊ฐ์ผ๋ก ๊ฐ์งํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ DB์ ์ถ๊ฐ์ ์ธ ์ฟผ๋ฆฌ ๋ถํ๋ฅผ ์ฃผ์ง ์๋๋ค. • ํธ๋์ญ์ ๋ก๊ทธ๋ฅผ ๊ธฐ๋ฐ๋ฅ๋ก ๋์ํ๋ฏ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปค๋ฐ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ฝ ์์ด ์์ ํ๊ฒ ์บก์ฒ๋๋ค. |
| ๋จ์ | • Debezium, Kafka Connect ๋ฑ ๋ณ๋์ CDC ์๋ฃจ์
์ ๊ตฌ์ถํ๊ณ ๋ชจ๋ํฐ๋งํด์ผ ํ๋ฏ๋ก ์ด๊ธฐ ๋์
๋ฐ ์ด์ ๋น์ฉ์ด ํฐ ํธ์ด๋ค. • ๋ฐ์ดํฐ๋ฒ ์ด์ค์ Binlog ํ์ฑํ ๋ฑ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ๋ฐ ์ ์ฝ์ด ์๋ค. • ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ ์ฅ์ , ์คํ์ ๊ด๋ฆฌ, ๋คํธ์ํฌ ๋จ์ ์ ๋ณต๊ตฌ ๋ฑ ๋ถ์ฐ ์์คํ ์์ค์ ํธ๋ฌ๋ธ ์ํ ์ง์์ ์์์ผํ๋ค. |
| ๊ฒฐ๋ก | • ์์๋ฐ์ค ํจํด๊ณผ ๊ฒฐํฉํ๋ฉด ๊ฐ์ฅ ์ด์์ ์ธ ์คํธ๋ฆฌ๋ฐํ ์ ์๋ ํ๋์ ์ธ ํ์ค ์ํคํ
์ณ์ด๋ค. • ๊ทธ๋ฌ๋ ๊ตฌ์ถ๊ณผ ์ด์ ๋์ด๋๊ฐ ๋๊ธฐ ๋๋ฌธ์ ํธ๋ํฝ์ด ๋ง๊ณ ๋ฐ์ดํฐ ์ค์๊ฐ ๋๊ธฐํ๋ ์ด๋ฒคํธ ์ ์ค ๋ฐฉ์ง๊ฐ ํ์์ ์ธ ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์ ์ ํฉํ๋ค. |
Q. Kafka + OutBox / CDC + OutBox ์ด๋ ๊ฒ ๋ฐ๋ก๋ฐ๋ก ์ฌ์ฉํด์ผ ํ๋ ๊ฑด๊ฐ?
A. (์ด ๋ด์ฉ์ ํ์คํ์ง ์๋ค) ์๋๋ค. ์ค์ ๊ธฐ์ ๋ค์ OutBox + Kafka + CDC ์ธ ๊ฐ์ง๋ฅผ ํ๋์ ์์ ํ ํ์ดํ๋ผ์ธ์ผ๋ก ํฉ์ ์ ์ฌ์ฉํ๋ค. ๋ํ์ ์ผ๋ก ์ฟ ํก, ๋ฐฐ๋ฌ์ ๋ฏผ์กฑ, ๋น๊ทผ๋ง์ผ์ด ์ธ๊ฐ์ง ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ค.
์๋ก ์ฟ ํก์ ์ฐพ์๋ณด๋ฉด, ํ๋ฃจ ์์ฒ๋ง ๊ฑด์ ์ฃผ๋ฌธ ํธ๋์ญ์ ์ด ๋ฐ์ํ๋ ์ํฉ์์ ๋ฉ์ธ DB์ ์ฃผ๋ ๋ถ๋ด์ ์ต์ํํ๋ฉฐ ์ด๋ฒคํธ ์ ์ค์ 0%๋ก ๋ง๋ค๊ธฐ ์ํด ํด๋น ์กฐํฉ์ ํต์ฌ ์ํคํ ์ฒ๋ก ์ฌ์ฉํ๋ค.
Kafka + Outbox๋ ํ ์ค์์ ์ฌ์ฉํ๊ณ ์๋ค. ๊ธ์ต ๋ฐ์ดํฐ์ ํน์ฑ์ ๋งค์ฐ ์๊ฒฉํ ์ ํฉ์ฑ์ด ํ์ํ์ฌ Outbox ํจํด์ ์ ๊ทน ํ์ฉํ๋ค. CDC์ DB ๋ก๊ทธ ์์กด์ฑ์ด๋ ์คํค๋ง ๋ณ๊ฒฝ ์ํ์ ํผํ๊ณ ๋น์ฆ๋์ค ์ ์ด๋ฅผ ๋ช ํํ ํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ์ ํด๋ฌ๋ ๋ฉ์์ง Relay ํ๋ก์ธ์ค๋ฅผ ๋์ด Kafka๋ก ์ด๋ฒคํธ๋ฅผ ์์ ํ๊ฒ ๋๊ธฐ๋ ํํ๋ฅผ ์ ํธํ๋ค.
OutBox ์์ด Kafka + CDC ์กฐํฉ๋ ์๋ค. ์ด๋ ์ฃผ๋ก ๋จ์ํ DB ๋ณ๊ฒฝ์ฌํญ ์คํธ๋ฆฌ๋ฐ์ธ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค. ๊ธฐ์กด ๋ฉ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ ์์ฒด์ ๋ฐ์ํ๋ CUD(์์ฑ, ์์ , ์ญ์ )๋ฅผ CDC๊ฐ ์ง์ ๊ฐ์งํ์ฌ Kafka์ ๋ณด๋ธ๋ค.
3. Transactional Outbox Pattern
- ์์๋๋ฉด ์ข์ ๊ฐ๋
Q. Polling์ด๋?
A. ์์๋ฐ์ค ํ ์ด๋ธ์ ์์ธ ์ด๋ฒคํธ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์กฐํํ๋ ๊ฒ์ Polliong์ด๋ผ๊ณ ํ๋ค. ์ปดํจํฐ ๊ณผํ๊ณผ ๋คํธ์ํฌ์์ ํด๋ง์ ์ด๋ค ์ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์๋์ง ํ์ธํ๊ธฐ ์ํด ์ฃผ๊ธฐ์ ์ผ๋ก ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ์์ด๋ผ๊ณ ๋ ํ๋ค.
๋ณดํต์ Transactional Outbox Pattern์ Kafka ๊ฐ์ ๋ฉ์์ง ๋ธ๋ก์ปค์ ํจ๊ป ์ฌ์ฉํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์๋ฐ์ค ํ ์ด๋ธ์ ์์ธ ์ด๋ฒคํธ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์กฐํํ์ฌ ๋ฉ์์ง ๋ธ๋ก์ปค๋ก ์ ์กํ๋ ๋ฐฉ์์ ํด๋ง์ด๋ผ๊ณ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค. ๋ฌผ๋ก ์ ํํ ๋ช ์นญ์ Polling Publishing์ธ ๊ฒ ๊ฐ๋ค. Publishing์ ์กฐํํด ์จ ๋ฐ์ดํฐ๋ฅผ Kafka ๊ฐ์ ๋ฉ์์ง ๋ธ๋ก์ปค์ ์๊ฑฐ๋ ๋ค๋ฅธ ์์คํ ์ ์ ๋ฌํ๋ ํ์๋ผ๊ณ ํ๋ค.
- Outbox
Outbox๋ ์์ ๋ชฉ๋ก์ ๊ธฐ๋กํ๋ ๊ฒ์ด๋ค. ๊ณ ๊ฐ ์ ๋ณด๋ฅผ MySQL์ ์ ์ฅํ ๋ ๋์ค์ ES๋ก ๋ณด๋ด์ผ ํ ์์ ๋ MySQL์ ํจ๊ป ์ ์ฅํ๋ค. ๋ง์ฝ ๋ฌธ์ ๊ฐ ์๊ฒจ์ ES์ ์์ ์ฒ๋ฆฌ๊ฐ ์ ๋๋ก ์ด๋ค์ง์ง ์๋๋ผ๋ ES์ ๋ณด๋ด์ผ ํ ์์ ์ ์ ์ฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฒ๋ฆฌํ์ง ๋ชปํ ์์ ๋ถํฐ ์ฒ๋ฆฌํ๋ฉด ๋๋ค. - ๊ธฐ์กด vs ๊ฐ์
๊ธฐ์กด ๋ฐฉ์ : MySQL ์ ์ฅ - ES ์ง์ ์ ์ฅ - DB ์ปค๋ฐ
๊ฐ์ ๋ฐฉ์ : MySQL ์ ์ฅ + Outbox ๊ธฐ๋ก - ํ๋์ MySQL ํธ๋์ญ์ ์ผ๋ก ์ปค๋ฐ - ์ค์ผ์ค๋ฌ๊ฐ ๋ฏธ์ฒ๋ฆฌ ์์ ํ์ธ - ES ๋ฐ์ ํ ์๋ฃ
๊ณ ๊ฐ์ ๋ฑ๋กํ๋ ์์ ์ ES์ ๋ฐ์ํด์ผ ํ๋ค๋ ์ฌ์ค์ ๊ธฐ๋กํ๊ณ ์ค์ ES ์ ์ฅ์ ๋ณ๋์ ์ฒ๋ฆฌ๊ธฐ๊ฐ ๋ด๋นํ๋๋ก ๊ฐ์ ํ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด ES์ ๋ฌธ์ ๊ฐ ๋ฐ์ํด๋ ๊ณ ๊ฐ ๋ฐ์ดํฐ์ ์์ ๊ธฐ๋ก์ MySQL์ ๋จ๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ๋ฐ๋์ ์ค์ํ ์ ์, ๊ณ ๊ฐ ์ ์ฅ๊ณผ Outbox ๊ธฐ๋ก์ด ๊ฐ์ ํธ๋์ญ์ ๋ด์์ ์ ์ฅ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ ๊ทธ๋ด๊น? ๋๋ฌด ๋น์ฐํ ์ด์ผ๊ธฐ๊ฒ ์ง๋ง, ๊ฐ์ ๊ณต๊ฐ์ ์์ผ๋ฉด ๊ฐ์๊ธฐ ์๋ฒ๊ฐ ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ MySQL์๋ ๊ณ ๊ฐ์ด ์กด์ฌํ๊ณ Outbox๋ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์์ผ๋ ์์ ์ด ์ด๋ป๊ฒ ๋์๋์ง ์ ์ ์๊ฒ ๋๋ค. ๋ค๋ฅธ ํธ๋์ญ์ ์ ์์ผ๋ฉด ์ด๋ ๊ฒ ๊ฐ์ ํ๋ ์๋ฏธ๊ฐ ์ฌ๋ผ์ง๋ค. - ์ ์ฒด ํ๋ฆ
๊ด๋ฆฌ์๊ฐ ID 20์ธ ๊ณ ๊ฐ์ ์ด๋ฆ์ ํ๊ธธ๋์์ ์ฒญ๊ธธ๋์ผ๋ก ๋ณ๊ฒฝํ๋ค๊ณ ๊ฐ์ ํ์.
1) ๊ด๋ฆฌ์๊ฐ ๊ณ ๊ฐ ์ด๋ฆ์ ๋ณ๊ฒฝ (ํ๊ธธ๋ →์ฒญ๊ธธ๋)
2) MySQL ํธ๋์ญ์
2-1) ๊ณ ๊ฐ ์ด๋ฆ์ ์ฒญ๊ธธ๋์ผ๋ก ์์
2-2) Outbox์ ์์ ์ถ๊ฐ
2-3) ๋ ๋ณ๊ฒฝ์ ํจ๊ป COMMIT
3) ์ค์ผ์ค๋ฌ ์คํ (์ฒ๋ฆฌ ๊ฐ๋ฅํ Outbox ์กฐํ)
4) ๊ณ ๊ฐ ID 20์ ํ์ฌ DB ์ํ ํ์ธ (ํ์ฌ ์ด๋ฆ์ ์ฒญ๊ธธ๋)
5) Elasticsearch์ ์ฒญ๊ธธ๋ ๋ฐ์
6) Outbox ์์ ์๋ฃ (status = DONE)
Q. ์ด์ ์ฌ๊ธฐ์ ES ์๋ฒ์ ์ค๋จ๋์ด ์ ์ฅ์ ์คํจํ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
A. Outbox์๋ ์คํจํ ์์ ์ ์ง์ฐ์ง ์๊ณ ๊ทธ๋๋ก ๋ณด๊ดํ๊ฒ ๋๋ค. ์๋ฅผ ๋ค์ด ์ํ์ RETRY๋ผ๊ณ ์ ํ์์ ๊ฒ์ด๋ค. ES ์๋ฒ๊ฐ ๋ค์ ์ ์ํ๋๋ฉด ์ค์ผ์ค๋ฌ๊ฐ ์์ ์ ๊ฐ์ ธ์ ๋ค์ ์ฒ๋ฆฌํ๋ฉด ๋๋ค. ์ฅ์ ๊ฐ ๋ณต๊ตฌ๋๋ฉด ์๋์ผ๋ก DB์ ES๊ฐ ์ผ์นํ๋๋ก ๋ง๋ ๊ฒ์ด๋ค.
- ์์ธ ์ํฉ
Outbox๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ ๋ชจ๋ ๊ฒ์ด ๋ค ํด๊ฒฐ๋ ๊ฒ์ ์๋๋ค. ๋ ์์ ์ ์ด๊ธฐ ์ํด ๊ณ ๋ คํด์ผ ํ ๋ถ๋ถ๋ค์ด ์๋ค.
์ฒซ ๋ฒ์งธ๋ ๊ณ ๊ฐ ID๋ฅผ ES ๋ฌธ์ ID๋ก ์ฌ์ฉํด์ผ ํ๋ค. ES ์ ์ฅ๊น์ง ์ฑ๊ณตํ๋๋ฐ Outbox์ DONE ์ํ๋ฅผ ์ ์ฅํ๊ธฐ ์ ์ ์๋ฒ๊ฐ ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ Outbox๋ ์ฌ์ ํ ๋ฏธ์๋ฃ ์ํ๊ฐ ๋๋ค. ๊ทธ๋ฌ๋ฉด ES๋ ๊ณ ๊ฐ์ ๋ ๋ฒ ์ ์ฅํ๊ฒ ๋๋๋ฐ ์ด๋ ID๋ก ์ฌ์ฉํ๊ฒ ํด์ ๊ธฐ์กด ๋ฌธ์๋ฅผ ๋ฎ์ด์ฐ๋๋ก ํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ์กฐ๊ฑด์ ๊ฐ์ ID์ ์ ์ฅํ๋ ๋ฐ์ดํฐ๋ ์ฌ๋ฐ๋ฅธ ์ต์ ๋ฐ์ดํฐ์ฌ์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ ์ฅํ๋ค๋ฉด ์ค๋ณต ๋ฌธ์๋ ์๊ธฐ์ง ์๋๋ผ๋ ์ต์ ๋ฐ์ดํฐ๊ฐ ๋ฎ์ด์จ์ง ์ ์๋ค.
๋ ๋ฒ์งธ๋ ์ฒ๋ฆฌ ์์ ์ MySQL์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋๋ก ํด์ผ ํ๋ค. ์ด ์ด์ ๋ ์์ ๋ฌธ์ ์ ์๋ค. ์ฌ์๋๋ฅผ ํ๋ ๊ฒฝ์ฐ ์ค๋๋ ์ ๋ณด๋ฅผ ๋ฎ์ด์จ์ง ์ ์๋ค. ๊ทธ๋์ ์ฒ๋ฆฌ ์์ ์ ID 20์ธ ๊ณ ๊ฐ์ ์ด๋ฆ์ ์กฐํํ๋๋ก ํด์ผํ๋ค. ๊ทธ๋ฌ๋ฉด ๊ณ ๊ฐ์ ์ต์ ๋ฐ์ดํฐ๊ฐ ์ ๋๋ก ์ ์ง๊ฐ ๋๋ ๊ฑธ๊น?
์ธ ๋ฒ์งธ๋ ์์ ์๋ฅผ ํ๋ ์ถ๊ฐํ๋ค. ์๋ฅผ ๋ค์ด์ ๋ ์์ ์๊ฐ ๋์์ ์คํ๋๊ณ B๊ฐ ๋จผ์ ES์ ์ ์ฅํ ๋ค A๊ฐ ๋ค๋ฆ๊ฒ ์ ์ฅํ๋ค๋ฉด, ๋ง์ง๋ง์๋ ์ค๋๋ ์ด๋ฆ์ด ๋จ์ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ๋์์ฑ ๋ฌธ์ ๋ผ๊ณ ํ๋ค. ์ด ๋์์ฑ ๋ฌธ์ ๊ฐ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๋ฎ์ด์ธ ์ ์๋ค. DB์์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์กฐํํ๋ค๋ ๊ฒ๊ณผ ES ์ฐ๊ธฐ ์์๋ฅผ ๋ณด์ฅํ๋ค๋ ๊ฒ์ ์๋ก ๋ค๋ฅธ ๋ฌธ์ ๋ค. ๊ทธ๋์ ์์ ์๋ฅผ ํ๋๋ง ์ถ๊ฐํ๋ ๊ฒ์ด๋ค. ์์ ์๊ฐ ํ๋๋ฉด ES์ ์ฐ๊ธฐ ์์ ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ฌ์์ง๋ค. ์์ A๊ฐ ๋๋ ํ์ ์์ B๋ฅผ ์คํํ๋๋ก ๊ตฌ์ฑํ ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ฌ ์์ ์๊ฐ ES์ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๋์์ ์ ์ฅํ๋ฉด์ ๋ฐ์ํ๋ ์์ ์ถฉ๋์ ์ค์ผ ์ ์๋ค.
๋ค๋ง ์ค์ํ ์กฐ๊ฑด๋ค์ด ์๋ค. ๋ค๋ฅธ ์๋น์ค๋ API์์ ES์ ์ง์ ์ฐ๋ฉด ์ ๋๋ค. ์ค์ผ์ค๋ฌ ์คํ์ด ์ค์ฒฉ๋์ง ์์์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ์์ ์ ์คํจ์ ์ฌ์๋ ์ฒ๋ฆฌ ์์๋ ๊ณ ๋ คํด์ผ ํ๋ค. ๊ทธ๋์ ํ์ฌ ๊ณ ๊ฐ ES ๋ณ๊ฒฝ ๊ฒฝ๋ก๋ฅผ Outbox ์ฒ๋ฆฌ๊ธฐ๋ก ํต์ผํ๋ ๋ฐฉ์์ ์ด์ ์ด๋ค. ๋ฌผ๋ก ์์ ์๊ฐ ํ๋์ฌ๋ ์์ฃผ ์๋ฒฝํ๊ฒ ๋ฌธ์ ๋ฅผ ๋ง๋ ๊ฒ์ ์๋๋ค.
๋ค ๋ฒ์งธ๋ Elasticsearch์ ์ธ๋ถ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ํ๊ธธ๋์ด ์ฒญ๊ธธ๋์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ฒ์ 2, ์ฒญ๊ธธ๋์์ ํ๊ธธ๋์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋ฒ์ 3์ด๋ผ๊ณ ๊ฐ์ ํ์. ๋ฒ์ 3์ด ๋จผ์ ES์ ์ ์ฅ๋๊ณ ๋ค๋ฆ๊ฒ ๋ฒ์ 2๊ฐ ES์ ์ ์ฅ๋๋ค๋ฉด ๋ฒ์ ๊ฒ์ฆ์ ํตํด ํ์ฌ ์ ์ฅ๋ ๋ฒ์ ๋ณด๋ค ์ค๋๋ ๋ณ๊ฒฝ์ ์ ์ฅ๋์ง ์๋๋ค. (๋ ๋ค๋ฅธ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๋ฒ์ ์ ํตํด ํด๊ฒฐํ ์ ์๋ค)
์ฌ๊ธฐ์ ์ค์ํ ์ ์ JPA์ @Version๊ณผ ES์ ์ธ๋ถ ๋ฒ์ ์ ์ด๊ฐ ์๋์ผ๋ก ์ฐ๊ฒฐ๋๋ ๊ฒ์ด ์๋๋ผ๋ ์ฌ์ค์ด๋ค. JPA์ ๋ฒ์ ์ DB์์ ๋ฐ์ํ๋ ๋์ ์์ ์ถฉ๋์ ๊ฐ์งํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ES์๋ ๋ฒ์ ์ ์ ์ฉํ๋ ค๋ฉด ์ ์ฅ ์์ฒญ์ ํด๋น ๋ฒํธ๋ฅผ ์ ๋ฌํด์ผ ํ๋ค.
๋ค์ฏ ๋ฒ์งธ๋ ์ญ์ ํ์(Tombstone)์ ๋จ๊ธฐ๋ ๊ฒ์ด๋ค. ์ด ๋ถ๋ถ์ ์ธ๋ถ ๋ฒ์ ๊ด๋ฆฌ์ ์ฐ๊ฒฐ๋๋ค. ๊ณ ๊ฐ ID 20์ ๋ฒ์ 3 ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ์ํฉ์์ ํด๋น ๊ณ ๊ฐ์ ์ญ์ ํ์ฌ ๋ฒ์ 4๊ฐ ๋์๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋ฐ๋ฐ ES์์ ๊ณ ๊ฐ์ ์ญ์ ํ ํ ์ค๋๋ ๋ฒ์ 3์ ์์ ์์ ์ด ๋ค๋ฆ๊ฒ ์คํ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ES๋ ์ญ์ ๋ ๋ฌธ์์ ๋ฒ์ ์ ๋ณด๋ฅผ ์๊ตฌ์ ์ผ๋ก ๋ณด๊ดํ์ง ์๋๋ค. ๋ฐ๋ผ์ ๊ณผ๊ฑฐ ์์ ์ด ์ญ์ ๋ ๊ณ ๊ฐ์ ๋ค์ ์์ฑํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ณ ๊ฐ์ด ์ญ์ ๋์๋ค๋ ์ฌ์ค๊ณผ ์ญ์ ๋น์์ ๋ฒ์ ๋ฒํธ๋ฅผ ๊ธฐ๋กํด์ผ ํ๋ค. ๋ฌผ๋ก ํ์์ ์ ์ฅํ๋ ๊ฒ๋ง์ผ๋ก ํด๊ฒฐ๋๋ ๊ฒ์ ์๋๋ค. ๋๊ธฐํ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์ญ์ ๊ธฐ๋ก์ ํ์ธํ๊ณ ์ค๋๋ ์์ ์ ๊ฑฐ๋ถํ ์ ์๋๋ก ๊ตฌ์ฑํด์ผ ํ๋ค.
์ฌ์ฏ ๋ฒ์งธ๋ ์คํจํ ์์ ์ ๊ด๋ฆฌํ๊ณ ์ฌ์๋ํ๋ ๊ฒ์ด๋ค. PENDING(์์ง ์๋ฃํ์ง ์์ ์์ ), DONE(์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋ ์์ ), FALIED(์ฌ์๋ ํ๋์ ๋๋ฌ ํน์ ๋ณ๋ ์กฐ์น๊ฐ ํ์ํ ์์ ) ์ด๋ ๊ฒ ์ธ์๊ธฐ๋ก ์์ ์ํ๋ฅผ ๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ ์ ๋ฐฑ์คํ(Backoff)๋ค. ์คํจ๊ฐ ๋ฐ๋ณต๋ ์๋ก ์ฌ์๋ ๊ฐ๊ฒฉ์ด ๋๋ ค ์ฅ์ ๊ฐ ๋ฐ์ํ ์๋ฒ์ ๋ถํ์ํ ์์ฒญ์ด ๊ณ์ ์ ๋ฌ๋์ง ์๋๋ก ํ๋ ๋ฐฉ์์ด๋ค.
- ๋ฐ์ดํฐ ์ ํฉ์ฑ ๋ณดํธ
Outbox๋ ๊ณ ๊ฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋๊ธฐํ ์์ ์ ํจ๊ป ๊ธฐ๋กํ๋ ๋ฐฉ์์ด๋ผ๊ณ ์ค๋ช ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ฐ๋ฐ์๊ฐ MySQL์ ์ง์ SQL์ ์คํํด์ ๊ณ ๊ฐ ์ ๋ณด๋ฅผ ์์ ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋๋ ๊ฑธ๊น? CustomerService๋ฅผ ๊ฑฐ์น์ง ์์๊ธฐ ๋๋ฌธ์ Outbox ์์ ์ด ์์ฑ๋์ง ์์ ์ ์๋ค. ๋ํ ES์ ์ธ๋ฑ์ค๊ฐ ์์๋๊ฑฐ๋ ์ผ๋ถ ๋ฌธ์๊ฐ ์ฌ๋ผ์ง๋ค๋ฉด Outbox์๋ ๋ณต๊ตฌํด์ผ ํ ์์ ์ด ๋จ์ ์์ง ์์ ์๋ ์๋ค.
๊ทธ๋์ ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ํด ์ ๊ธฐ์ ์ธ ์ ํฉ์ฑ ์ ๊ฒ์ ์ถ๊ฐํด์ผ ํ๋ค. MySQL๊ณผ ES์ ์ ์ฅ๋ ๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๋น๊ตํ๋ค. ์ด๋ ๋จ์ํ ์ ์ฒด ๊ณ ๊ฐ ์๋ง ๋น๊ตํด์๋ ์ ๋๋ค. ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ ๊ณ ๊ฐ ID์ ๊ฒ์์ ์ฌ์ฉํ๋ ํ๋๋ฅผ ๋น๊ตํ๊ณ ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด MySQL์ ๊ธฐ์ค์ผ๋ก ๋ณต๊ตฌํด์ผ ํ๋ค.
๋ค์์ ์ ์ฒด ์ฌ๊ตฌ์ถ์ ํ ์ ์๋๋ก ํด์ผํ๋ค. ์ ๊ธฐ์ ์ธ ์ ํฉ์ฑ ์ ๊ฒ์ ์ผ๋ถ ๋ฐ์ดํฐ๊ฐ ์๋ชป๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค. ํ์ง๋ง ES ์ธ๋ฑ์ค ์ ์ฒด๊ฐ ์์๋๊ฑฐ๋ ๊ฒ์ ์ค์ ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์๋ก์ด ์ธ๋ฑ์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ๋ ์ ์ ํ ๊ฒ์ด๋ค. ์ด๋ Alias๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค. Alias๋ ES ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์นญ์ด๋ค. ์ค์ ์ธ๋ฑ์ค ์ด๋ฆ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๊ฐ์ Alias๋ฅผ ์ด์ฉํด ๊ฒ์ํ ์ ์๋ค. ๋ค๋ง ์๋ก์ด ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ ๋๋ ๊ธฐ์กด ํ๋ ๋งคํ๊ณผ nori ๊ฐ์ ํ๊ตญ์ด ๋ถ์๊ธฐ ์ค์ ์ ๊ณ ๋ คํด์ผ ํ๋ค. - ๋จ์
์ด๋ ๊ฒ ์ค์ ํ Outbox๋ ์๋ฒฝํ ๊ฑธ๊น? ๋ฌผ๋ก ์๋๋ค. ์ค์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค๋ฉด ์ด๋ณด๋ค ๋ ๋ง์ ๋ฌธ์ ๋ค์ ๊ณ ๋ คํด์ผ ํ๋ค.
๋จผ์ ์ฒซ ๋ฒ์งธ๋ก ๋ฐ์ดํฐ๊ฐ ์ฆ์ ์ผ์นํ์ง ์๋๋ค๋ ์ ์ด ์๋ค. ํ์ฌ ๋ฐฉ์์ ์ต์ข ์ผ๊ด์ฑ์ด๋ผ๊ณ ํ๋ค. ๋ ์ ์ฅ์๊ฐ ํญ์ ๋์์ ์ผ์นํ๋ ๊ฒ์ ์๋์ง๋ง ์ ์์ ์ธ ๋๊ธฐํ์ ์ฅ์ ๋ณต๊ตฌ๋ฅผ ํตํด ์ต์ข ์ ์ผ๋ก ๊ฐ์ ์ํ๊ฐ ๋๋๋ก ํ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๊ณ ๊ฐ ์์ ์งํ ๊ฒ์ํ๋ฉด ์ด์ ๋ฐ์ดํฐ๊ฐ ๋ํ๋ ์ ์๋ค.
๋ ๋ฒ์งธ๋ ๊ตฌํ ๋ณต์ก๋์ DB ๋ถํ๊ฐ ์ฆ๊ฐํ๋ค๋ ๊ฒ์ด๋ค. ๊ธฐ์กด์๋ MySQL๊ณผ ES์ ์ง์ ์ ์ฅํ๋ฉด ๋์ง๋ง ์ด์ ๋ Outbox ํ ์ด๋ธ, ์ฒ๋ฆฌ๊ธฐ, ์ฌ์๋, ์์ ์ํ, ๋ฒ์ ๋ฑ ๋ณ๋๋ก ๊ด๋ฆฌํด์ผ ํ๋ค. ๊ณ ๊ฐ์ ์์ ํ ๋๋ง๋ค Outbox์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ผ ํ๋ฉฐ ์ค์ผ์ค๋ฌ๊ฐ ์ง์์ ์ผ๋ก ์์ ์ ์กฐํํ๊ธฐ ๋๋ฌธ์ MySQL์ ์ถ๊ฐ์ ์ธ ๋ถํ๊ฐ ๋ฐ์ํ๋ค.
์ธ ๋ฒ์งธ๋ ์์ ์ด ์ค๋ณต ์คํ๋ ์ ์๋ค๋ ์ ์ด๋ค. ES ์ ์ฅ์ด ์ฑ๊ณตํ ๋ค Outbox์ ์๋ฃ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ ์ ์๋ฒ๊ฐ ์ข ๋ฃ๋๋ฉด ๊ฐ์ ์์ ์ด ๋ค์ ์คํ๋ ์ ์๋ค. ๋ฐ๋ผ์ ๊ณ ๊ฐ ID์ ๋ฒ์ ๊ด๋ฆฌ ๋ฑ์ ์ด์ฉํด ์ค๋ณต ์คํ์ด ๋ฐ์ํ๋๋ผ๋ ์ฌ๋ฐ๋ฅธ ์ต์ข ์ํ๋ฅผ ์ ์งํด์ผ ํ๋ค.
๋ค ๋ฒ์งธ๋ ๋ชจ๋ ์ฅ์ ๋ฅผ ์๋์ผ๋ก ๋ณต๊ตฌํ์ง ๋ชปํ๋ค๋ ์ ์ด๋ค. ES ์ฐ๊ฒฐ ์ฅ์ ์ฒ๋ผ ์ผ์์ ์ธ ๋ฌธ์ ๋ ์ฌ์๋๋ก ํด๊ฒฐํ ์ ์์ง๋ง ๋งคํ ์ค๋ฅ์ฒ๋ผ ์ค์ ์ ์์ ํด์ผ ํ๋ ๋ฌธ์ ๋ ์๋ ์ฌ์๋๋ง์ผ๋ก ํด๊ฒฐ๋์ง ์๋๋ค. ๋ฐ๋ผ์ ์คํจ ์์ ์ ํ์ธํ๊ณ ๋ค์ ์ฒ๋ฆฌํ ์ ์๋ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ด ํ์ํ๋ค.
๋ค์ฏ ๋ฒ์งธ๋ Outbox ๊ธฐ๋ก์ด ๊ณ์ ์์ธ๋ค๋ ์ ์ด๋ค. ๊ณ ๊ฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋๋ง๋ค ์์ ์ ๊ธฐ๋กํ๋ฏ๋ก ์๊ฐ์ด ์ง๋ ์๋ก ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ฆ๊ฐํ๋ค. ์ผ์ ๊ธฐ๊ฐ์ด ์ง๋ ์๋ฃ ์์ ์ ์ ๋ฆฌํ๋ ์ ์ฑ ์ด ํ์ํ์ง๋ง, ์์ง ์ฒ๋ฆฌํ์ง ์์ ์์ ์ด๋ ์ญ์ ๋ฒ์ ๋ณดํธ์ ํ์ํ ๊ธฐ๋ก์ ๋ฌด์์ ์ญ์ ํด์๋ ์๋๋ค. - ๊ฒฐ๋ก
Outbox๋ ๋ฐ์ดํฐ ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ์๋ฒฝํ๊ฒ ์์ ์ง ๋ชปํ๋ค. ๋์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌ์ค์ ์์ ํ๊ฒ ๋ณด๊ดํ๊ณ ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ฅผ ๋ณต๊ตฌํ ์ ์๋๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค. ํ์ฌ ํ๋ก์ ํธ๋ ์ฌ์ฉ์ ๊ท๋ชจ๊ฐ ํฌ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ์์ง ๋ธ๋ก์ปค๋ CDC ์์คํ ๋ณด๋ค ํด๋น ๋ฐฉ๋ฒ์ ์ ํํ ๊ฒ์ด๋ค. ๋ง์ฝ ํ๋ก์ ํธ๊ฐ ๋ ๋ฐฉ๋ํ๊ณ ์ฒ๋ฆฌํด์ผ ํ ๋ฐ์ดํฐ ๊ท๋ชจ๊ฐ ํฌ๋ค๋ฉด ์ด ๋ฐฉ๋ฒ๋ณด๋ค ๋ฉ์์ง ๋ธ๋ก์ปค, CDC ์์คํ ์ ํ์ฉํ๋ ๊ฒ ๋ ์๋ง์ ๊ฒ์ด๋ค.