Skip to content
@Woori-compensaTX

Woori-compensaTX

CompensaTX โ€“ ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ๊ธฐ๋ฐ˜ ๋ถ„์‚ฐ ํ™˜์ „ ์‹œ์Šคํ…œ

์†Œ๊ฐœ

CompensaTX๋Š” ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ์›ํ™”/์™ธํ™” ๊ณ„์ขŒ ์‹œ์Šคํ…œ(๊ฐ๊ธฐ ๋‹ค๋ฅธ DB, ์„œ๋ฒ„) ํ™˜๊ฒฝ์—์„œ
์•ˆ์ „ํ•˜๊ณ  ๊ฐ•์ธํ•˜๊ฒŒ ํ™˜์ „ยท์ด์ฒด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Saga(๋ณด์ƒ ํŠธ๋žœ์žญ์…˜) ํŒจํ„ด ๊ธฐ๋ฐ˜ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

  • ์žฅ์• /๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ์—๋„ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅ
  • ์ž๋™ ๋ณต๊ตฌ ๋ฐ ์ˆ˜๋™ ๊ฐœ์ž… ๋ชจ๋‘ ์ง€์›
  • ์‹ค์ œ ํ† ์Šค๋ฑ…ํฌ์˜ ๋ถ„์‚ฐ ํ™˜์ „ ๊ตฌ์กฐ๋ฅผ ๋ฒค์น˜๋งˆํ‚นํ•˜์—ฌ ์„ค๊ณ„

๐Ÿ‘ฅ ํŒ€์› ์†Œ๊ฐœ

๊ณ ํƒœ์šฐ ์ด์ œํ˜„ ์ด์šฉํ›ˆ ์žฅ์†กํ•˜
@kohtaewoo @lyjh98 @dldydgns @songhajang
Kafka consumer ์™ธํ™”(OEHWA) ๊ณ„์ขŒ API ์„œ๋ฒ„ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ API ์„œ๋ฒ„ ํ”„๋ก ํŠธ์—”๋“œ UI
์›ํ™”(KRW) ๊ณ„์ขŒ API ์„œ๋ฒ„

๐Ÿ“‚ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๊ตฌ์กฐ

๋ ˆํฌ ์„ค๋ช… ๋งํฌ
compensaTX-BE Backend API ์„œ๋ฒ„ (์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜, ํŠธ๋žœ์žญ์…˜ ํ๋ฆ„ ์ œ์–ด) ๐Ÿ”— ๋ฐ”๋กœ๊ฐ€๊ธฐ
compensaTX-FE Frontend (Vue.js ๊ธฐ๋ฐ˜ UI) ๐Ÿ”— ๋ฐ”๋กœ๊ฐ€๊ธฐ
compensaTX-api-krw ์›ํ™”(KRW) ๊ณ„์ขŒ API ์„œ๋ฒ„ (Oracle ๊ธฐ๋ฐ˜) ๐Ÿ”— ๋ฐ”๋กœ๊ฐ€๊ธฐ
compensaTX-api-oehwa ์™ธํ™”(OEHW) ๊ณ„์ขŒ API ์„œ๋ฒ„ (MySQL ๊ธฐ๋ฐ˜) ๐Ÿ”— ๋ฐ”๋กœ๊ฐ€๊ธฐ
compensaTX-consumer-krw ์›ํ™”(KRW) Kafka ์ปจ์Šˆ๋จธ (๊ณ ๊ฐ€์šฉ์„ฑ ์ธ์Šคํ„ด์Šค 2๊ฐœ) ๐Ÿ”— ๋ฐ”๋กœ๊ฐ€๊ธฐ
compensaTX-consumer-oehwa ์™ธํ™”(OEHW) Kafka ์ปจ์Šˆ๋จธ (๊ณ ๊ฐ€์šฉ์„ฑ ์ธ์Šคํ„ด์Šค 2๊ฐœ) ๐Ÿ”— ๋ฐ”๋กœ๊ฐ€๊ธฐ
compensaTX-consumer-dlq DLQ ์ „์šฉ Kafka ์ปจ์Šˆ๋จธ (๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ์žฌ์‹œ๋„/๋ณต๊ตฌ) ๐Ÿ”— ๋ฐ”๋กœ๊ฐ€๊ธฐ
.github GitHub Actions ๋ฐ ์›Œํฌํ”Œ๋กœ ์„ค์ • ์ €์žฅ์†Œ ๐Ÿ”— ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•„ํ‚คํ…์ฒ˜

