개요

부스트캠프 챌린지 과정에서 출석체크 및 과제 제출 등 여러 활동이 있었는데, 온라인 과정이라 그런지 개발하다가 종종 잊어먹곤 했다. 그 때 자동으로 알람봇을 만들면 좋지 않을까 생각했다. 처음에는 이전에 사용해본 라인을 사용해볼까 하다가, 캠퍼들 모두에게 도움이 되면 좋을거라 생각했다. 그래서 부스트캠프에서 사용하는 Slack에 알람 봇을 하나 만들어 캠퍼와 공유했다.


대략 4주동안 활발히 사용했다. 감사하게도 많은 캠퍼분들이 좋아해주셨고, 내가 느끼던 불편한 문제를 프로그래밍으로 해결하였던 게 뿌듯했다.
당시에 만들면서 과정을 정리를 하지 않았다. 멤버십을 앞둔 지금, 멤버십에 사용할 알람 봇을 만들면서 해당 과정을 정리하려 한다. 자바, 스프링 프레임워크를 활용하여 작성했다. 아래는 전체 코드가 포함된 깃헙 레포이다.
https://github.com/whipbaek/boostMemAlarm
GitHub - whipbaek/boostMemAlarm
Contribute to whipbaek/boostMemAlarm development by creating an account on GitHub.
github.com
Slack App 생성
Slack API를 사용하려면 우선 Slack API app을 생성해야한다. 아래 링크로 들어간 후, 우측 상단의 Your apps 로 진입하자.
Slack은 생산성 플랫폼입니다
Slack은 팀과 커뮤니케이션할 수 있는 새로운 방법입니다. 이메일보다 빠르고, 더 조직적이며, 훨씬 안전합니다.
slack.com


이후에 우측 상단의 create New App을 누른다.

두가지 종류가 있는데 from scracth 선택한다.

앱 네임과, 슬랙내에 원하는 워크스페이스를 설정한다.

생성한 후 좌측에 "OAuth & Permissions" 탭을 눌러 진입한다.

스크롤은 좀 내리면 Scopes 섹션이 존재한다. 여기서 우리의 앱이 허용할 수 있는 행동들을 설정해줄 수 있다. (데이터 읽기, 메세지 쓰기 등등..) 나는 메세지만 보내는 작업만 할것이므로 아래와 같이 몇개만 추가해주었다. (자신이 원하는 행동이 있다면 그에 맞게 찾아보고 설정해주면 된다.)


Scopes 까지 설정을 마쳤다면 위쪽으로 스크롤을 올려 Install to WorkSapce를 클릭하여 봇을 설치해준다. (Scopes를 설정하지 않으면 install 할 수 없음)

그 다음, 봇을 어느 채널에 추가할지를 선택해준다.


그럼 API요청에 사용될 토큰이 반환되며, 봇이 채널에도 정상적으로 추가되는것을 확인할 수 있다.
JAVA 프로젝트 설정

자바와 스프링 부트 버젼은 각각 JAVA 11, SPRING BOOT 2.7 로 설정했다.
이후 Slack API요청을 위한 Depedecny들을 gradle에 추가해준다. (해당 라이브러리 관련한 정보들은 여기서 확인해보자.)

이후 발급받은 Token을 설정 파일(application.yml)에 저장해둔다.

API 요청
https://api.slack.com/methods/chat.postMessage
chat.postMessage API method
Sends a message to a channel.
api.slack.com
Slack의 api의 종류는 굉장히 많고, 위에서 확인해볼 수 있다. 우리가 사용할 API 메소드는 "chatPostMessage" 로, 특정 채널에 메세지를 보내준다. 아래 사진을 보면 해당 메소드를 사용하기 위한 필수 파라미터들을 확인할 수 있다.

- token : 우리가 만든 app에서 발급받은 토큰이다.
- channel : 워크스페이스의 채널이름을 명시해주면 된다. (ex> "부스트알람")
- attachments / blocks / text : 실질적인 데이터가 들어갈 부분이다. 우리는 blocks를 사용할 것이다.
- blocks Slack에서 지원하는 JSON 형태의 데이터이다.
Block Kit?
https://api.slack.com/block-kit
Block Kit
A clean and consistent UI framework for Slack apps
api.slack.com
위의 blocks는 Slack에서 제공하는 Block Kit을 사용하는 것이다.
Block Kit을 간단히 말하자면, 우리가 보내는 메세지에 특정 Action을 넣거나, 원하는 스타일로 편집할 수 있는 툴이라고 보면 된다. 단순히 text만 보내는게 아닌, 사용자가 원하는 형태의 커스터마이징을 지원한다. (마크다운이나, 사진 첨부 등 쉽게 사용)

