๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ ๋ญ”๊ฐ€๋ญ”๊ฐ€ํ”„๋กœ์ ํŠธ/โœ๏ธ TIL

[TIL] ํ”„๋กœ์ ํŠธ 8์ผ์ฐจ.. ์ถ”๊ฐ€ ๋กœ์ง ์ƒ๊ฐํ•˜๋‹ค ๋จธ๋ฆฌ๊ฐ€ ํ„ฐ์ ธ๋ฒ„๋ ค..

by carrot0911 2025. 5. 26.

๐ŸŒž ์˜ค๋Š˜์€ ์–ด๋–ค ํ•˜๋ฃจ์˜€์ง€..

ํ•˜๋ฃจ ์ข…์ผ ๋ฐฐ์†ก์ด๋ž‘ ์ƒํ’ˆ ์žฌ๊ณ  ๊ฐ์†Œ ๋กœ์ง์„ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ ํ•˜๋ฃจ๊ฐ€ ๋๋‚œ ๊ฑฐ ๊ฐ™๋‹ค.

๋ถ„๋ช… ์ƒ๊ฐํ•  ๊ฒƒ์ด ๋ณ„๋กœ ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๋ง‰์ƒ ๋…ธํŠธ์— ์ •๋ฆฌํ•˜๋ฉด์„œ ํ•˜๋‹ˆ๊นŒ ์ƒ๊ฐํ•  ๊ฒƒ๋„ ๋งŽ๊ณ  ๋กœ์ง ์ž์ฒด๋„ ๋ณต์žกํ•  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๋А๋‚Œ์ด ๋ฝœ์•… ์™”๋‹ค.. ๊ทธ๋ž˜์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ์ƒ๊ฐํ•˜๋ฉด์„œ ๋…ธํŠธ์— ์ •๋ฆฌํ•˜๊ณ  ์ด ์ •๋„๋ฉด ๋๊ฒ ์ง€?!๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์ถ”๊ฐ€์ ์œผ๋กœ ์ƒ๊ฐํ•  ๊ฒƒ์ด ์ƒ๊ฒจ๋ฒ„๋ ธ๋‹ค ใ…Ž..

Kafka์™€ Redis๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒํ’ˆ ๊ด€๋ จ ์š”์ฒญ๊ณผ ๋ฐฐ์†ก ๊ด€๋ จ ์š”์ฒญ์˜ ํ† ํ”ฝ์„ ๋ถ„๋ฆฌํ•˜๊ณ , ๋ฉ”์‹œ์ง€ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ์™€ ๋™์‹œ์„ฑ ์ œ์–ด ๋“ฑ๋“ฑ์„ ๋” ์ƒ๊ฐํ•ด์•ผ ํ–ˆ๋‹ค. ์•„์ง Kafak์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ๋‚ฎ์•„์„œ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์‹œ๊ฐ„์ด ๊ฝค๋‚˜ ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™์ง€๋งŒ, ํ•œ๋ฒˆ ๊ตฌํ˜„ํ•ด๋†“๊ณ  ๋‚˜๋ฉด ํ™•์‹คํžˆ ๋‚˜์—๊ฒŒ ๋„์›€์ด ๋งŽ์ด ๋  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

์–ด๋ ต๋‹ค๋Š” ์ƒ๊ฐ๋ณด๋‹ค๋Š” ์ฐจ๊ทผ์ฐจ๊ทผ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐ€์ž๋Š” ์ƒ๊ฐ๋งŒ ๊ฐ€์ง€๊ณ  ๋‚ด๊ฐ€ ๋งก์€ ๋ถ€๋ถ„์„ ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๊พธ์ค€ํžˆ ์ƒ๊ฐํ•˜๊ณ  ๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค!

 

๐Ÿ’ก ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋œ ๋‚ด์šฉ์€ ๋ญ๊ฐ€ ์žˆ๋”๋ผ..?!