Image

ํ™˜์ „ ์š”์ฒญ ์„œ๋ฒ„ (Orchestrator)

  • ์ „์ฒด ํ™˜์ „ ์š”์ฒญ์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋™๊ธฐ ํ˜ธ์ถœ๋กœ ์›ํ™”ยท์™ธํ™” ๊ณ„์ขŒ ์„œ๋ฒ„์— ์ง์ ‘ ์—…๋ฐ์ดํŠธ ์š”์ฒญ
  • ์‹คํŒจ ์‹œ Kafka๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•ด ๋น„๋™๊ธฐ ์žฌ์‹œ๋„ ๊ฒฝ๋กœ๋กœ ์ „ํ™˜

์›ํ™”/์™ธํ™” ๊ณ„์ขŒ ์„œ๋ฒ„

  • ๊ฐ ํ†ตํ™” ๊ณ„์ขŒ๋ณ„ ์ž…์ถœ๊ธˆ ์ฒ˜๋ฆฌ์™€ DB ์—ฐ๋™
  • (์›ํ™”: Oracle, ์™ธํ™”: MySQL)

Kafka Broker

  • ์‹คํŒจํ•œ ์š”์ฒญ์„ ๋น„๋™๊ธฐ ์žฌ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค
  • ๊ฐ Consumer ๊ทธ๋ฃน(์›ํ™”, ์™ธํ™”)์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ

KRW/OEHWA Consumer

  • ์žฌ์‹œ๋„ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ DB๋ฅผ ๋‹ค์‹œ ์—…๋ฐ์ดํŠธ
  • ์ฒ˜๋ฆฌ ์‹คํŒจ ์‹œ ๋ฉ”์‹œ์ง€๋ฅผ DLQ๋กœ ์ด๋™

DLQ Consumer

  • ์žฌ์‹œ๋„์—๋„ ์‹คํŒจํ•œ ์š”์ฒญ์„ ์ตœ์ข… ๋ณด์ƒยท์ •๋ฆฌ ์ฒ˜๋ฆฌ
  • ์žฅ์•  ๋˜๋Š” ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ์ƒํ™ฉ์„ Slack์œผ๋กœ ์•Œ๋ฆผ

๐Ÿ—๏ธ ๋ถ„์‚ฐํ™˜๊ฒฝ์—์„œ์˜ ํŠธ๋žœ์žญ์…˜

๊ธฐ์กด ๋ชจ๋†€๋ฆฌ์‹ ๋ฐฉ์‹

  • ๋‹จ์ผ ์„œ๋ฒ„, ๋‹จ์ผ DB โ†’ DB ํŠธ๋žœ์žญ์…˜๋งŒ์œผ๋กœ ์›์ž์„ฑ ๋ณด์žฅ

MSA/๋ถ„์‚ฐ ํ™˜๊ฒฝ ๋ฌธ์ œ

  • ์›ํ™”/์™ธํ™” ๊ณ„์ขŒ ์„œ๋ฒ„์™€ DB๊ฐ€ ๋ถ„๋ฆฌ โ†’ ๋‹จ์ผ ํŠธ๋žœ์žญ์…˜ ์ ์šฉ ๋ถˆ๊ฐ€
  • ์ž…์ถœ๊ธˆ ์ค‘ ํ•œ์ชฝ๋งŒ ์„ฑ๊ณตํ•  ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜(์ •ํ•ฉ์„ฑ ๋ฌธ์ œ) ๋ฐœ์ƒ

๐Ÿ’ก ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋ฐฉ์‹

