πŸ–₯️ λ­”κ°€λ­”κ°€ν”„λ‘œμ νŠΈ/✏️ TIL

[TIL] ν”„λ‘œμ νŠΈ 22일차.. ν”„λ‘œμ νŠΈ 고도화 μž‘μ—…ν•˜κΈ°!!

carrot0911 2025. 6. 9. 21:20

🌞 μ˜€λŠ˜μ€ μ–΄λ–€ ν•˜λ£¨μ˜€μ§€..

μ „μ²΄μ μœΌλ‘œ κ΅¬ν˜„ν•œ λ‚΄μš©λ“€μ— λŒ€ν•΄ 고도화λ₯Ό μ§„ν–‰ν–ˆλ‹€!

μš°μ„  Slack μ•Œλ¦Όμ΄ ν•„μš”ν•œ 곳에 μΆ”κ°€μ μœΌλ‘œ μ•Œλ¦Ό λ©”μ‹œμ§€κ°€ 전솑될 수 μžˆλ„λ‘ κ΅¬ν˜„ν–ˆλ‹€.
μ²˜μŒμ—λŠ” λ‹¨μˆœνžˆ μΆœκ³ λ˜μ—ˆμ„ λ•Œμ™€ 배솑 μƒνƒœκ°€ λ³€κ²½λ˜μ—ˆμ„ λ•Œλ„ λ˜‘κ°™μ΄ Slack μ•Œλ¦Όμ΄ μ˜¨λ‹€λ©΄ νŽΈν•  것이라고 μƒκ°ν–ˆλ‹€.
ν•˜μ§€λ§Œ μŠ¬λž™μ€ κ°œλ°œμžλ“€μ΄ 많이 μ‚¬μš©ν•˜λŠ” μ•±μ΄μ—ˆκ³ , μ‚¬μš©μžλ“€μ΄ μŠ¬λž™μ„ μ‚¬μš©ν•˜μ§€λŠ” μ•ŠκΈ° λ•Œλ¬Έμ— ν˜„μ‹€μ„±μ΄ 많이 λ–¨μ–΄μ§€λŠ” μ•Œλ¦Όμ΄μ—ˆλ‹€..
κ·Έλž˜μ„œ μ–΄λ–»κ²Œ μ•Œλ¦Ό λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄μ£ΌλŠ” 것이 μ’‹μ„κΉŒ? μƒκ°ν–ˆκ³ , 문자 λ©”μ‹œμ§€/μΉ΄μΉ΄μ˜€ν†‘/이메일을 생각할 수 μžˆμ—ˆλ‹€.
κ·Έμ€‘μ—μ„œ 문자 λ©”μ‹œμ§€λŠ” 유료 μ„œλΉ„μŠ€λΌλŠ” 것을 ν™•μΈν–ˆκ³ , 이메일과 μΉ΄μΉ΄μ˜€ν†‘ 쀑 μ‚¬μš©μžλ“€μ΄ 더 많이 μ‚¬μš©ν•˜λŠ” 것을 생각해 λ΄€λ‹€. μš°λ¦¬λ‚˜λΌ μ‚¬λžŒλ“€μ€ μΉ΄μΉ΄μ˜€ν†‘μ„ 훨씬 더 많이 μ‚¬μš©ν•˜κ³  μžˆμ—ˆλ‹€.
κ·Έλž˜μ„œ 결둠적으둜 μΉ΄μΉ΄μ˜€ν†‘μœΌλ‘œ 좜고, 배솑쀑, λ°°μ†‘μ™„λ£Œ λ©”μ‹œμ§€λ₯Ό 보내주면 μ’‹μ§€ μ•Šμ„κΉŒ λΌλŠ” 생각을 ν•˜κ²Œ λ˜μ—ˆλ‹€.

κ·Έλ‹€μŒμœΌλ‘œ νŒ€μ›μ—κ²Œ ν”Όλ“œλ°±μ„ λ°›κ²Œ λ˜μ—ˆλ‹€.
ν˜„μž¬ 재고 κ°μ†Œ 둜직이 μ£Όλ¬Έ 생성 ν† ν”½ μ•ˆμ— μœ„μΉ˜ν•˜κ³  μžˆλŠ”λ° λ”°λ‘œ λΊ΄λŠ” 것이 더 λ‚˜μ•„ λ³΄μΈλ‹€λŠ” μ˜κ²¬μ΄μ—ˆλ‹€. KafkaListenerλ₯Ό μ—¬λŸ¬ 개 μ‚¬μš©ν•΄λ„ λ¬Έμ œμ—†μœΌλ‹ˆκΉŒ λ”°λ‘œ λΉΌμ„œ κ΄€λ¦¬ν•˜λŠ” 것이 쒋을 것 κ°™λ‹€λŠ” μ˜κ²¬μ„ λ°›μ•˜λ‹€.