๋ฐฐ์†ก๊ณผ ์žฌ๊ณ  ๊ฐ์†Œ ๋ถ„๋ฆฌ ์„ค๊ณ„

์™œ ๋ฐฐ์†ก๊ณผ ์žฌ๊ณ  ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ• ๊นŒ?

  • ๋ฐฐ์†ก ์ƒ์„ฑ ์‹œ ์žฌ๊ณ ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์ฐจ๊ฐํ•˜๋ฉด ๋ฐฐ์†ก ์‘๋‹ต์ด ์ง€์—ฐ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์žฌ๊ณ  ๊ฐ์†Œ๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š” I/O ์ž‘์—…์ด๋ฏ€๋กœ, ๋ณ„๋„ Kafka ํ† ํ”ฝ์œผ๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋ฐฐ์†ก ์ƒ์„ฑ ๋กœ์ง๊ณผ ์žฌ๊ณ  ๊ฐ์†Œ ๋กœ์ง์€ ๋ถ„๋ฆฌํ•˜๊ณ , Kafka ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ์žฌ๊ณ  ๊ฐ์†Œ๋ฅผ ์š”์ฒญํ•˜๋„๋ก ๊ตฌ์กฐ ์„ค๊ณ„๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿงฑ ๊ตฌ์กฐ ์„ค๊ณ„ ๋ชฉํ‘œ

  • Kafka๋กœ ์žฌ๊ณ  ๊ด€๋ จ ์š”์ฒญ์„ ๋ฉ”์‹œ์ง€๋กœ ์ „๋‹ฌ
  • ์žฌ๊ณ  ๊ด€๋ฆฌ ์„œ๋น„์Šค(Consumer)๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
  • ์ฒ˜๋ฆฌ ์™„๋ฃŒ ์—ฌ๋ถ€๋Š” Redis๋ฅผ ํ†ตํ•ด ์ถ”์ 
  • ๋ฐฐ์†ก ์ƒ์„ฑ์€ ์žฌ๊ณ  ์ฐจ๊ฐ ์š”์ฒญ๋งŒ ๋ฐœํ–‰ํ•˜๊ณ  ์ฆ‰์‹œ ์‘๋‹ต
    → ๊ฒฐ๊ณผ ํ™•์ธ์€ Redis or ์ถ”๊ฐ€ ์•Œ๋ฆผ์œผ๋กœ ํ›„์† ์ฒ˜๋ฆฌ

๐Ÿงฉ Kafka + Redis ๊ธฐ๋ฐ˜ ๊ตฌ์„ฑ ์š”์†Œ ์ •๋ฆฌ

1. ์žฌ๊ณ  ๊ด€๋ฆฌ์šฉ Kafka ํ† ํ”ฝ ๋ถ„๋ฆฌ

  • ๋ชฉ์ : ์žฌ๊ณ  ๊ด€๋ฆฌ ์š”์ฒญ์€ ์ƒํ’ˆ/์ฃผ๋ฌธ/๊ฒฐ์ œ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ณณ์—์„œ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, ๋ฐฐ์†ก ์•Œ๋ฆผ ํ† ํ”ฝ๊ณผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์˜ˆ์‹œ
    • stock-management-topic
    • delivery-created-topic (๋ณ„๋„)

2. Kafka Consumer ์„ค๊ณ„ – ๋ฉ”์‹œ์ง€ ํƒ€์ž… ๋ถ„๊ธฐ

  • Switch-case or if-else ๋กœ ๋ฉ”์‹œ์ง€ ํƒ€์ž…(messageType)์— ๋”ฐ๋ผ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
  • ์˜ˆ์‹œ ๋ฉ”์‹œ์ง€ ํƒ€์ž…
    • STOCK_DECREASE
    • PRICE_UPDATE
    • STOCK_CORRECTION
switch (message.getType()) {
  case STOCK_DECREASE:
      handleStockDecrease(message);
      break;
  case PRICE_UPDATE:
      handlePriceUpdate(message);
      break;
  ...
}

 