1. 2PC (Two-Phase Commit)

  • ์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ ๊ฐ ์„œ๋ฒ„์˜ ์ปค๋ฐ‹ ๊ฐ€๋Šฅ์—ฌ๋ถ€๋ฅผ ์งˆ์˜, ๋ชจ๋‘ OK ์‹œ ์ปค๋ฐ‹, ์•„๋‹ˆ๋ฉด ๋กค๋ฐฑ
  • ๋ฌธ์ œ์ :
    • ๋А๋ฆฐ ์ฐธ์—ฌ์ž์— ์˜ํ•ด ์ „์ฒด ์ง€์—ฐ
    • ๊ฐ€์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ ์ €ํ•˜
    • ๋‹จ์ผ ์žฅ์• ์  ์œ„ํ—˜

2. Saga(๋ณด์ƒ ํŠธ๋žœ์žญ์…˜) ํŒจํ„ด

  • ๊ฐ ์„œ๋น„์Šค๊ฐ€ ๋กœ์ปฌ ํŠธ๋žœ์žญ์…˜์„ ๊ฐœ๋ณ„ ์ปค๋ฐ‹, ์‹คํŒจ ์‹œ ์ด๋ฏธ ์ปค๋ฐ‹๋œ ๋ถ€๋ถ„์„ ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋กค๋ฐฑ
  • ์žฅ์ :
    • ๋†’์€ ํ™•์žฅ์„ฑ, ๊ฐ€์šฉ์„ฑ
    • ์ƒˆ๋กœ์šด ์„œ๋น„์Šค(์นด๋“œ, ํšŒ๊ณ„ ๋“ฑ)๋„ ์ฐธ์—ฌ ์šฉ์ด
  • ๋‹จ์ :
    • ์ค‘๊ฐ„์ƒํƒœ ๋…ธ์ถœ
    • ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ์ง์ ‘ ๊ตฌํ˜„ ํ•„์š”

๐ŸŽต Saga ๋ฐฉ์‹ ์„ ํƒ๊ณผ ๊ตฌ์กฐ

  • Saga ํŒจํ„ด ์ค‘ โ€˜์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ฐฉ์‹โ€™ ์„ ํƒ

    • ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ(ํ™˜์ „ ์„œ๋ฒ„)๊ฐ€ ์ „์ฒด ํ”Œ๋กœ์šฐ์™€ ์ƒํƒœ ์ถ”์ 
    • ํ™˜์ „ ํ•œ๋„, ํ˜„์žฌ ์ง„ํ–‰ ์ƒํƒœ ๋“ฑ ๊ด€๋ฆฌ ์šฉ์ด
  • ํ™˜์ „ ์„œ๋ฒ„: ์ „์ฒด ํ™˜์ „ ์ƒํƒœ ๊ด€๋ฆฌ, ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ์—ญํ• 

  • ์›ํ™”/์™ธํ™” ๊ณ„์ขŒ ์„œ๋ฒ„: ๊ฐ ๊ณ„์ขŒ๋ณ„ ์ž…์ถœ๊ธˆ ๋ฐ DB ๊ด€๋ฆฌ

  • Kafka/DLQ/Scheduler/Batch: ์žฅ์•  ์‹œ ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜, ์ž๋™ ์žฌ์‹œ๋„, ๋”œ๋ ˆ์ด ๋ฉ”์‹œ์ง€, ๋ฐฐ์น˜ ๋ณต๊ตฌ ๋‹ด๋‹น


์ฃผ์š” ํŠน์ง•

  • Saga(Orchestration) ํŒจํ„ด ๊ธฐ๋ฐ˜ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ๊ตฌํ˜„
  • ์ถœ๊ธˆ โ†’ ์ž…๊ธˆ ์ˆœ์˜ ์›์ž์  ํ™˜์ „ ๋ฐ ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ์„ค๊ณ„
  • Kafka DLQ ๋ฐ Scheduler๋กœ ์žฅ์• /์ง€์—ฐ ์ƒํ™ฉ ์ž๋™ ๋ณต๊ตฌ
  • **State Table(์ƒํƒœ ๋กœ๊ทธ)**๋กœ ์ „์ฒด ์ด๋ ฅ ๋ฐ ์ƒํƒœ ์ถ”์ 
  • Batch/Alert๋ฅผ ํ†ตํ•œ ๋ฏธ์ฒ˜๋ฆฌ ํ™˜์ „ ์ž๋™/์ˆ˜๋™ ๋ณต๊ตฌ
  • Loose Coupling: ์‹ ๊ทœ ์„œ๋น„์Šค/๊ณ„์ขŒ/์ฐธ์—ฌ์ž ์†์‰ฌ์šด ํ™•์žฅ

