프로젝트 설명
프로젝트 소스
Spring boot 으로 초간단하게 Slack Message 보내기를 만들어 보는 프로젝트입니다. 현재는 별다른 기능은 없고 정말 단순하게 메세지 보내는 기능만 있습니다. branch : release-1 에 최대한 가져다 Copy & Paste 하기 쉽게? 만들었습니다. (조금이라도 도움이 되셨다면 start 좀… ) Slack Message 에서 제공하는 3 가지 메세지를 보내 보겠습니다. 포스팅 하단에 Curl로 실제 메세지를 보내 볼 수 있습니다.
앞으로는 프로젝트 특정 시나리오에서 Exception 발생 했을 경우 Slack 으로 에러 메세지가 오게 설정하는 등 다양한 에러 메세지를 Slack 통해서 받아 볼 수 있게 할 예정입니다.
Slack Web Hook 연동
Incoming WebHooks 작업이 완료 됬다고 가정하고 포스팅을 진행하겠습니다. 만약 작업이 완료 되지 않았다면 해당 앱을 설치하고 특정 채널에 알림이 가게 설정해주세요
Slack Message 유형
크게 3 가지 유형이 있습니다. 이미지 형태와 컨트롤러에서 보내 볼 수 받아 볼 수 있는 Curl 하나하나 살펴보습니다.
Basic
이미지
Curl
1 2 3 4 5 6 7 8 curl -X POST \ http://localhost:8080/bot/basic \ -H 'cache-control: no-cache' \ -H 'content-type: application/json' \ -H 'postman-token: db7316c5-3358-0ccc-4de4-03bd7dd307c4' \ -d '{ "text": "text" }'
Attachments
이미지
Curl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 curl -X POST \ http://localhost:8080/bot/button \ -H 'cache-control: no-cache' \ -H 'content-type: application/json' \ -H 'postman-token: 0b503f02-713c-afdc-8c8f-b007c7bfb882' \ -d '{ "text": "Would you like to play a game?", "attachments": [ { "text": "Choose a game to play", "fallback": "You are unable to choose a game", "callback_id": "wopr_game", "color": "#3AA3E3", "attachment_type": "default", "actions": [ { "name": "game", "text": "Chess", "type": "button", "value": "chess" }, { "name": "game", "text": "Falken'\''s Maze", "type": "button", "value": "maze" }, { "name": "game", "text": "Thermonuclear War", "style": "danger", "type": "button", "value": "war", "confirm": { "title": "Are you sure?", "text": "Wouldn'\''t you prefer a good game of chess?", "ok_text": "Yes", "dismiss_text": "No" } } ] } ] }'
Message buttons
이미지
Curl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 curl -X POST \ http://localhost:8080/bot/attachment \ -H 'cache-control: no-cache' \ -H 'content-type: application/json' \ -H 'postman-token: 53d665f3-c1e7-064d-e957-525a703e3965' \ -d '{ "attachments": [ { "fallback": "Required plain-text summary of the attachment.", "color": "#36a64f", "pretext": "Optional text that appears above the attachment block", "author_name": "Bobby Tables", "author_link": "http://flickr.com/bobby/", "author_icon": "http://flickr.com/icons/bobby.jpg", "title": "Slack API Documentation", "title_link": "https://api.slack.com/", "text": "Optional text that appears within the attachment", "fields": [ { "title": "Priority", "value": "High" } ], "image_url": "http://my-website.com/path/to/image.jpg", "thumb_url": "http://example.com/path/to/thumb.png", "footer": "Slack API", "footer_icon": "https://platform.slack-edge.com/img/default_application_icon.png", "ts": 1 } ] }'
Slack Message 만들기
Web Hook 연결
1 2 3 4 5 6 7 8 9 10 11 12 13 14 @Getter public enum SlackTargetEnum { CH_BOT("발급받은 Web Hook URL" , "채널 이름" ); private final String webHookUrl; private final String channel; SlackTargetEnum(String webHookUrl, String channel) { this .webHookUrl = webHookUrl; this .channel = channel; } }
슬랙 Web Hook URL 을 입력해주세요
DTO 만들기
Attachments JSON을 DTO로 만들어 보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 @Getter @NoArgsConstructor public static class Attachments { private List<Attachment> attachments; @Builder public Attachments (List<Attachment> attachments) { this .attachments = attachments; } } @Getter @NoArgsConstructor public static class Attachment { private String fallback; private String color; private String pretext; private String author_name; private String author_link; private String author_icon; private String title; private String title_link; private String text; private String image_url; private String thumb_url; private String footer; private String footer_icon; private Long ts; private List<Field> fields; @Builder public Attachment (String fallback, String color, String pretext, String author_name, String author_link, String author_icon, String title, String title_link, String text, String image_url, String thumb_url, String footer, String footer_icon, Long ts, List<Field> fields) { this .fallback = fallback; this .color = color; this .pretext = pretext; this .author_name = author_name; this .author_link = author_link; this .author_icon = author_icon; this .title = title; this .title_link = title_link; this .text = text; this .image_url = image_url; this .thumb_url = thumb_url; this .footer = footer; this .footer_icon = footer_icon; this .ts = ts; this .fields = fields; } }
Controller
1 2 3 4 @RequestMapping (value = "attachment" , method = POST)public ResponseEntity attachment (@RequestBody SlackMessageDto.Attachments dto) { return ResponseEntity.ok(slackSenderManager.send(SlackTargetEnum.CH_BOT, dto)); }
Slack Web Hook 보내기
1 2 3 4 5 6 7 8 9 public boolean send (SlackTargetEnum target, Object object) { try { restTemplate.postForEntity(target.getWebHookUrl(), writeValueAsString(object), String.class); return true ; } catch (Exception e) { log.error("Occur Exception: {}" , e); return false ; } }
restTemplate 을 이용해서 컨트롤러에서 받은 DTO를 JSON으로 보내주고 있습니다.
마무리
포스팅 내용을 대충 보시고 실제 코드를 보시는 게 더 빨리 이해하실 수 있을 거 같습니다. 최대한 간단하게 만들어서 처음 슬랙 봇을 만드시는 분이 편하게 가져다 쓰기 쉽게 만들어 봤습니다. 해당 프로젝트는 에러 발생시 Slack으로 메세징 받게 이어 나갈거 같습니다. Slack-Message 프로젝트로 다시 찾아 뵙겠습니다.