컴공생의 다이어리
[스프링 부트, Spring Boot] 슬랙(Slack) webhook으로 메세지 보내기 본문
[스프링 부트, 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
참고
https://shanepark.tistory.com/430
https://kth990303.tistory.com/438
'Development > Spring & SpringBoot' 카테고리의 다른 글
[스프링 부트, Spring Boot] 테스트 실행환경 분리 (0) | 2023.09.30 |
---|---|
[스프링 부트, Spring Boot] 환경변수 파일(application.yml) local, dev, prod 환경 분리 (0) | 2023.08.20 |
[MyBatis] parameterType, resultType에 내부 클래스(inner class) 사용 (0) | 2023.04.30 |
[스프링 부트, Spring Boot] 배너 커스텀 및 적용 (0) | 2022.06.22 |
[스프링, Spring] @RequiredArgsConstructor 어노테이션 (0) | 2022.06.01 |