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

[TIL] ํ”„๋กœ์ ํŠธ 11์ผ์ฐจ.. ๋“œ๋””์–ด ์žฌ๊ณ  ๊ฐ์†Œ๋ž‘ ๋ฐฐ์†ก ์ƒ์„ฑ์ด๋ž‘ ์—ฐ๊ฒฐ์„?!

by carrot0911 2025. 5. 29.

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

์˜ค๋Š˜์€ ๋“œ๋””์–ด ์žฌ๊ณ  ๊ฐ์†Œ ๋กœ์ง์ด๋ž‘ ๋ฐฐ์†ก ์ƒ์„ฑ ๋กœ์ง์„ Kafka๋ฅผ ํ™œ์šฉํ•ด์„œ ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค!

๊ทผ๋ฐ ๋ง‰์ƒ ์—ฐ๊ฒฐํ•˜๋ ค๊ณ  ์„ค๊ณ„๋ฅผ ํ•˜๋‹ค ๋ณด๋‹ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค..
๋ฐฐ์†ก์„ ์ƒ์„ฑํ•  ๋•Œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์ „๋ถ€ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด์—ˆ๋‹ค..

๋ฐฐ์†ก์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” orderId, sellerId, senderId, addressId, deliveryRequest ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
ํ•˜์ง€๋งŒ ์ง€๊ธˆ ๋‹น์žฅ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ orderId์™€ sellerId์ด๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ฐ›์•„์˜ฌ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด์—ˆ๋‹ค..

๊ทธ๋ž˜์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ™์ด ์ง„ํ–‰ํ•˜๋Š” ํŒ€์›๋“ค๊ณผ ์–˜๊ธฐํ•ด๋ณธ ๊ฒฐ๊ณผ Sender(์ถœ๊ณ ์ง€(๋ฌผ๋ฅ˜์„ผํ„ฐ))์™€ Seller(ํŒ๋งค์ž) ์‚ฌ์ด์—๋Š” ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํŒ๋งค์ž๊ฐ€ ์–ด๋А ์ถœ๊ณ ์ง€(๋ฌผ๋ฅ˜์„ผํ„ฐ)๋กœ ์ƒํ’ˆ์„ ๋ณด๋‚ด์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ–ˆ๋‹ค.

๋˜ ์ฟ ํŒก์„ ์‚ดํŽด๋ณด๋‹ˆ ์ฃผ๋ฌธ ํŽ˜์ด์ง€์—์„œ ๋ฐฐ์†ก์ง€๋ฅผ ํ•จ๊ป˜ ํ‘œ์‹œํ•ด์ฃผ๊ณ  ์žˆ์–ด์„œ ์ฃผ๋ฌธ๊ณผ ์ฃผ์†Œ ์‚ฌ์ด์—๋„ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์†ก ์š”์ฒญ์‚ฌํ•ญ์€ ๊ฐ ํšŒ์›๋งˆ๋‹ค ๋ฐฐ์†ก์ง€๋ฅผ ์ €์žฅํ•  ๋•Œ ํ•จ๊ป˜ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์‹œ์Šคํ…œ์ด์—ˆ๋‹ค.

์ด ๋‚ด์šฉ๋“ค์„ ์ข…ํ•ฉํ•ด์„œ ํšŒ๊ณ  ์‹œ๊ฐ„์— ๊ฐ๊ฐ ๋‹ด๋‹นํ•˜๋Š” ํŒ€์›๋“ค์—๊ฒŒ ๋‚ด์šฉ๋“ค ์„ค๋ช…ํ•ด ์ฃผ๊ณ  ํ•ฉ์˜์ ์„ ์ฐพ๊ฒŒ ๋˜์—ˆ๋‹ค.
์ด๋ฏธ ์ฃผ๋ฌธ์„ ์ƒ์„ฑํ•  ๋•Œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ฐ›์•„์„œ ๋„˜๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋ฌธ ํŒŒํŠธ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๊ณ , ์ฃผ์†Œ์— ๋ฐฐ์†ก ์š”์ฒญ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ์ถœ๊ณ ์ง€(๋ฌผ๋ฅ˜์„ผํ„ฐ)์™€ ํŒ๋งค์ž ์‚ฌ์ด์— ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ. ์ด ๋‘ ๊ฐ€์ง€๋งŒ ํ•ด๊ฒฐํ•œ๋‹ค๋ฉด ์žฌ๊ณ  ๊ฐ์†Œ ๋กœ์ง๊ณผ ๋ฐฐ์†ก ์ƒ์„ฑ ๋กœ์ง์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜๋ถ€ํ„ฐ ์•ฝ ์ผ์ฃผ์ผ์ •๋„ ๋‚ด๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌ๋”ฉํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๊ฐ‘์ž๊ธฐ ์ฐพ์•„์˜จ ์ƒํ™ฉ์ด๋ผ ๋‹นํ™ฉ์Šค๋Ÿฝ๊ธฐ๋„ ํ•˜์ง€๋งŒ ์ด ์ƒํ™ฉ์„ ์ž˜ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐ„๋‹ค๋ฉด ๋‚˜์—๊ฒŒ ๋˜ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฆฌ๋”ฉํ•˜๋Š” ๋™์•ˆ ๋” ์—ด์‹ฌํžˆ ํ•ด์„œ ์ž˜ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์ด๋Œ์–ด์•ผ๊ฒ ๋‹ค!

 

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

