JSCODE Logo
프로그래밍 과외블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2025 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침
← 블로그 목록으로 돌아가기

[실습] Spring Boot로 재시도조차 실패한 메시지 사후 처리하기

JSCODE 박재성
JSCODE 박재성
2025-12-06
author
JSCODE 박재성
category
Kafka
createdAt
Dec 6, 2025
series
실전에서 바로 써먹는 Kafka 입문
slug
practice-handle-dlt-messages
type
post
updatedAt
Dec 6, 2025 05:39 AM
👨🏻‍🏫
이전 강의에서는 Kafka에서 재시도까지 실패한 메시지를 email.send.dlt와 같은 DLT(Dead Letter Topic)에 안전하게 저장하는 방법을 배웠다. 하지만 DLT에 저장하는 것만으로는 문제가 해결되지 않는다. 실패한 메시지를 직접 확인하고, 적절한 조치를 취하는 과정이 필요하다.
 

✅ DLT에 저장된 메시지를 사후 처리하는 방식

DLT에 저장된 메시지는 여러 번의 재시도를 거쳤음에도 불구하고 실패한 메시지이기 때문에 분명 문제가 있는 메시지이다. 따라서 이 메시지는 수동으로 체크하고 조치를 취해야 한다. 따라서 현업에서는 DLT에 저장된 메시지를 아래와 같은 방식으로 주로 처리한다.
 
  1. DLT에 저장된 실패 메시지를 로그 시스템에 전송해 장애 원인을 추적할 수 있도록 한다.
  1. DLT에 메시지가 저장되자마자 수동으로 대처할 수 있게 알림을 설정한다.
  1. 알림을 받은 관리자는 로그에 쌓인 내용을 보고 장애 원인을 분석하고, 그에 맞게 메시지를 수동으로 처리한다.
 
여기서 3번째 내용 중에 ‘메시지를 수동으로 처리한다’라는 부분을 더 자세히 살펴보자. 도대체 메시지를 수동으로 어떻게 처리한다는 걸까? 대표적인 수동으로 처리하는 방식의 예시를 알아보자.
 
  1. 메시지를 원래 토픽으로 직접 다시 보내기
      • 장애가 일시적이었고 지금은 해결된 경우 (ex. 외부 메일 서버가 다운되어 있었는데 지금은 정상 상태인 경우)
       
  1. 메시지 폐기하기
      • 메시지의 내용을 처리하려고 봤는데, 영구적으로 처리할 수 없는 메시지(ex. 탈퇴한 사용자, 형식 오류)일 수도 있다. 그럴 때는 메시지 자체를 폐기한다. 단, 폐기할 때도 영구적으로 폐기하지 않고 혹시 모를 상황에 대비해 로그로 남겨둔다.
       
  1. (사후 처리) 잘못된 메시지 내용이 Kafka에 들어가지 않게 Producer의 검증 로직 보완하기
      • 잘못된 메시지는 최대한 Producer에서 검증할 수 있으면 검증해서 걸러야 한다. 이렇게 되면 잘못된 메시지가 kafka에 들어가지 않게 되고, 사용자 입장에서도 잘못된 요청 값에 대해 실패의 응답을 받을 수 있기 때문에 대처해야 할 에러가 확연히 줄어든다.
       
 
위 내용을 참고해서 실제 코드로 어떻게 작성해서 처리하는 지 살펴보자.
 
 

✅ DLT에 저장된 메시지 처리하기

  1. DLT에 저장된 메시지 처리하는 Consumer 로직 작성하기
    1. EmailSendDltConsumer
      @Service public class EmailSendDltConsumer { @KafkaListener( topics = "email.send.dlt", groupId = "email-send-dlt-group" ) public void consume(String message) { // ...로그 시스템에 전송하는 로직은 생략... System.out.println("로그 시스템에 전송 : " + message); // ...Slack에 알림 발송하는 로직은 생략... System.out.println("Slack에 알림 발송"); } }
      Slack과 같이 알림을 발송하게 만들어놓으면 DLT로 빠진 메시지를 바로 인식할 수 있게 된다. 그러고 로그 시스템에 저장된 로그를 확인하면서 문제의 원인을 파악해 그에 맞게 메시지를 처리하면 된다.
       
  1. 서버 재시작해서 테스트해보기
    1. notion image
      이전에 email.send.dlt 토픽으로 들어간 메시지가 처리된 걸 확인할 수 있다. 추가로 API 요청을 보내서 테스트를 더 해보자.
       
      notion image
      notion image
      Consumer가 토픽에 들어있는 메시지를 처리하다가 실패하면서, 재시도해서 메시지를 처리하려 했으나 결국 총 5번의 실패로 인해 DLT 토픽으로 메시지를 전달한다. 그래서 DLT 토픽을 처리하는 Consumer가 해당 실패 메시지를 받아 로그 시스템에 전송하고 Slack에 알림까지 발송한 걸 확인할 수 있다.
       
       
👨🏻‍🏫
지금까지 재시도를 했음에도 불구하고 처리에 실패해서, DLT 토픽에 보내지게 된 메시지를 어떻게 처리하는 지 알아봤다.
 
author
JSCODE 박재성
category
Kafka
createdAt
Dec 6, 2025
series
실전에서 바로 써먹는 Kafka 입문
slug
type
series-footer
updatedAt
Dec 6, 2025 05:39 AM
📎
이 글은 실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편) 강의의 수업 자료 중 일부입니다.