🚀 들어가며
입사 후, 첫 업무로 Spring과 Kafka를 연동하고 특정 이벤트에 따라 Slack에 알림을 보내는 일을 맡게되어 학습을 목적으로 간단한 애플리케이션을 만들어 보았다.
나는 이번 계기로
Kafka를 처음 사용해보았기 때문에 내가 구현한 방법이 맞다고 확신할 수 없다. 단순 학습 목적임을 염두해주길 바란다.
⚙️ 환경
java 17Spring Boot 2.6.4Spring WebSpring Kafkalombokjackson
✨ Slack Incoming Webhooks
먼저, 슬랙에 메시지를 보내기 위해 Incoming Webhooks라는 슬랙 앱을 사용하였다.
메시지를 전송할 채널의 세부정보로 들어가 앱 추가를 클릭한다.

Incoming Webhooks을 슬랙 채널에 설치하면

아래와 같은 설정 페이지로 접속할 수 있다.

쉽게 말해, 생성된 웹후크 URL로 POST 방식의 JSON 요청을 전송하면 해당 채널로 메시지가 전송된다.
결국은 HTTP 통신으로 동작하고 있기 때문에 매우 다양한 설계가 가능할 것 같다는 생각이 든다.
Spring Cloud를 사용해MSA구조로EndPoint를 나눠Producer Server와Consumer Server로 분리하기(?)
정상적으로 동작하는지를 먼저 확인해보자.
위에서 생성된 URL로 JSON을 POST 방식으로 전송하였다.


슬랙으로 메시지가 정상적으로 전송되는 것을 확인할 수 있다.
관련하여 자세한 내용은 공식 문서를 참조하자. https://api.slack.com/messaging/webhooks
Sending messages using Incoming Webhooks
Creating an Incoming Webhook gives you a unique URL to which you send a JSON payload with the message text and some options.
api.slack.com
아래의 내용부터는
Spring과Kafka를 다룹니다.
🌱 도메인 생성

도메인인 Product와 이를 JSON 형식으로 가공해서 전송할 DTO 클래스를 만들었다.
Product는 DB 테이블과 매핑되어 저장되어 있는 엔티티라고 가정하자
🌱 ProducerFactory 생성

Product라는 도메인을 주고 받아야 하기 때문에 KafkaTemplate을 커스터마이징한다.
Kafka의 기본 포트인 9092를 사용하였고, Key(Topic)는 String, Value(Message)는 JSON으로 전달될 것이기 때문에 해당 Serializer를 설정으로 추가해주었다.
🌱 ConsumerFactory 생성

마찬가지로 Consumer에도 Deserializer를 설정으로 추가해주었다.
🌱 Producer

이번 예제에서는 별도의 Producer 클래스를 생성하지 않았고 단순히 ApplicationRunner를 사용해 커스텀한 KafkaTemplate으로 메시지를 전송하였다.
slack-test라는 토픽으로 Product 객체가 JSON 형식으로 전달된다.
🌱 Consumer

slack-test 토픽을 구독하는 Consumer를 생성하였다.
Consumer가 Slack Imcoming Webhook URL로 HTTP Request를 전송해야하기 때문에 Spring의 RestTemplate를 사용해 로직을 구현하였다.
RestTemplate의 메서드를 사용하면 간단하게 HTTP 통신을 진행할 수 있다.
더 자세한 내용은 문서를 참조하자.
https://www.baeldung.com/spring-resttemplate-post-json
Product 객체를 받아 원하는 메시지 형태로 가공처리한 후 DTO 클래스에 담아 HttpEntity를 RestTemplate로 보내주었다.
이 때, 잘못된 값이 넘어와 JsonProcessingException이 발생할 수 있는 상황에 대비해 실제 프로덕션 코드에서는 예외 처리를 꼼꼼히 해주는 것이 좋을 듯 하다.
🚀 실행

실행 후, 찍힌 로그를 살펴보면 Product 객체가 Consumer에게 잘 전달되었고 Json형식으로 가공되어 전달되었으며 Response Body가 OK로 출력된 것을 확인할 수 있다.

지정된 슬랙 채널로 알림이 잘 전송된 것을 확인할 수 있다.(메시지 포멧팅은 이쁘게 가공처리 가능)
🤔 마치며
맨 처음 언급했듯이 내가 아직 Kafka에 대해 부족하기도 하고 맞는 구현인지는 모르겠다.
혹시 이 글을 읽은 분 중에 Kafka에 대해 잘 아시는 분이 있다면 공유해주길 바란다.