본문 바로가기
기타

Application To Slack

by sinabeuro 2023. 10. 23.
728x90

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 항목

View messages that directly mention @fulfillment-glow-dev-alarm in conversations that the app is in
Allow fulfillment-glow-dev-alarm to act as an App Agent
View information about ongoing and past calls
Start and manage calls in a workspace
fulfillment-glow-dev-alarm will be able to access contents of canvases created inside Slack.
fulfillment-glow-dev-alarm will be able to create, edit and remove canvases.
Manage public channels that fulfillment-glow-dev-alarm has been added to and create new ones
View basic information about public channels in a workspace
Send messages as @fulfillment-glow-dev-alarm
View basic information about private channels that fulfillment-glow-dev-alarm has been added to
Invite members to private channels
View basic information about direct messages that fulfillment-glow-dev-alarm has been added to
Post messages to specific channels in Slack
View basic information about group direct messages that fulfillment-glow-dev-alarm has been added to
View people in a workspace
Set presence for fulfillment-glow-dev-alarm
 
728x90

'기타' 카테고리의 다른 글

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

댓글