[Spring] Spring Scheduler 이용하여 Slack 자동 알림 구현하기 (Slack 연동)

 

 

 

 

SpringBoot + Slack

 

 

 

1. Slack Bot 생성하기

 https://api.slack.com/

 

Slack은 생산성 플랫폼입니다

Slack은 팀과 커뮤니케이션할 수 있는 새로운 방법입니다. 이메일보다 빠르고, 더 조직적이며, 훨씬 안전합니다.

slack.com

edited_edited_WM-Screenshots-20230720140824.png

 

사이트에 접속하여 'Your apps'를 클릭합니다.

 

 

 

 

edited_WM-Screenshots-20230720141143.png

 

'Create an App'을 클릭합니다.

 

 

 

 

edited_WM-Screenshots-20230720141149.png

 

'From scratch'를 클릭합니다.

 

 

 

 

edited_WM-Screenshots-20230720141442.png

 

App Name에는 사용할 Bot의 이름을 입력해주고

사용할 Workspace를 선택해줍니다.

그 후 'Create App' 버튼을 눌러줍니다.

(저는 Test라는 이름으로 만들겠습니다.)

 

 

 

 

edited_WM-Screenshots-20230720141823.png

Basic Information - Building Apps for Slack에서 하단에 'Bots' 버튼을 눌러줍니다.

 

 

 

 

 

edited_WM-Screenshots-20230720142050.png

 

'Review Scopes to Add' 버튼을 눌러줍니다.

 

 

 

 

 

edited_WM-Screenshots-20230720142443.png

아래로 스크롤을 내리다보면, Scopes 메뉴가 있습니다.

Bot Token Scopes의 'Add an OAuth Scope' 버튼을 눌러줍니다.

 

 

● OAuth는 사용자가 애플리케이션에 로그인한 후,

해애플리케이션이 사용자의 계정 정보 또는 다른 리소스에 접근할 수 있는 권한을 얻기 위해 사용되는 인증 프레임워크.

OAuth 스코프(scope)는 사용자가 애플리케이션에서 수행할 수 있는 작업, 액세스할 수 있는 리소스의 범위를 정의합니다.

 

 

 

 

WM-Screenshots-20230720142502.png

 

아래로 스크롤을 내리다보면 아래 두가지 scope가 나오게 될 것이고 클릭하여 추가합니다.

1) chat:write

2) channels:read

 

 

 

 

edited_edited_WM-Screenshots-20230720142528.png

 

 추가해주시면 이렇게 나옵니다.

 

 

 

 

 

edited_WM-Screenshots-20230720142604.png

 

 다시 상단으로 스크롤을 올려, 'Install to Workspace' 버튼을 눌러 Bot을 Workspace에 설치해줍니다.

 

 

 

 

 

edited_WM-Screenshots-20230720142612.png

 '허용' 버튼을 눌러 권한 요청을 수락합니다.

 

 

 

 

edited_WM-Screenshots-20230720143939.png

 

그럼 이렇게 OAuth Token이 발급됩니다.

 

 

 

 

 

 

 

 

2. Bot을 Slack 채널에 추가하기

 

 

edited_WM-Screenshots-20230720144318.png

 

 Slack 앱을 실행시킨 후,

Slack Bot을 연동할 채널에 오른쪽 마우스를 클릭하여 '채널 세부정보 보기'를 클릭합니다

 

 

 

 

 

edited_WM-Screenshots-20230720144513.png

 

통합 탭의 '앱 추가' 버튼을 눌러줍니다.

 

 

 

 

 

edited_WM-Screenshots-20230720144842.png

 

아까 만들었던 Bot을 '추가' 버튼을 눌러서 추가해줍니다.

 

 

 

 

edited_WM-Screenshots-20230720145024.png

 

성공적으로 추가된 경우 위와 같은 메시지가 채팅창에 출력됩니다.

 

 

 

3. Spring Boot 코드 작성하기

본 코드 작성 과정은 IntelliJ 및 Gradle을 사용하였습니다.

 


1. build.Gradle에서 아래 dependencies를 추가합니다.