ํŠธ๋žœ์žญ์…˜/๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ํ”Œ๋กœ์šฐ

1. ์ •์ƒ ํ”Œ๋กœ์šฐ

  1. ํ™˜์ „ ์„œ๋ฒ„ โ†’ ์›ํ™” ์ถœ๊ธˆ ์š”์ฒญ (HTTP)
  2. ์ถœ๊ธˆ ์„ฑ๊ณต โ†’ ์™ธํ™” ์ž…๊ธˆ ์š”์ฒญ (HTTP)
  3. ์ž…๊ธˆ ์„ฑ๊ณต โ†’ ํ™˜์ „ ์„ฑ๊ณต ์ฒ˜๋ฆฌ

2. ์‹คํŒจ ํ”Œ๋กœ์šฐ

  • ์ถœ๊ธˆ ์‹คํŒจ โ†’ ์ฆ‰์‹œ ํ™˜์ „ ์‹คํŒจ ์ฒ˜๋ฆฌ
  • ์ž…๊ธˆ ์‹คํŒจ โ†’ ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜(์ถœ๊ธˆ ์ทจ์†Œ) ๋ฉ”์‹œ์ง€ Kafka๋กœ ๋ฐœํ–‰

3. ๋น„์ •์ƒ/๋„คํŠธ์›Œํฌ ์—๋Ÿฌ ์ฒ˜๋ฆฌ

  • HTTP ํƒ€์ž„์•„์›ƒ/๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ ๋ฐœ์ƒ์‹œ Kafka Scheduler๋กœ ๋”œ๋ ˆ์ด ์žฌ์‹œ๋„
  • ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ์‹คํŒจ ์‹œ Batch์—์„œ ์ค‘๋‹จ ์ƒํƒœ ํƒ์ง€, Alert ํ›„ ์ˆ˜๋™/์ž๋™ ๋ณต๊ตฌ

4. DLQ/๋ฐ๋“œ๋ ˆํ„ฐ

  • ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ๋ฉ”์‹œ์ง€(์ถœ๊ธˆ ์ทจ์†Œ)๊ฐ€ ์ปจ์Šˆ๋จธ์—์„œ ์‹คํŒจ โ†’ DLQ ์„œ๋ฒ„์—์„œ ์ž๋™ ์žฌ์‹œ๋„
  • ์ผ์ • ํšŸ์ˆ˜ ์ดˆ๊ณผ ์‹œ ์šด์˜ ๊ฐœ์ž…(์ฝ”๋“œ/์„œ๋ฒ„ ๋ณต๊ตฌ ํ›„ ์žฌ๋ฐœํ–‰)

5. ํŠธ๋žœ์žญ์…”๋„ ๋ฉ”์‹œ์ง•

  • ํ™˜์ „ ์‹คํŒจ ์ฒ˜๋ฆฌ + ๋ณด์ƒ ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰์„ ์›์ž์ ์œผ๋กœ ์ฒ˜๋ฆฌ (Kafka Producer DLQ ํ™œ์šฉ)

๐Ÿ› ๏ธ Trouble Shooting

๋ถ„์‚ฐ ํ™˜์ „ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์‹ค์ œ๋กœ ๊ฒช์—ˆ๋˜ ์ฃผ์š” ์ด์Šˆ์™€ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.


