컴공생의 다이어리

[스프링 부트, Spring Boot] 슬랙(Slack) webhook으로 메세지 보내기 본문

Development/Spring & SpringBoot

[스프링 부트, Spring Boot] 슬랙(Slack) webhook으로 메세지 보내기

컴공 K 2023. 6. 10. 23:10

[Spring Boot] 슬랙(Slack) webhook으로 메세지 보내기

오늘은 Spring Boot 프로젝트에서 슬랙에 메시지를 보내는 방법에 대해 정리하고자 한다.

 

본격적으로 들어가기 전 아래의 조건이 준비되어 있다는 가정을 하고 설명을 하려고 한다.

  • 슬랙이 설치되어 있고 하나의 워크스페이스에 들어가 있다.
  • 스프링부트 프로젝트의 기본 설정이 되어 있다.

 

슬랙 설정

1. 슬랙 앱에서 webhook을 검색한 후 Incoming WebHooks를 추가한다.

 

 

2. 추가 버튼 클릭 후 어떤 채널에 포스트할지 선택을 한 후 수신 웹후크 통합 앱 추가 버튼을 클릭한다.

 

 

3. 2번에서 버튼 클릭 후 아래와 같은 페이지가 나오는데 설정 지침의 웹후크 URL을 꼭 어디에 복사해둬야 한다. 해당 URL이 메시지를 보내는데 사용된다.

 

4. 3번 페이지에서 아래로 스크롤 하면 통합 앱 설정이 있다. 여기서 아이콘 이미지나 이름 등을 설정할 수 있다. 설정을 마쳤으면 설정 저장을 클릭한다.

 

5. SpringBoot로 메시지 보내기 전 슬랙이 잘 설정되어 있는지 보기 위해서 curl 명령어나 Postman으로 테스트해보면 된다. 윈도우 환경이라 그런가 개인적으로는 Postman이 간편했다.

- curl 명령어

curl -X POST --data-urlencode "payload={\"channel\": \"#_my_etc\", \"username\": \"webhookbot\", \"text\": \"hihihi~\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/${웹후크 주소}

- Postman

 

 

 

 

SpringBoot 설정

1. mvn repository 사이트에서 slack api client를 검색 후 원하는 버전을 선택해서 dependency를 추가해준다.

implementation 'com.slack.api:slack-api-client:1.30.0'

 

 

2. application.yml에 아래와 같이 슬랙 webhook url을 넣어준다.

webhook:
  slack:
    url: ${WEBHOOK_SLACK_URL}

 

3. SlackService 클래스를 아래와 같이 만들어준다.

package com.example.slack.service;

import com.example.slack.config.Color;
import com.slack.api.Slack;
import com.slack.api.model.Attachment;
import com.slack.api.model.Field;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

import static com.slack.api.webhook.WebhookPayloads.payload;

@Service
public class SlackService {
    @Value("${webhook.slack.url}")
    private String SLACK_WEBHOOK_URL;

    private final Slack slackClient = Slack.getInstance();

    /**
     * 슬랙 메시지 전송
     **/
    public void sendMessage(String title, HashMap<String, String> data) {
        try {
            slackClient.send(SLACK_WEBHOOK_URL, payload(p -> p
                    .text(title) // 메시지 제목
                    .attachments(List.of(
                            Attachment.builder().color(Color.GREEN.getCode()) // 메시지 색상
                                    .fields( // 메시지 본문 내용
                                            data.keySet().stream().map(key -> generateSlackField(key, data.get(key))).collect(Collectors.toList())
                                    ).build())))
            );
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Slack Field 생성
     **/
    private Field generateSlackField(String title, String value) {
        return Field.builder()
                .title(title)
                .value(value)
                .valueShortEnough(false)
                .build();
    }
}

 

 

4. 만들어둔 SlackService를 필요한 곳에서 호출해서 사용한다. 나는 아래와 같이 SlackService 테스트 코드를 작성해서 확인했다.

// src/test/java/com/example/slack/service/SlackServiceTest.java

package com.example.slack.service;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;

@SpringBootTest
class SlackServiceTest {
    @Autowired
    SlackService slackService;

    @Test
    @DisplayName("Slack 메시지 전송")
    void sendMessage() {
        String title = "Slack 메시지 전송 테스트";
        HashMap<String, String> data = new HashMap<>();
        data.put("테스트1", "테스트1 내용");
        data.put("테스트2", "테스트2 내용");

        slackService.sendMessage(title, data);
    }
}

 

 

아래 링크는 진행한 스프링부트 프로젝트 샘플 깃허브이다. 블로그 내용 외에도 추가되는 내용이 있을 수 있다.

https://github.com/CodeDiary18-Study/Spring-Boot-Slack-Template

 

GitHub - CodeDiary18-Study/Spring-Boot-Slack-Template

Contribute to CodeDiary18-Study/Spring-Boot-Slack-Template development by creating an account on GitHub.

github.com

 

 

 

 

 

 

 

 

 

 

 

참고

https://shanepark.tistory.com/430

 

[SpringBoot] 에러 발생시 Slack으로 알림 보내기

Intro 토이프로젝트로 단순하게 만들어서 배포 해둔 근무 및 스케줄 관리 웹 어플리케이션이 있습니다. 와이프가 저처럼 매일 매일 출근시간이 정해진게 아니고 쉬프트를 받아 근무를 하다 보니,

shanepark.tistory.com

https://kth990303.tistory.com/438

 

[Spring] 서버 에러 시 Slack Api Client로 슬랙에 알림 보내기

해당 글에서는 slack-api-client 라이브러리 선정 이유, @ControllerAdvice에서 슬랙 연동 방법에 대해 다룹니다. 사이드 프로젝트 `모카콩`의 Wiki에 작성한 글에 해당된다. 해당 프로젝트 github: https://github

kth990303.tistory.com

 

728x90
Comments