dependencies {
  implementation("com.slack.api:bolt:1.30.0")
  implementation("com.slack.api:bolt-servlet:1.30.0")
  implementation("com.slack.api:bolt-jetty:1.30.0")
  implementation("org.slf4j:slf4j-simple:1.7.36")
}

 

 

2. application.yml에서 아래 코드를 추가합니다.

bot-token : 뒤에는 아까 발급된 OAuth Token을 Copy하여 붙여넣습니다.

target-channel: 뒤에는 앱추가를 실시한 채널명을 입력합니다. (# 반드시 붙여야합니다.)

("" 큰따옴표 안에 필요로 하는 값을 입력해줍니다.)

 

→ 만약 여러채널에 사용하고 싶다면 Class를 만들어서 그곳에서 값을 받아오는 식으로 해야할 것입니다.

slack:
  bot-token: "복사해서 붙여넣기"
  target-channel: "20230707"

 

 

 

3. Service (SlackMessageService.java)를 만듭니다.

@Service
//서비스 계층임을 알려주는 어노테이션

public class SlackMessageService {
    private final String slackBotToken;
    private final String targetChannel;

    public SlackMessageService(@Value("${slack.bot-token}") String slackBotToken, @Value("${slack.target-channel}") String targetChannel){
        this.slackBotToken = slackBotToken;
        this.targetChannel = targetChannel;
    }
    //@Value 어노테이션으로 application.yml에서 입력해준 bot-token과 target-channel 값 가져옴
    

    public void sendSlackMessage(String message){
        Slack slack = Slack.getInstance();

        try{
            slack.methods().chatPostMessage(
                    ChatPostMessageRequest.builder()
                            .token(slackBotToken)
                            .channel(targetChannel)
                            .text(message)
                            .build()
            );
            System.out.println("메시지 전송 성공");
        } catch (IOException | SlackApiException e){
            System.out.println("메시지 전송 실패" + e.getMessage());
        }
// 예외 처리
    }
}

 

 

 

4. SlackMessageApplication에 아래 어노테이션을 추가합니다.

@EnableScheduling
// 스케쥴링 기능을 사용하기 위해 작성해줍니다.
// 이 코드로 인해 코드가 실행이 된다면 자동으로 스케쥴링된 내용이 실행됩니다.

@SpringBootApplication
public class SlackMessageApplication {

    public static void main(String[] args) {
        SpringApplication.run(SlackMessageApplication.class, args);
    }

}

 

 

5. Controller (SlackMessageController.java)를 작성합니다.

@Component
// Bean에 등록해줍니다.
public class SlackMessageController {

    private final SlackMessageService slackMessageService;

    public SlackMessageController(SlackMessageService slackMessageService){
        this.slackMessageService = slackMessageService;
// 생성자를 통해 의존성 주입
    }

    @Scheduled(cron = "*/2 * * * * *")
//@Scheduled 어노테이션을 통해 스프링 스케쥴러를 사용함.
// cron 표현식으로 매 2초마다 스케쥴이 작동되도록함.

    public void sendSlackMessageRegularly(){
        slackMessageService.sendSlackMessage("개발용사 준기");
//sendSlackMessageRegularly 메소드는 slackMessageService의 sendSlackMessage 메소드 값을 반환
    }
}

 

 

 

 

6. 작동 확인

edited_WM-Screenshots-20230724113203.png

Slack에 2초마다 메시지가 오는 것이 확인되고

 

 

edited_WM-Screenshots-20230724113233.png

 

콘솔 내에서도 메시지가 발송될 때마다 '메시지 전송 성공'이라는 메시지가 발송됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2023.07.19 - [Spring] - [Spring] Batch와 Scheduler

 

[Spring] Batch와 Scheduler

Scheduler (스케쥴러) 1) Scheduler의 개념과 목적 ● 개념 정해진 시간에 작업을 실행하거나 주기적으로 반복 작업을 수행하는 역할 ● 목적 일정한 시간에 특정 작업을 실행하여 비즈니스 프로세스

devwarriorjungi.tistory.com