예전에는 서비스를 운영하다 보면 직원들에게 알림(장애, 배치, 반영 등)을 알려주기 위해 메시지를 보내거나 하였지만, 최근에는 대부분 슬랙(Slack)이란 메신저를 사용한다.
대부분의 회사가 초기에 구축을 해두어, 업무시에는 간단한 양식을 추가하여 사용하고 있는데, 실제 구축하여 연동을 해보고자 하였다.
이번 글에서는 백엔드를 스프링부트로 하여 간단하게 슬랙을 연동해보도록 하겠다.
1. Slack Bot 생성하기
- 기본적으로 Slack에는 가입되어 있다고 가정하고 진행합니다.
- 아래 사이트를 통해서 메시지를 보낼 Slack Bot을 생성합니다.
- 위 링크에 접속하여 우측 상단의 [Your apps] 를 클릭합니다.
- [Create New App] 을 클릭하고, [From scratch] 를 클릭합니다.
- 사용하고자 하는 앱 이름(App Name)을 작성합니다.(슬랙 채널에서 Bot이 보낼 때의 이름)
- 해당 슬랙 봇을 사용하고자 하는 워크스페이스를 선택합니다.(워크스페이스가 없다면 새로 생성합니다.)
- 생성이 되었다면, 아래 그림처럼 [Bots] 을 선택합니다.
2. Slack Bot 설정하기
- slack bot을 생성하였다면, 다음으로 설정을 합니다.
- 좌측 메뉴 중 [OAuth & Permissions] 를 선택합니다.
- [Scopes] -> [Bot Token Scopes] 에 다음의 scope 을 추가합니다.
- chat:write
- channels:read
- Scope 설정이 되었다면, 토큰을 발급받습니다.
- 발급받은 토큰을 확인합니다.
- 해당 토큰은 spring boot 에서 통신을 위해 사용됩니다.
3. Slack 채널에 슬랙봇 추가하기
- 생성한 슬랙봇을 연동하고자 하는 채널(Channel)에 추가합니다.
- 채널을 선택 후 채널 설정을 들어가 [통합] -> [앱] -> [앱 추가] 를 클릭하여, 슬랙봇(Slack Bot)을 추가합니다.
- 정상적으로 추가가 되었다면, 해당 채팅방에 아래와 같은 문구를 확인할 수 있습니다.
4. SpringBoot 설정 & 개발하기
4-1. 설정하기
- 슬랙 API를 사용하기 위해 Dependency 를 추가합니다.
dependencies {
implementation("com.slack.api:bolt:1.18.0")
implementation("com.slack.api:bolt-servlet:1.18.0")
implementation("com.slack.api:bolt-jetty:1.18.0")
}
- 최신 버전 또는 자세한 내용은 아래 공식 사이트에서 확인 가능합니다.
- https://slack.dev/java-slack-sdk/guides/getting-started-with-bolt#gradle
- 2번에서 생성한 SlackBot 토큰을 SpringBoot 프로젝트의 properties 또는 yaml(yml) 로 관리하도록 합니다.(application.yml)
- 나중에 소스에서 @Value 어노테이션을 사용하여 해당 값을 불러오도록 합니다.
4-2. 연동하기
- 여러 채널을 사용하기 위해 상수 클래스를 생성하여 관리하도록 합니다.(만약 1개의 채널만 사용하고자 한다면, 위 properties 파일에 추가하여 사용하여도 무방합니다.)
public class SlackConstant {
// Slack에 생성된 채널명을 작성합니다.
public static final String ERROR_CHANNEL = "#장애확인";
public static final String BATCH_CHANNEL = "#배치확인";
}
- Slack API를 구현하는 SlackService 를 작성합니다.
@Service
@Slf4j
public class SlackService {
@Value(value = "${slack.token}")
String slackToken;
public void sendSlackMessage(String message, String channel){
String channelAddress = "";
// 채널 값을 전달받아 올바른 슬랙채널로 분기
if(channel.equals("error")){
channelAddress = SlackConstant.ERROR_CHANNEL;
} else if(channel.equals("batch")){
channelAddress = SlackConstant.BATCH_CHANNEL;
}
try{
MethodsClient methods = Slack.getInstance().methods(slackToken);
ChatPostMessageRequest request = ChatPostMessageRequest.builder()
.channel(channelAddress)
.text(message)
.build();
methods.chatPostMessage(request);
log.info("Slack " + channel + " 에 메시지 보냄");
} catch (SlackApiException | IOException e) {
log.error(e.getMessage());
}
}
}
- Slack API 가 제공하는 MethodsClient 객체를 이용하여 발급받은 슬랙 토큰(token)을 지정합니다.
- ChatPostMessageRequest 객체를 이용해 보내고자 하는 채널과 메시지를 세팅하고 메시지를 요청합니다.
- 해당 API에 대해서는 공식 사이트를 통해 더욱 다양하게 활용할 수 있습니다.
- 간단하게 테스트를 위해서 controller 를 작성합니다.
@Controller
@RequiredArgsConstructor
@Slf4j
public class SlackTestController {
@Autowired
SlackService slackService;
@GetMapping("/slack/error")
public void error(){
log.info("슬랙 error 채널 테스트");
slackService.sendSlackMessage("슬랙 에러 테스트", "error");
}
@GetMapping("/slack/batch")
public void batch(){
log.info("슬랙 batch 채널 테스트");
slackService.sendSlackMessage("슬랙 배치 테스트", "batch");
}
}
- 간단하게 메시지와 보내고자 하는 채널의 값을 전달합니다.
- Springboot를 실행하여 간단하게 테스트해봅니다.(http://localhost:8080/slack/error , http://localhost:8080/slack/batch)
- 간단하게 Scheduler 도 작성하여 테스트해봅니다.
@RequiredArgsConstructor
@EnableScheduling
@Configuration
public class SlackBatch {
@Autowired
SlackService slackService;
@Scheduled(cron="0 0/1 * * * *") //1분
public void batchTest(){
slackService.sendSlackMessage("1분마다 배치 실행되고 있다.", "batch");
}
}
- SpringBoot 프로젝트를 실행하여 확인합니다.
5. 번외
- Slack 과 연동하는 방법으로는 웹후크(webhook)도 있습니다.
- 해당 글에서는 간단하게 연동 확인을 위해 controller 에다가 간단하게 작성하여 확인하였는데, 대부분 실무에서는 모니터링(장애 발생, 에러로깅, 배치 등)에서 사용됩니다.
- 실무에서는 logback 과 연동, filter, exception 에서 구현 등을 통해 연동합니다.
- 메시지 템플릿(Json, markdown 등)도 다양하게 설정하여 보낼 수 있습니다.(공식 사이트 참고)
참고
'BackEnd > Spring' 카테고리의 다른 글
[Spring] JPA 정리 (0) | 2022.07.22 |
---|---|
[Spring] 의존성 주입(DI) 시 생성자 주입(Constructor Injection)을 사용해야하는 이유 (2) | 2022.07.17 |
[Spring] 문자열 유효성 검사(isEmpty(),hasText()) (0) | 2022.07.03 |
[Spring] @Component 어노테이션을 사용한 싱글톤패턴 유사 구현 (0) | 2022.01.16 |
[SpringBoot] 간단하게 에러페이지 설정하기 (0) | 2021.05.16 |