-
슬랙 토큰을 이용해서 알람봇 연동하기개발공부/JAVA 2023. 8. 4. 10:55
회사에서 새로운 서버로 프로젝트 셋팅하는 작업을 진행 중인데 전환하는 과도기 기간 동안
연동 시 문제가 생기면 알람을 받을 수 있도록 해놓으면 좋을 것 같아 찾아보던 중 슬랙 토큰을 이용한 알람봇 연동하는게 있었다
슬랙 알람봇 연동방법은 웹토큰만 있는게 아니라 웹훅도 있는데 회사에서 사용하는 슬랙은 무료판(...)이라 웹훅 사용에 제한이 있어
웹토큰을 이용하여 진행했다
검색하면 다른 블로그에도 잘 정리되어 있지만 오랜만에 글을 쓸 겸 정리해두는게 좋아서 작성해본다
01. 슬랙 chat bot 생성
- https://api.slack.com/apps 접속
- Create an App 클릭
- From scratch 클릭
- app 이름 생성 및 workspace 지정
02. 생성한 app에 권한 부여
- 좌측 OAuto & Permissions 클릭
권한(Authentication) 관련 API 문서
https://api.slack.com/authentication
- Scopes 항목 이동하여 권한 부여
- channels:read → 워크스페이스의 public 채널에 대한 정보 보기
- chat:write → SlackApi로 message 발송
#Scopes 권한
슬랙 채널에 메시지를 보내기 위해서는 chat:write는 반드시 추가해야함 !!
※ 참고
슬랙 채널을 private로 설정한 경우 groups:read Scope를 추가적으로 설정해야함
03. OAuth Tokens을 발급
※슬랙 토큰은 알람봇의 인증키로 사용될 용도니 반드시 외부로 노출해서는 안되고 개인보관을 해야함
Slack의 Bot Token은 xoxb- 형식
04. 알람봇 생성함
생성하면 모자이크 처리된 부분에 토큰이 생성되는데 개인이 잘 저장해야함
05. 채널에 생성한 앱 추가
알람받을 채널을 클릭
통합 > 앱 > 앱추가 생성한 APP 추가
06. 알람 설정 받을 채널 ID 값 얻기- 빨간박스 : 발급받은 토큰 (xoxb로 시작하는~) 입력
- 노란박스 : 버튼 클릭하여 슬랙의 정보 확인
해당 워크스페이스에 존재하는 모든 채널들이 다 나오는데
내가 알람받을 채널의 채널ID 하여 기억해두기
07. chat API 테스트 호출
토큰 및 채널ID (필수값) 및 테스트할 문자 입력해서 채널에 전송
슬랙 채널 내 수신된 메세지 08. 알람 연동 로직
#pom.xml 의존성 추가
<!-- slack bot --> <dependency> <groupId>com.slack.api</groupId> <artifactId>slack-api-client</artifactId> <version>1.20.2</version> </dependency>
#systemproperties에 슬랙 정보 추가
#slack 알람봇 정보 slack.token=xoxb형식의 발급받은 토큰정보 slack.channel=C0로 시작하는 채널 ID
#java 연동 소스
@Slf4j @Service public class SlackService { @Value("${slack.token}") private String SLACK_TOKEN; //전송 토큰 @Value("${slack.channel}") private String SLACK_CHANNEL; //전송 채널 /** * 슬랙채널로 메시지 전송 * @param msg 전송메시지 */ public void sendSlackMessage(String msg) throws Exception { Slack slack = Slack.getInstance(); MethodsClient methods = slack.methods(SLACK_TOKEN); try { if (StringUtils.isEmpty(msg)) { log.info("sendSlackMessage >> !! 수신된 메세지 없음 : {}", msg); msg = ""; } //슬랙 메세지 셋팅 StringBuffer msgError = new StringBuffer(); msgError.append("**** ExceptionError 입니다 ****\n\n"); msgError.append("###서버IP : "); msgError.append(getIp()); msgError.append("\n"); msgError.append("###수신 전문 : "); msgError.append(msg); msgError.append("\n"); //슬랙 메세지 전송 ChatPostMessageRequest request = ChatPostMessageRequest.builder() .channel(SLACK_CHANNEL) .text(msgError.toString()) .build(); ChatPostMessageResponse response = methods.chatPostMessage(request); } catch (Exception e) { log.error("sendSlackMessage >> !! 슬랙 전송 실패 !! " + e.getMessage()); e.printStackTrace(); } } public static String getIp(){ String ip = null; try { ip = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { log.error("getIp >> !! getIp 조회 실패 !! " + e.getMessage()); ip = ""; } return ip; } }
Exception 발생 시 전송한 슬랙 메세지
#발생할 수 있는 이슈
01.워크스페이스 제한으로 실패
##해결
슬랙 무료판의 겨우엔 10개로 제한되어있어 워크스페이에 설치된 앱을 확인하여 필요없는 앱 삭제하면 됨 02. bot 설치 안되는 경우
봇의 사용자를 설정하지 않아 생긴 문제
- Your APP
- 내가 만든 봇 클릭
- 좌측 APP Home > Add Display Name > Edit
- 이름 입력 후 다시 설치
03. 슬랙 알람 연동 테스트 시 정상적으로 수행되지 않는 경우
invalid_auth : Key가 잘못되었거나 #2. Chatbot 생성 에서 이야기했던 Scope의 설정에 chat:write 권한이 적용되지 않았을것이다.
not_in_channel : 입력한 ID의 채널에 해당 알림봇 App이 추가되지 않았을것이다.
channel_not_found : 채널의 ID가 잘못되었을것이다.
#참고 사이트
- https://zzang9ha.tistory.com/400
- https://suzxc2468.tistory.com/197
- https://miaow-miaow.tistory.com/148
- https://bled214.tistory.com/282
- https://velog.io/@yujinaa/Slack-API-Client-Java%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4-Slack%EC%97%90-%EB%A9%94%EC%84%B8%EC%A7%80-%EB%B3%B4%EB%82%B4%EA%B8%B0
'개발공부 > JAVA' 카테고리의 다른 글
input/outputstream 활용한 PDF 다운로드 (0) 2023.02.24 log4j / logback / log4j2 정리 (0) 2022.11.09 [TDD] 예제 테스트 작성 (0) 2022.10.04 [TDD] BDD 스타일의 mockito API (0) 2022.09.28 [TDD] Mock 객체 생성 및 구현 (0) 2022.09.26