1. JPA ์—”ํ‹ฐํ‹ฐ ๊ฐ„ ์ฐธ์กฐ ์‹œ ID ๊ฐ’ ๋งคํ•‘ ๋ฌธ์ œ

  • ๋ฌธ์ œ
    JPA์—์„œ ํ•œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋‹ค๋ฅธ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฐธ์กฐ(์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘)ํ•  ๋•Œ, ์ฐธ์กฐ ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ID ๊ฐ’๋งŒ ์ด์šฉํ•ด ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ์Œ.
    ์ต์ˆ™ํ•˜์ง€ ์•Š์€ JPA ๋ฌธ๋ฒ•(์˜ˆ: entity.field.id, @ManyToOne(fetch = FetchType.LAZY) ๋“ฑ)์œผ๋กœ ์ธํ•ด ์ ์ ˆํ•œ JPQL, Criteria, ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ ์ž‘์„ฑ์— ์–ด๋ ค์›€์„ ๊ฒช์Œ.

  • ํ•ด๊ฒฐ
    ๊ณต์‹ ๋ฌธ์„œ ๋ฐ ์—ฌ๋Ÿฌ ์˜ˆ์ œ๋“ค์„ ์ฐธ๊ณ ํ•˜์—ฌ,
    ์—ฐ๊ด€ ์—”ํ‹ฐํ‹ฐ์˜ ID ๊ฐ’๋งŒ ์ด์šฉํ•œ ์กฐ๊ฑด ๊ฒ€์ƒ‰/์กฐ์ธ ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•˜๊ณ ,
    join fetch ๋˜๋Š” where e.otherEntity.id = :id์™€ ๊ฐ™์ด JPQL์—์„œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ID ๊ฐ’ ๊ธฐ์ค€์˜ ๊ฒ€์ƒ‰ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„ .


2. HTTP ์‘๋‹ต ์ฝ”๋“œ์™€ ๋น„์ฆˆ๋‹ˆ์Šค/์‹œ์Šคํ…œ ์˜ˆ์™ธ ๊ตฌ๋ถ„ ๋ฌธ์ œ

  • ๋ฌธ์ œ
    HTTP ํ†ต์‹ ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ƒ ์‹คํŒจ(์˜ˆ: ์ž”์•ก ๋ถ€์กฑ ๋“ฑ)๋ฅผ 599 ๋“ฑ์˜ 5xx ์„œ๋ฒ„ ์—๋Ÿฌ๋กœ ๋ฐ˜ํ™˜ํ–ˆ๋”๋‹ˆ,
    ์‹œ์Šคํ…œ ์˜ˆ์™ธ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ์˜ˆ์™ธ๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜์–ด
    ์žฌ์‹œ๋„/์žฅ์•  ๊ฐ์ง€/์•Œ๋ฆผ ๋“ฑ์—์„œ ํ˜ผ์„  ๋ฐœ์ƒ.

  • ํ•ด๊ฒฐ
    ๋ช…ํ™•ํžˆ **๋น„์ฆˆ๋‹ˆ์Šค ์‹คํŒจ(์˜ˆ: 200 OK + ์‹คํŒจ ์‚ฌ์œ  ๋ฉ”์‹œ์ง€)**์™€
    **์‹œ์Šคํ…œ ์žฅ์• (5xx)**๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ
    ๋น„์ฆˆ๋‹ˆ์Šค ์‹คํŒจ๋Š” 2xx ์ƒํƒœ์ฝ”๋“œ(์ฃผ๋กœ 200/202 ๋“ฑ)๋กœ ๋‚ด๋ ค์ฃผ๊ณ ,
    ์‹ค์ œ ์—๋Ÿฌ ์ •๋ณด๋Š” ๋ณธ๋ฌธ(body)์— ๋‹ด์•„ ์ปจ์Šˆ๋จธ์—์„œ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •.


