롯데의 기술 블로그 글을 보면 다양한 업무에서 슬랙이 필수적으로 자리잡고 있으며 롯데측과의 대화에서도 슬랙에 대한 대단한 자부심이 드러날 만큼 의존하고 있다.
💡 허들이란? 허들은 슬랙의 음성통화 기능으로서 주로 온라인 회의를 진행할때 사용된다.다양한 앱을 연동해 슬랙 사용자간의 빠른 연동이 가능하며 봇을 사용해 운영중인 서버 상태의 대한 추적 및 감시가 가능하다.
슬랙에서 제공하는 다양한 앱을 연동함으로 슬랙 내부적으로 편리하고 빠르게 서비스에 접근이 가능합니다.
추적하는 리포지토리 or 오가니제이션에 변경사항 발생시 알려주는 서비스
/zoom 명령어 하나로 줌방 즉시 생성부터 참여 탈퇴까지 가능하다.
간단하고 빠르게 생성 및 활용이 가능하지만 복잡한 기능을 넣을 수 없다는 단점이 있다.
운영중인 시스템과 연동하여 시스템에서 발생하는 에러 등의 다양한 이벤트를 슬랙을 통해 받을 수 있다.
실제 롯데에서도 이러한 방식으로 사용중이다.
Spring boot 2.3..1
java 1.8 이상
Gradle
Bolt 1.23.0
Bolt for Java 는 최신 플랫폼 기능을 사용하여 Slack 앱을 빠르게 구축할 수 있도록 추상화 계층을 제공하는 JVM의 프레임워크입니다.
dependencies **{
implementation 'com.slack.api:bolt-servlet:1.23.0'
}**
application.properties
// If you would like to run this app for a single workspace,
// enabling this Bean factory should work for you.
@Bean
public AppConfig loadSingleWorkspaceAppConfig() {
return AppConfig.builder()
.singleTeamBotToken(System.getenv("SLACK_BOT_TOKEN"))
.signingSecret(System.getenv("SLACK_SIGNING_SECRET"))
.build();
}
// If you would like to run this app for multiple workspaces,
// enabling this Bean factory should work for you.
// @Bean
public AppConfig loadOAuthConfig() {
return AppConfig.builder()
.singleTeamBotToken(null)
.clientId(System.getenv("SLACK_CLIENT_ID"))
.clientSecret(System.getenv("SLACK_CLIENT_SECRET"))
.signingSecret(System.getenv("SLACK_SIGNING_SECRET"))
.scope("app_mentions:read,channels:history,channels:read,chat:write")
.oauthInstallPath("/slack/install")
.oauthRedirectUriPath("/slack/oauth_redirect")
.build();
}
다양한 이벤트나 특정 조건에서 슬랙으로 메세지를 보내게함으로서 빠르고 쉽게 담당자에게 보고가 가능하다.
@EnableScheduling
@Configuration
publicclassSlackScheduler {
privatefinalSlackService slackService;
publicSlackScheduler(SlackService slackService) {
this.slackService = slackService;
}
// @Scheduled(cron="0 0/1 * * * *") //1분
// public void todayCocktail(){
// slackService.postSlackMessage("안녕..");
// }
@Scheduled(cron = "0 50 * * * ?")
publicvoidbreakTime(){
slackService.postSlackMessage("쉬는 시간~^^");
}
@Scheduled(cron = "0 50 12 ? * MON-FRI")
publicvoidlaunchTime(){
slackService.postSlackMessage("점심 시간~^^");
}
}
(cron = “초 분 시 일 월 년”) 순서
@Component
publicclassStartConfigimplementsCommandLineRunner{
privatefinalSlackService slackService;
publicStartConfig(SlackService slackService) {
this.slackService = slackService;
}
@Override
publicvoidrun(String... args) {
Date date =newDate(System.currentTimeMillis());
//구현 부분
slackService.postSlackMessage("Server started\n이벤트 발생 시간(timestamp) : "+date);
}
}
CommandLineRunner는 main 메서드와 거의 같다고 이해하면 된다. (run 메서드)"스프링 애플리케이션"이 시작할 때 "1회"만 호출되는 점이 똑같고 다른 점은 static이 아니라는 점에서 이득을 가져갈 수 있는 부분이 있다. argument도 main에 들어오는 것과 똑같다
@Component
public class ShutdownEventListener implements ApplicationListener<ContextClosedEvent> {
private final SlackService slackService;
public ShutdownEventListener(SlackService slackService) {
this.slackService = slackService;
}
@Override
public void onApplicationEvent(ContextClosedEvent event) {
Date date = new Date(System.currentTimeMillis());
slackService.postSlackMessage("Server shut down \n 이벤트 발생 시간(timestamp) : "+date);
}
}
ApplicationListener는 이벤트와 관련이 있다. (onApplicationEvent 메서드)ApplicationEvent(추상클래스)를 상속받은 모든 이벤트들을 넣을 수 있다. 따라서 내가 ApplicationEvent를 상속받은 클래스를 만들어서 내가 만든 이벤트가 발생했을 때 호출될 메서드를 만들 수도 있는 것이다. 위의 예제에서는ContextClosedEvent를 감지하는 인터페이스를 구현했기 때문에,애플리케이션이 종료되기 직전에 1회만 호출된다.실무에서 graceful shutdown이 필요할 때 이 메서드를 구현하도록 하자. applicationListener에 ApplicationReadyEvent를 감지하도록 하면 애플리케이션이 온전히 실행되고나서 1회만 호출하도록 할 수 있다.
자바용 슬랙 SDK
스프링 애플리케이션이 시작, 종료될 때 수행할 메서드 지정하는 방법