Kafka Consumer์—์„œ ๋‹ค๋ฅธ Producer ํ˜ธ์ถœํ•˜๊ธฐ

Kafka ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด์„œ, ํ•˜๋‚˜์˜ Consumer๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•œ ํ›„ ๋˜ ๋‹ค๋ฅธ Producer๋ฅผ ํ˜ธ์ถœํ•ด ๋‹ค์Œ ๋‹จ๊ณ„์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์ฒ˜์Œ์œผ๋กœ ์ ์šฉํ•ด๋ดค๋‹ค.

  • ๊ตฌ์กฐ → Kafka Consumer ๋‚ด๋ถ€์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰ ํ›„, ๋‹ค๋ฅธ Kafka Producer๋ฅผ ํ˜ธ์ถœ
  • ๋ชฉ์  → ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•œ ๋‹จ๊ณ„์  ํ๋ฆ„ ์ฒ˜๋ฆฌ (ex. ์žฌ๊ณ  ๊ฐ์†Œ → ๋ฐฐ์†ก ์ƒ์„ฑ)
  • ์žฅ์  → ์‹œ์Šคํ…œ ๊ฐ„ ๊ฒฐํ•ฉ๋„ ์—†์ด ์ด๋ฒคํŠธ ํ๋ฆ„์„ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿงฉ ์‹ค์ œ ์ ์šฉํ•œ ๊ตฌ์กฐ

[TestController] → ProductProducer → Kafka (stock-topic)
                     ↓
               ProductConsumer (์žฌ๊ณ  ์ฐจ๊ฐ)
                     ↓
          ๐Ÿ†• DeliveryProducer (๋ฐฐ์†ก ๋ฉ”์‹œ์ง€ ์ „์†ก)
                     ↓
             DeliveryConsumer → ๋ฐฐ์†ก ์ƒ์„ฑ

๐Ÿงช ์ ์šฉ ํฌ์ธํŠธ

Consumer์—์„œ ๋‹ค๋ฅธ Producer๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

@RequiredArgsConstructor
@Component
public class ProductConsumer {
    private final DeliveryProducer deliveryProducer;

    @KafkaListener(topics = "stock-topic", ...)
    public void listen(...) {
        ...
        deliveryProducer.sendCreateDeliveryMessage(...);
    }
}

๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋„˜๊ธฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์„ธ์Šค ํ๋ฆ„์˜ ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.
๋™๊ธฐ ํ˜ธ์ถœ์ด ์•„๋‹Œ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด๋ผ ํ™•์žฅ์„ฑ์— ์œ ๋ฆฌํ•˜๋‹ค.

โš ๏ธ ์œ ์˜์‚ฌํ•ญ

  • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ → ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, ์žฌ์ฒ˜๋ฆฌ ์ •์ฑ… ๋˜๋Š” DLQ ํ•„์š” ์—ฌ๋ถ€ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ๋ฉ”์‹œ์ง€ ์œ ํšจ์„ฑ → ์ „๋‹ฌํ•  DTO๋Š” ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.
  • ์ˆœ์„œ ๋ณด์žฅ → Kafka ํŒŒํ‹ฐ์…˜ ํ‚ค ์„ค์ •์ด ์—†์œผ๋ฉด ๋ฉ”์‹œ์ง€ ์ˆœ์„œ ๋ณด์žฅ์€ ๋ถˆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ” ์˜ค๋Š˜์˜ ์ธ์‚ฌ์ดํŠธ

Kafka ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ์—์„œ ์ด๋ฒคํŠธ ๊ฐ„ ํ๋ฆ„์„ ์ด์–ด์ฃผ๊ธฐ ์œ„ํ•ด Consumer → ๋‹ค๋ฅธ Producer ํ˜ธ์ถœ ๊ตฌ์กฐ๊ฐ€ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฑธ ์ฒ˜์Œ ์ฒด๊ฐํ–ˆ๋‹ค.
์ด ๊ตฌ์กฐ๋Š” ํ–ฅํ›„ ๋‹ค์–‘ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘์š”ํ•œ ๋ฉ”์‹œ์ง€ ํŒจํ„ด์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

 

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

โœ”๏ธ ์žฌ๊ณ  ๊ฐ์†Œ ๋กœ์ง๊ณผ ๋ฐฐ์†ก ์ƒ์„ฑ ๋กœ์ง ์—ฐ๊ฒฐ ๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ
โœ”๏ธ API ๋ช…์„ธ์„œ ์ˆ˜์ •
โœ”๏ธ TIL ์ž‘์„ฑ