이 정도의 개념만 잡고, 코드를 작성해보겠다.
PublishingMessage
API 메소드를 요청하는 클래스.

- 우선 @Value 를 활용하여 생성자로 우리가 설정파일에 저장해둔 token을 설정했다
- 다음에는 API요청을 할 함수인 "publishMessage" 를 만들어준다.
- API 메소드를 요청할 수 있는 client라는 객체를 Slack 라이브러리를 통해 가져온다.
- 우리가 원하는 chatPostMessage를 호출하고 필요한 파라미터들을 설정해준다.
- token : 발급받은 토큰
- channel : 워크스페이스의 채널이름 (ex> "부스트알람")
- username : 채널에서 표시되는 봇의 이름을 변경. (optional)
- blocks : 실질적인 데이터를 담는 Block Kit
- text : 사용할 텍스트 데이터를 명시한다. (단, 우리는 실질적인 데이터는 blocks를 사용하기 때문에 이 데이터는 알림창에 표현되는 텍스트를 의미한다.)

* optional 파라미터가 많기 때문에 문서를 확인하고 자신이 필요한 값들을 추가하면 된다.
Block Kit Builder
관건은 우리가 원하는 메세지의 형태를 Block Kit으로 어떻게 구성하느냐인데, Slack에서는 친절하게도
Block Kit Builder 라는 기능을 제공한다. 이 기능을 통하여 원하는 형태의 메세지를 쉽게 구성하고 JSON형태로도 확인할 수 있다.
https://app.slack.com/block-kit-builder/T05E5M15S5R#%7B%22blocks%22:%5B%5D%7D
Slack
nav.top { position: relative; } #page_contents > h1 { width: 920px; margin-right: auto; margin-left: auto; } h2, .align_margin { padding-left: 50px; } .card { width: 920px; margin: 0 auto; .card { width: 880px; } } .linux_col { display: none; } .platform_i
app.slack.com

왼쪽에 자신이 원하는 기능들을 눌러 추가할 수 있고, 메세지의 형태가 중간에 보인다. 그리고 오른쪽에 JSON 형태의 데이터가 표시된다.
단 Java에서는 단순히 JSON을 박으면 안되고, 메소드를 활용하여 설정해주어야 한다. (위 코드를 봐도 알 수 있겠지만..) 만약 마크다운 텍스트를 설정한다면

위와 같이 되는데, 코드상으로는 아래와 같이 작성하면 된다.
.blocks(asBlocks(
section(s -> s.text(markdownText(mt -> mt
.text("This is a mrkdwn section block :ghost: *this is bold*"))))
))
틀만 대충 알면 그 외에 필요한 기능들은 그때마다 찾아보면서 작성할 수 있을거라 생각한다.
Logic

- 스켸쥴링 (@Scheduled) 으로 함수가 반복적으로 실행되게 설정했다.
- 나는 특정 시간마다 API요청을 하고 싶었기에 위와 같이 요일과 시간등을 검사하고 API를 요청하는 방식으로 구성했다. 이런 로직은 자신이 원하는 방향으로 작성하면 된다.

마지막으로 Main함수에서 @EnableScheduling 을 선언해서 서버를 실행시키면 끝이다.
배포
배포는 클라우드타입으로 진행했다. 가벼운 서버를 돌릴때 종종 사용하는데 무료에다가 설정까지 정말 쉬워서 애용한다.
모두의 플랫폼팀, 클라우드타입
클라우드타입은 클라우드 기반 애플리케이션을 빠르게 개발하고 배포할 수 있는 클라우드 애플리케이션 플랫폼입니다.
cloudtype.io

깃헙 레포를 연결해주고, token정보를 넣어주고, 시간대를 설정해준다. 그리고 배포하면 끝!

개발 References
https://api.slack.com/messaging/sending
https://helloworld.kurly.com/blog/slack_block_kit/
https://app.slack.com/block-kit-builder/T05E5M15S5R#%7B%22blocks%22:%5B%5D%7D
https://github.com/slackapi/java-slack-sdk/issues/1069
https://dev-jwblog.tistory.com/114
'개발' 카테고리의 다른 글
MSA 아키텍쳐란? (0) | 2023.09.28 |
---|---|
쿠키 / 세션 / 토큰(JWT) 의 차이는? (0) | 2023.09.27 |
[Typescript] Path alias (import 경로 단축) (0) | 2023.09.19 |
TypeScript는 왜 사용하는 걸까? (0) | 2023.09.11 |
CSR, SSR 이란 (0) | 2023.09.02 |