3. ์žฌ๊ณ  ๊ฐ์†Œ ๋กœ์ง (๋™์‹œ์„ฑ ์ œ์–ด ํฌํ•จ)

  • STOCK_DECREASE ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•œ Consumer๋Š” DB ๋˜๋Š” Redis ๋ฝ์„ ํ™œ์šฉํ•ด ๋™์‹œ์„ฑ ์ œ์–ด
  • ์žฌ๊ณ ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉด ์ฒ˜๋ฆฌ ์‹คํŒจ → ๋ณ„๋„ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ ๋˜๋Š” ๋ณด๋ฅ˜ ์ƒํƒœ ์ €์žฅ

4. Redis๋ฅผ ํ†ตํ•œ ์ƒํƒœ ์ €์žฅ ๋ฐ ์กฐํšŒ

  • ์˜ˆ: ๊ฐ€๊ฒฉ ๋ณ€๊ฒฝ ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋ฉด Redis์— ์™„๋ฃŒ ์—ฌ๋ถ€ ์ €์žฅ
  • Redis Key ์˜ˆ์‹œ:
product:price:update:12345 → true
stock:decrease:orderId:111 → success
  • Value๋Š” Boolean ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•  ์˜ˆ์ •์ด๋‹ค.

๐Ÿงฉ ์˜ˆ์‹œ ํ๋ฆ„ – ๊ฐ€๊ฒฉ ๋ณ€๊ฒฝ ์š”์ฒญ

  1. ๊ด€๋ฆฌ์ž๊ฐ€ ์ƒํ’ˆ ๊ฐ€๊ฒฉ ๋ณ€๊ฒฝ ์š”์ฒญ
  2. Kafka์— PRICE_UPDATE ๋ฉ”์‹œ์ง€ ์ „์†ก
  3. Consumer๊ฐ€ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  → ์ฒ˜๋ฆฌ ์™„๋ฃŒ ํ›„
  4. Redis์— "product:price:update:12345" → true ์ €์žฅ
  5. ํŒ๋งค์ž ํ™”๋ฉด์—์„œ Redis ๊ฐ’ ํ™•์ธ ํ›„ ์ตœ์ข… ์‘๋‹ต ์ „์†ก

โœ… ์ •๋ฆฌ: ๋‚ด๊ฐ€ ํ•ด์•ผ ํ•  ์ž‘์—… (์šฐ์„ ์ˆœ์œ„)

  1. Kafka ํ† ํ”ฝ ๋ถ„๋ฆฌ → stock-management-topic ๋”ฐ๋กœ ์ƒ์„ฑ
  2. ๋ฉ”์‹œ์ง€ ํƒ€์ž… ์ •์˜ → ์žฌ๊ณ  ๊ฐ์†Œ, ๊ฐ€๊ฒฉ ๋ณ€๋™ ๋“ฑ ๊ตฌ๋ถ„
  3. Consumer ์„ค๊ณ„ → switch๋กœ ํƒ€์ž…๋ณ„ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ
  4. Redis ์ €์žฅ ๊ตฌํ˜„ → ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ํ‚ค๋กœ ์ €์žฅ(Boolean)
  5. ์žฌ๊ณ  ๊ฐ์†Œ ๋กœ์ง์€ ๋ฝ + ์‹คํŒจ ์ฒ˜๋ฆฌ ํฌํ•จ → ๋น„๊ด€์  ๋ฝ or Redis ๋ฝ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

๐Ÿ—“๏ธ ๋‚ด์ผ์€ ๋ญ ํ•˜์ง€?!

โœ”๏ธ Kafka + Redis ๋กœ์ง ์ƒ๊ฐํ•˜๊ณ  ๊ตฌํ˜„ ์‹œ์ž‘ํ•˜๊ธฐ
โœ”๏ธ API ๋ช…์„ธ์„œ ์ˆ˜์ •
โœ”
๏ธ TIL ์ž‘์„ฑ