@senspond

>

개발>백엔드

Java 프로그램으로 Slack에 각 채널 별로 메시지 전송하기

등록일시 : 2024-06-22 (토) 02:07
업데이트 : 2024-06-22 (토) 02:09
오늘 조회수 : 6
총 조회수 : 395

    Slack은 팀 협업 및 커뮤니케이션을 위한 클라우드 기반의 메시징 플랫폼입니다. Java프로그램으로 Slack 메시지 전송 프로그램을 만들어본 것을 정리 해봅니다.

    몇일 전부터 개인적인 목적으로 자동화 시스템을 만들고 있습니다.

    사실 AI 관련해 공부만 하기도 따라가기 벅차고 있는데, 서버도 몇개씩 운영하고 있어 신경쓸 것들이 있어서 입니다.

    이번에는 Slack 메시지 전송 프로그램을 만들어본 것을 정리 해봅니다.


    Slack 이란?

    Slack은 팀 협업 및 커뮤니케이션을 위한 클라우드 기반의 메시징 플랫폼입니다.

    Slack은 다양한 기능과 도구를 제공하여 팀 구성원 간의 실시간 소통과 협업을 보다 효율적으로 할 수 있게 도와주고 IT회사에서 많이 사용하고 있습니다. Jenkins, github, zabbix 등 다양한 애플리케이션과 연동을 할 수가 있습니다.


    Slack WebHook

    Slack WebHook URL 알아오기

    Slack으로 메시지를 전송 하는 자동화 프로그램을 만드려면 먼저 Slack WebHook URL이 필요한데요.


    가장 간단하게 WebHook URL을 받아오는 방법은 Slack에 수신 웹후크 앱을 추가하는 것입니다.




    그리고 아래처럼 가져오는 방법도 있습니다.

    https://api.slack.com/apps




    Slack 채널 ID 알아오는 법

    Slack의 채널 세부정보 보기를 클릭해서 채널의 ID를 알아올 수 있습니다.







    Postman 같은 툴로 HTTP 요청을 보내봐서 알아온 채널 ID로 다른 채널로도 전송이 되는지 확인을 해봅니다.

    curl 명령어로는 아래처럼 사용할 수 있습니다.

    curl -X POST -H 'Content-type: application/json' --data '{"text":"하잉", "channel" : "채널ID"}' \
    [SLACK WEB_HOOK_URL]

    Slack webhook url로 전송해보면 정상으로 메시지 보내기를 성공하면 "ok" 라는 메시지를 보내 주고

    그외의 경우에는 다른 메시지를 주는 것을 확인해볼 수 있습니다.


    만약 타채널로 전송이 안되면 레가시 버전으로 webhook을 만들어야 할 수도 있습니다.


    Java 프로그램

    Slack채널

    @Getter
    @AllArgsConstructor
    public enum SlackChannel {
        RGBIT_REPORT("아이디1"),
        RGBIT_CRAWL("아이디2"),
        RGBIT_KEYWORD("아이디3"),
        RGBIT_WEB("아이디4"),
        RGBIT_BOOK_ORDER("아이디5");
        private String channelId;
    }

    Slack 채널ID 들을 가지고 있는 SlackChannel enum 클래스입니다.


    전송메시지

    @Getter
    @Setter
    @NoArgsConstructor
    @ToString
    public class SlackMessageVo {
        private String channel;
        private String username;
        private String text;
    
        public SlackMessageVo(SlackChannel channel, String name, String text){
            this.channel = channel.getChannelId();
            this.username = name;
            this.text = text;
        }
    }

    Slack WebHook URL 로 HTTP 요청을 보낼 때 사용할 수 있는 필드 들을 모와 클래스로 정의를 했습니다.


    Slack 메시지 전송 기능

    다음은 LazyHolder 싱글톤 패턴으로 구성된 Slack에 메시지를 보내는 기능을 담고 있는 클래스입니다.

    public class SlackNotifyUtils {
        private final String webHookUrl;
        private final RestTemplate restTemplate;
    
        private SlackNotifyUtils(RestTemplate restTemplate, String webHookUrl){
            this.restTemplate = restTemplate;
            this.webHookUrl = webHookUrl;
        }
    
        private static class LazyHolder {
            private static final SlackNotifyUtils INSTANCE =
                    new SlackNotifyUtils(new RestTemplate(),
                            "[Slack Web Hook URL]");
        }
    
        public static SlackNotifyUtils getInstance() {
            return LazyHolder.INSTANCE;
        }
    
        public boolean sendMessage(SlackChannel channel, String name, String message){
            try {
                ResponseEntity<String> response = restTemplate.postForEntity(webHookUrl, 
    												new SlackMessageVo(channel, name, message), String.class);
                return (response.getBody().equals("ok")) ? true : false;
            }catch (Exception e){
                log.error(e.getMessage());
                return false;
            }
        }
    }


    그리고 아래처럼 사용할 수 있습니다.

    SlackNotifyUtils.getInstance().sendMessage(SlackChannel.RGBIT_KEYWORD, "이슈키워드", "손흥민 해트트릭!");


    활용

    이제 프로그램에서 특정 이벤트가 발생했을 때 이벤트리스너로 Slack메시지를 전송하게 만들거나

    @Slf4j
    @Component
    public class MyEventListener {
    
        @Async
        @EventListener
        public void send(MyEvent event) {
    				SlackNotifyUtils slack = SlackNotifyUtils.getInstance();
    
    				// (...)
        }
    }




    배치 스케쥴러에 넣어서 그 결과를 Slack으로 전송하게 만들어 볼 수 있겠습니다.

    예를 들어, rgbitcode 웹 사이트는 매일 새볔 30분에 12시 이전에 발생한 Redis에 기록되어 있는 컨텐츠 조회수 들을 모두 집계해 DB에 업데이트 하는 작업을 수행하고 있는데요. 그때 그 결과를 Slack으로 전송해주도록 적용해 볼 수 있겠습니다.





    또 주기적으로 반복되는 스케쥴러를 통해 관심사인 전자/IT 관련한 최신 뉴스기사들을 Slack으로 전송하도록 만들어 봤습니다.




    그리고 지난번에 만든 메일발송 프로그램과 연결을 해서..

    주문이 들어오면.. 자동으로 사용자가 등록한 이메일로 상품을 보내주는 시스템을 만들어봤습니다.

    정상 발송이 되면 [발송완료], 실패의 경우 [발송실패] 로 Slack으로 알림을 주고

    해당 상품이 준비되어있지 않으면 [미발송] 되었다고 알림을 주고 준비되면 다시 전송하도록 테스트를 해봤네요.


    그런데, 아직 아무런 상품은 준비되어 있지 않지만 말입니다.

    senspond

    안녕하세요. Red, Green, Blue 가 만나 새로운 세상을 만들어 나가겠다는 이상을 가진 개발자의 개인공간입니다.

    댓글 ( 0 )

    카테고리내 관련 게시글

    현재글에서 작성자가 발행한 같은 카테고리내 이전, 다음 글들을 보여줍니다

    @senspond

    >

    개발>백엔드

    • [현재글] Java 프로그램으로 Slack에 각 채널 별로 메시지 전송하기

      Slack은 팀 협업 및 커뮤니케이션을 위한 클라우드 기반의 메시징 플랫폼입니다. Java프로그램으로 Slack 메시지 전송 프로그램을 만들어본 것을 정리 해봅니다.
        2024-06-22 (토) 02:07
      1. Java Spring WebFlux 로 ChatGPT OpenAI Streaming API 만들기 / 자바스크립트에서 스트리밍 요청처리

        Java Spring WebFlux 로 ChatGPT OpenAI Streaming API 만들고 자바스크립트에서 스트리밍 요청처리를 하는 방법을 정리해봅니다.
          2024-06-23 (일) 01:35
        1. 제미나이(Gemini) API 를 사용하는 두가지 방법 GCP Vertext AI, Google AI Studio

          제미나이(Gemini) API 를 사용하는 두가지 방법에 대해서 정리해봤습니다. 바로 GCP Vertext AI 와 Google AI Studio 를 사용하는 방법입니다.
            2024-06-24 (월) 10:29
          1. 파이썬 백엔드 Fast API gunicorn 으로 구동하기 ( WSGI, ASGI, uvicorn 한계 정리)

            파이썬 백엔드 Fast API gunicorn 으로 구동하기 ( WSGI, ASGI, uvicorn 한계 정리)
              2024-02-21 (수) 07:21
            1. 네이버 이메일 SMTP 프로토콜로 이메일 발송 프로그램 만들기 ( jakarta.mail )

              개인목적으로 자동화에 활용 할 메일발송 프로그램을 Java기반으로 jakarta Mail로 만들어 보며 정리를 해보았습니다.
                2024-06-21 (금) 01:23