λ˜ν•œ ν˜„μž¬ κ΅¬ν˜„ν•œ λ‘œμ§μ— 문제점이 μžˆμ—ˆλ‹€.
같은 주문에 λŒ€ν•΄ 배솑이 μ—¬λŸ¬λ²ˆ 생성될 수 μžˆλ‹€λŠ” κ²ƒμ΄μ—ˆλ‹€. 이것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œλŠ” orderId에 λŒ€ν•΄μ„œ 쀑볡이 이루어지지 μ•Šκ²Œ μ œν•œν•΄μ•Ό ν•œλ‹€!
DeliveryRepositoryμ—μ„œ μ£Όλ¬Έλ²ˆν˜Έκ°€ λ™μΌν•œ DeliveryλŠ” 생성할 수 없도둝 μ œν•œν•΄μ•Ό ν–ˆλ‹€.

// ν•΄λ‹Ή 주문에 λŒ€ν•œ 배솑이 μ‘΄μž¬ν•  경우 μ˜ˆμ™Έ 처리
if (deliveryRepository.existsByOrderId(request.orderId())) {
    slackNotifier.sendDeliveryCreateFailureAlert(
        request.orderId(),
        "DELIVERY_ALREADY_EXISTS",
        "IDκ°€ " + request.orderId() + "인 주문에 λŒ€ν•œ 배솑이 이미 μ‘΄μž¬ν•˜μ—¬ 배솑 생성에 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.");
    
    throw new ConflictException(ErrorCode.DELIVERY_ALREADY_EXISTS);
}

ν•΄λ‹Ή λ‘œμ§μ„ μΆ”κ°€ν–ˆκ³  결과적으둜 λ™μΌν•œ μ£Όλ¬Έ λ²ˆν˜Έμ— λŒ€ν•΄ 배솑을 μƒμ„±ν•˜λ €κ³  ν•˜λŠ” 경우

λ‹€μŒκ³Ό 같이 μ•Œλ¦Ό λ©”μ‹œμ§€κ°€ 였게 λ˜μ—ˆλ‹€!

λ‹€μŒ λ¬Έμ œμ μ€ 재고 κ°μ†Œ → 배솑 생성 νλ¦„μœΌλ‘œ 이어지고 μžˆλŠ”λ° 배솑 생성이 μ‹€νŒ¨ν•  경우 μž¬κ³ λŠ” κ°μ†Œκ°€ 되고 배솑은 μ—†λŠ” 상황이 λ°œμƒν•˜κ²Œ λœλ‹€.
그럼 재고만 μ€„μ–΄λ“€κ²Œ 되고 배솑은 μƒμ„±λ˜μ§€ μ•ŠλŠ” ν˜Όλž€μ΄ λ°œμƒν•œλ‹€.
이 상황을 막기 μœ„ν•΄μ„œλŠ” 배솑 생성이 μ‹€νŒ¨ν–ˆμ„ 경우 재고λ₯Ό λ˜λŒλ¦¬λŠ” 둜직이 ν•„μš”ν•˜λ‹€.
재고 κ°μ†Œ → 배솑 μ‹€νŒ¨ → 재고 볡원 νλ¦„μœΌλ‘œ ν•΄κ²°ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이 베슀트라고 μƒκ°ν–ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ 재고 볡원은 μ–΄λ–»κ²Œ μ§„ν–‰ν•˜λŠ” 것이 μ’‹μ„κΉŒ 생각해 λ΄€λ‹€.
λ˜‘κ°™μ΄ Kafkaλ₯Ό ν™œμš©ν•˜μ—¬ λΉ„λ™κΈ°λ‘œ μ²˜λ¦¬ν•˜λŠ” 것이 μ’‹λ‹€κ³  μƒκ°ν–ˆλ‹€. μ‹€νŒ¨ν–ˆμ„ 경우 재고 볡원 λ©”μ‹œμ§€λ₯Ό 보내고 Listenerκ°€ λ°›μ•„μ„œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이 μžμ—°μŠ€λŸ¬μš΄ 흐름이라고 μƒκ°ν–ˆλ‹€.

μ΄λ ‡κ²Œ λ¬Έμ œμ μ— λŒ€ν•΄ 해결책을 μƒκ°ν•˜λ‹€κ°€ ν•˜λ£¨κ°€ λ‹€ μ§€λ‚˜κ°€λ²„λ Έλ‹€ γ…Žγ…Ž..

 

πŸ—“οΈ 내일은 뭐 ν•˜μ§€?!

βœ”οΈ 재고 볡원 둜직 κ΅¬ν˜„ν•˜κΈ°
βœ”οΈ μΉ΄μΉ΄μ˜€ν†‘ μ•Œλ¦Ό λ©”μ‹œμ§€ κ΅¬ν˜„ν•˜κΈ°
βœ”οΈ TIL μž‘μ„±ν•˜κΈ°