Spring/Spring Kafka

Spring Kafka를 사용해 Slack에 메시지 보내기

민철킹 2022. 3. 23. 00:36

🚀 들어가며

입사 후, 첫 업무로 SpringKafka를 연동하고 특정 이벤트에 따라 Slack에 알림을 보내는 일을 맡게되어 학습을 목적으로 간단한 애플리케이션을 만들어 보았다.

 

나는 이번 계기로 Kafka를 처음 사용해보았기 때문에 내가 구현한 방법이 맞다고 확신할 수 없다. 단순 학습 목적임을 염두해주길 바란다.

 

 


 

⚙️ 환경

  • java 17
  • Spring Boot 2.6.4
    • Spring Web
    • Spring Kafka
    • lombok
    • jackson

 

 

✨ Slack Incoming Webhooks

먼저, 슬랙에 메시지를 보내기 위해 Incoming Webhooks라는 슬랙 앱을 사용하였다.

메시지를 전송할 채널의 세부정보로 들어가 앱 추가를 클릭한다.

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

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

 

 

쉽게 말해, 생성된 웹후크 URLPOST 방식의 JSON 요청을 전송하면 해당 채널로 메시지가 전송된다.

 

 

결국은 HTTP 통신으로 동작하고 있기 때문에 매우 다양한 설계가 가능할 것 같다는 생각이 든다.

  • Spring Cloud를 사용해 MSA 구조로 EndPoint를 나눠 Producer ServerConsumer Server로 분리하기(?)

 

 

 

정상적으로 동작하는지를 먼저 확인해보자.

 

위에서 생성된 URLJSONPOST 방식으로 전송하였다.

슬랙으로 메시지가 정상적으로 전송되는 것을 확인할 수 있다.

 

 

관련하여 자세한 내용은 공식 문서를 참조하자. 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

 


아래의 내용부터는 SpringKafka를 다룹니다.

 

🌱 도메인 생성

도메인인 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를 생성하였다.

 

ConsumerSlack Imcoming Webhook URLHTTP Request를 전송해야하기 때문에 SpringRestTemplate를 사용해 로직을 구현하였다.

 

 

RestTemplate의 메서드를 사용하면 간단하게 HTTP 통신을 진행할 수 있다.

 

 

더 자세한 내용은 문서를 참조하자. 

https://www.baeldung.com/spring-resttemplate-post-json

 

 

Product 객체를 받아 원하는 메시지 형태로 가공처리한 후 DTO 클래스에 담아 HttpEntityRestTemplate로 보내주었다.

 

 

이 때, 잘못된 값이 넘어와 JsonProcessingException이 발생할 수 있는 상황에 대비해 실제 프로덕션 코드에서는 예외 처리를 꼼꼼히 해주는 것이 좋을 듯 하다.

 

 

🚀 실행

콘솔창

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

지정된 슬랙 채널로 알림이 잘 전송된 것을 확인할 수 있다.(메시지 포멧팅은 이쁘게 가공처리 가능)

 

 


 

🤔 마치며

맨 처음 언급했듯이 내가 아직 Kafka에 대해 부족하기도 하고 맞는 구현인지는 모르겠다.

 

혹시 이 글을 읽은 분 중에 Kafka에 대해 잘 아시는 분이 있다면 공유해주길 바란다.

반응형