https://jojoldu.tistory.com/552
Slack Webhook API 생성하기
요즘 대부분의 개발도구들은 Slack과의 통합 (Integration)을 지원하지만, 여전히 미지원 하는 도구들도 많습니다. 이런 미지원 도구들을 Slack에 연동할때 Slack Webhook을 사용합니다. 저도 종종 사용하
jojoldu.tistory.com
Slack API 참고
https://api.slack.com/methods/conversations.list/test
conversations.list API method
Lists all channels in a Slack team.
api.slack.com
1. Slack WebHooks 생성
앱 생성 https://api.slack.com 에서 시작
https://api.slack.com 접속 > Your apps > Create your first app
Slack 에서 앱 추가를 선택하고 WebHooks 를 선택합니다.
앱 요청을 하면 승인 대기 상태로 변하며,
앱 승인 권한을 가진 분이 승인을 하면, 웹훅을 구성할 수 있습니다.
웹훅을 설정한 후 가장 중요한 웹후크 URL 을 복사합니다.
2. 의존성 추가
// slack api
implementation("com.slack.api:slack-api-client:1.28.0")
// okhttp3
implementation("com.squareup.okhttp3:okhttp:4.10.0")
애플리케이션 gradle 에 slack api 의존성을 추가해줍니다.
3. jobListener 소스코드
@Component
class JobWithAlarmListener : JobExecutionListener {
@Value("\${notification.slack.webhook.url}")
private val slackAlertWebhookUrl = ""
val logger = LoggerFactory.getLogger(this.javaClass.name)
override fun beforeJob(jobExecution: JobExecution) {
val batchName = jobExecution.jobInstance.jobName
try {
val formattedStartTime = jobExecution.startTime.toFormattedString()
val message = "⚪ [$formattedStartTime] $batchName 배치시작"
val slack: Slack = Slack.getInstance()
val response: WebhookResponse = slack.send(
slackAlertWebhookUrl,
Payload
.builder()
.text(message)
.build()
)
if (response.code == 200) {
logger.info("slack message send success: {}", batchName)
} else {
logger.info("slack message send fail: {}", batchName)
}
} catch (e: Exception) {
logger.info("slack message send fail, cause: {}", e.message)
}
}
override fun afterJob(jobExecution: JobExecution) {
val batchName = jobExecution.jobInstance.jobName
val batchStatus = jobExecution.exitStatus.exitCode
try {
val formattedStartTime = jobExecution.startTime.toFormattedString()
val formattedEndTime = jobExecution.endTime.toFormattedString()
val duration = (jobExecution.endTime.time - jobExecution.startTime.time) / 1000
val formattedDuration = String.format("%d분 %d초", duration / 60, duration % 60)
val slack: Slack = Slack.getInstance()
var message = "🟢 $batchName 정상적으로 처리되었습니다!\n"
if (batchStatus != ExitStatus.COMPLETED.exitCode) {
message = "🔴 [$formattedEndTime][$formattedDuration] $batchName 정상적으로 처리되지 않았습니다.\n"
}
val messagePrefix = """
[시작시간]: $formattedStartTime / [소요시간]: $formattedDuration
""".trimIndent()
val response: WebhookResponse = slack.send(
slackAlertWebhookUrl,
Payload
.builder()
.text(message + messagePrefix)
.build()
)
if (response.code == 200) {
logger.info("slack message send success: {}", batchName)
} else {
logger.info("slack message send fail: {}", batchName)
}
} catch (e: Exception) {
logger.info("slack message send fail, cause: {}", e.message)
}
}
}
JobExecutionListener 를 활용해서 배치 시작 전과 배치 종료 후에 실행될 메소드를 생성합니다.
메세지 형식은 자유롭게 생성 하면 됩니다.
slack api 에서 제공하는 send 메소드를 사용하면, OkHttpClient 라이브러리를 통해서 Slack 과 통신하게 됩니다.
4. Slack 결과 메세지
5. chanel Id 와 token 으로 slack app 생성 시
chanel Id 와 token 으로 slack app 생성 시 다음과 같은 추가 설정이 필요합니다.
app 테스트
https://api.slack.com/methods/chat.postMessage/test
https://api.slack.com
Settings > OAuth & Permissions 으로 이동하여 Scopes 에 필요한 Scope 를 add 합니다.
필수 bot 토큰은 다음과 같습니다.
- Bot tokens
- channels:read
- groups:read
- im:read
- mpim:read
참고 scope 항목
'기타' 카테고리의 다른 글
ESLint (0) | 2022.03.25 |
---|---|
jsconfig.json 파일 설정 (0) | 2021.10.10 |
Git 명령어 모음 (0) | 2021.10.10 |
Mongodb 생성 및 연결 (0) | 2021.10.05 |
인텔리제이 UTF-8 인코딩 설정 (0) | 2021.09.07 |
댓글