🚀 들어가며
입사 후, 첫 업무로 Spring
과 Kafka
를 연동하고 특정 이벤트에 따라 Slack
에 알림을 보내는 일을 맡게되어 학습을 목적으로 간단한 애플리케이션을 만들어 보았다.
나는 이번 계기로
Kafka
를 처음 사용해보았기 때문에 내가 구현한 방법이 맞다고 확신할 수 없다. 단순 학습 목적임을 염두해주길 바란다.
⚙️ 환경
java 17
Spring Boot 2.6.4
Spring Web
Spring Kafka
lombok
jackson
✨ 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
아래의 내용부터는
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
에 대해 잘 아시는 분이 있다면 공유해주길 바란다.