3. HTTP ์‹คํŒจ ์š”์ฒญ ์žฌ์ฒ˜๋ฆฌ ์‹œ ์˜์†์„ฑ ๋ฐ ID ํ• ๋‹น ๋ฌธ์ œ

  • ๋ฌธ์ œ
    HTTP ์‹คํŒจ ์š”์ฒญ์„ Kafka๋กœ ๋„˜๊ฒจ ์ผ์ • ์‹œ๊ฐ„ ํ›„ ์žฌ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ์—์„œ,
    ์ด์ „ ์š”์ฒญ์˜ DTO๋ฅผ ์ด์šฉํ•ด ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๋ฉด JPA์—์„œ ์•„์ง ์ €์žฅํ•˜์ง€ ์•Š์€ ์˜์† ์ƒํƒœ๋ผ ID ๊ฐ’์ด ์—†์Œ.
    ์—”ํ‹ฐํ‹ฐ ์ž์ฒด๋ฅผ Kafka๋กœ ๋„˜๊ธฐ๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋ฉฐ,
    save() ํ˜ธ์ถœ ์‹œ์—๋Š” ID๊ฐ€ ์ƒˆ๋กœ ๋ถ€์—ฌ๋˜์–ด ์›๋ž˜ ์š”์ฒญ๊ณผ ๋งค์นญ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ.

  • ํ•ด๊ฒฐ
    ์š”์ฒญ DTO์— UUID ๋“ฑ ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ํ•„์ˆ˜๋กœ ํฌํ•จ์‹œ์ผœ
    Kafka Consumer์—์„œ๋Š” ์ด UUID๋ฅผ ์ด์šฉํ•ด
    ๊ธฐ์กด DB์—์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒ ๋ฐ ์žฌ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌ์กฐ ๊ฐœ์„ .


4. Kafka DTO โ†”๏ธ JSON ๋ณ€ํ™˜ ์˜ˆ์™ธ ๊ด€๋ฆฌ

  • ๋ฌธ์ œ
    Kafka ํ”„๋กœ๋“€์„œ/์ปจ์Šˆ๋จธ ๊ฐ„ DTO์™€ JSON ๋ณ€ํ™˜ ๊ณผ์ •์—์„œ
    ๋งคํ•‘ ์˜ค๋ฅ˜, ํ•„๋“œ ๋ˆ„๋ฝ ๋“ฑ ํŒŒ์‹ฑ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์œผ๋‚˜
    ๋น„์ฆˆ๋‹ˆ์Šค ํŠธ๋žœ์žญ์…˜๊ณผ๋Š” ์ง์ ‘ ๊ด€๋ จ์ด ์—†์–ด ์‹œ์Šคํ…œ ๋กœ์ง๊ณผ ํ˜ผ์žฌ๋จ.

  • ํ•ด๊ฒฐ
    Kafka์˜ Serializer/Deserializer ์„ค์ •์„ ํ†ต์ผํ•˜๊ณ 
    (ex: Jackson, Gson ๋“ฑ ๋ช…ํ™•ํžˆ ์ผ์น˜์‹œํ‚ค๊ณ , ๋ถˆ์ผ์น˜ ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ),
    JSON ํŒŒ์‹ฑ ์˜ˆ์™ธ๋ฅผ Kafka ์„ค์ •์—์„œ ์ฒ˜๋ฆฌ(์ฆ‰, ๊ฐœ๋ณ„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ try-catch๋กœ ์žก์ง€ ์•Š์Œ)
    โ†’ ์นดํ”„์นด ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ DLQ๋กœ ์œ„์ž„.


5. Kafka ํ† ํ”ฝ ํŒŒ์„œ ๋ถˆ์ผ์น˜๋กœ ์ธํ•œ ๋ณ€ํ™˜ ์˜ค๋ฅ˜

  • ๋ฌธ์ œ
    Kafka ํ† ํ”ฝ ๋ฐœํ–‰ ์‹œ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ์„œ(์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ๋ฐฉ์‹)๊ฐ€ ์„œ๋ฒ„/์„œ๋น„์Šค๋ณ„๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š์•„
    DTO โ†”๏ธ JSON ๋ณ€ํ™˜์— ์‹คํŒจ, ๋ฉ”์‹œ์ง€ ์†Œ๋น„ ๋ถˆ๊ฐ€

  • ํ•ด๊ฒฐ
    Kafka ํ”„๋กœ๋“€์„œ/์ปจ์Šˆ๋จธ์˜ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ํŒŒ์„œ๋ฅผ ํ†ต์ผ
    (๋™์ผํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์„ค์ • ์‚ฌ์šฉ, DTO ์Šคํ‚ค๋งˆ/๋ฒ„์ „ ๊ด€๋ฆฌ)
    โ†’ ๋ฉ”์‹œ์ง€ ํฌ๋งท ์ผ๊ด€์„ฑ ํ™•๋ณด


