๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ํ”„๋กœ์ ํŠธ/๐Ÿ‘‘ VIP ์ดˆ๋Œ€์žฅ ๐Ÿ’Œ

[Spring] ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถ”๊ธฐ ์œ„ํ•ด Outbox๋กœ ์ˆ˜์ •ํ•ด๋ณด์ž. + CDC, Kafka ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

by hyeong._.ing 2026. 10. 27.

 

ํ˜„์žฌ ์ฝ”๋“œ์—๋Š” ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
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 ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒŒ ๋” ์•Œ๋งž์„ ๊ฒƒ์ด๋‹ค.