6. Kafka ์žฅ์• ์‹œ ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ์ค‘๋‹จ(๋‹จ์ผ ์žฅ์• ์ ) ๋ฌธ์ œ

  • ๋ฌธ์ œ
    Kafka๊ฐ€ ๋‹ค์šด๋˜๋ฉด ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜์ด ๋™์ž‘ํ•˜์ง€ ์•Š์•„
    ์‚ฌ์šฉ์ž ์ž๊ธˆ ์†์‹ค, ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋“ฑ ์น˜๋ช…์  ๋ฆฌ์Šคํฌ ์กด์žฌ

  • ํ•ด๊ฒฐ
    Kafka ๋ธŒ๋กœ์ปค ๋ณต์ œ(Replication) ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ ์šฉ

    • ์ตœ์†Œ 2๋Œ€ ์ด์ƒ์˜ ๋ธŒ๋กœ์ปค๋กœ ๊ตฌ์„ฑ,
    • ํŒŒํ‹ฐ์…˜/๋ฆฌ๋”/ํŒ”๋กœ์›Œ ๊ตฌ์กฐ๋กœ ํ•œ์ชฝ ์„œ๋ฒ„๊ฐ€ ์žฅ์•  ๋ฐœ์ƒ ์‹œ์—๋„
      ๋‹ค๋ฅธ ๋ธŒ๋กœ์ปค๊ฐ€ Failoverํ•˜์—ฌ ๋ฉ”์‹œ์ง€ ์†์‹ค/๋ˆ„๋ฝ ์—†์ด ์ฒ˜๋ฆฌ
      โ†’ ์‹œ์Šคํ…œ์˜ ๊ณ ๊ฐ€์šฉ์„ฑ(HA) ๋ฐ ์‹ ๋ขฐ์„ฑ ํ™•๋ณด

์‹ค์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ–ˆ๋˜ ํŠธ๋Ÿฌ๋ธ”์„ ๊ธฐ๋ฐ˜์œผ๋กœ,
์žฅ์• /์—๋Ÿฌ ๋Œ€์‘๋ ฅ๊ณผ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ์ผ๊ด€์„ฑ ์žˆ๋Š” ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๊ฒฝํ—˜์„ ์ถ•์ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Popular repositories Loading

  1. compensaTX-api-krw compensaTX-api-krw Public

    ์˜ค๋ผํด๋กœ ๊ตฌํ˜„๋œ ์›ํ™” ์„œ๋ฒ„ ์ž…๋‹ˆ๋‹ค :)

    Java

  2. compensaTX-FE compensaTX-FE Public

    ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ํ™˜์ „ ์‹œ์Šคํ…œ front ์ž…๋‹ˆ๋‹ค :)

    Vue

  3. compensaTX-api-oehwa compensaTX-api-oehwa Public

    ์™ธํ™” SQL ์ž…๋‹ˆ

  4. .github .github Public

  5. compensaTX-consumer-dlq compensaTX-consumer-dlq Public

    DLQ ์ „์šฉ Kafka ์ปจ์Šˆ๋จธ ์ž…๋‹ˆ๋‹ค :)

    Java 1

  6. compensaTX-consumer-krw compensaTX-consumer-krw Public

    ์›ํ™”(KRW) Kafka ์ปจ์Šˆ๋จธ ์ž…๋‹ˆ๋‹ค :)

    Java 1

Repositories

Showing 8 of 8 repositories

Top languages

Loadingโ€ฆ

Most used topics

Loadingโ€ฆ