Android 앱에서 크리티컬한 이슈가 발생하였을때(ex) 인앱 결제 실패, SNS 로그인 실패 등..) 빠른 대응을 하고 싶은 경우가 생겨서 슬랙으로 메시지를 보내는 방법을 생각하게 되었다.
사용 라이브러리
WorkManager : 앱이 종료되거나 기기가 시작될때 또는 네트워크가 연결되어있을때 메시지를 보내기 위해 사용
Retrofit : REST 기반의 웹 서비스를 통해 JSON 구조의 데이터를 쉽게 가져오고 업로드 가능하게 도와주는 라이브러리
설정 및 구현 과정
Slack 설정
- Slack 에서 Webhook을 받을 채널을 추가한다.
Incoming-webhook App을 설치하는 페이지로 이동한다.
Slack에 추가
버튼을 누른 후 Webhook을 받을 채널을 추가 해준다.
- 설정 완료 후에 아래와 같은 화면이 나오는데 웹후크 URL을 통해서 메시지를 보내게 된다.
구현
- incoming webhook document 를 참고해서 request body가 아래와 같다는 것을 알 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"fallback": "첨부 파일이 있음을 알고 있지만 이를 표시하지 않는 클라이언트가 표시하는 첨부 파일에 대한 필수 텍스트 요약입니다.",
"text": "첨부 파일 내에 표시되어야 하는 옵션 텍스트",
"pretext": "서식이 지정된 데이터 위에 표시되어야 하는 옵션 텍스트",
"color": "#36a64f", // 'good', 'warning', 'danger' 또는 16진수 색상 코드 중 하나일 수 있습니다.
// 메시지의 테이블에 필드가 표시됩니다.
"fields": [
{
"title": "필수 필드 제목", // 제목에 태그가 포함되어 있지 않을 수 있으며 자동으로 이스케이프됩니다,
"value": "필드의 텍스트 값입니다. 표준 메시지 태그를 포함할 수 있으며 정상적으로 이스케이프되어야 합니다. 복수 행일 수 있습니다.",
"short": false // `value`가 다른 값과 나란히 표시될 정도로 짧은지를 나타내는 옵션 플래그
}
]
}
- 이를 토대로 POJO 클래스를 구현해준다. 구현 코드는 아래 링크에서 확인할 수 있다.
- WorkManager를 통해서 네트워크 연결 시 해당 Request를 보낼 수 있게 한다. 여기서 setInputData를 통해서 데이터를 Worker class에 전달해 줄 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
internal fun SlackWebHook.sendMessage(context: Context) {
val requestBodyString = Gson().toJson(this)
val webHookWork = OneTimeWorkRequestBuilder<SlackWebHookWorker>()
.setInputData(workDataOf(BODY to requestBodyString))
.setConstraints(getWorkerConstraints())
.build()
WorkManager.getInstance(context.applicationContext).enqueue(webHookWork)
}
private fun getWorkerConstraints(): Constraints {
return Constraints.Builder()
.setRequiredNetworkType(NetworkType.CONNECTED)
.build()
}
- 마지막으로 Worker 클래스에 전송하는 로직을 추가하면 끝난다!
How To Use?
- 쉽게 사용해보고 싶으신 분들을 위해 Maven central에 해당 라이브러리를 올려놨습니다.
Gradle
- 사용하실 application 모듈에 라이브러리를 implement 해줍니다. (X.Y.Z => 최신 버전)
1
2
3
dependencies {
implementation 'io.github.yunjaena:slackwebhookandroid:X.Y.X'
}
Android Manifest
- AndroidManifest.xml에 meta data로 웹후크 URL에서 “https://hooks.slack.com/” 를 제외한 나머지 path를 복사해주세요. (string resource에 선언하시는걸 추천합니다.)
1
2
3
4
<meta-data
android:name="slack_webhook_path"
android:value="services/12345/6789"
/>
Simple Example
- Builder를 사용하여서 보내고 싶은 내용을 세팅하고 send(context)를 통해서 메시지를 보낼 수 있습니다.
1
2
3
4
5
6
7
8
9
SlackWebHook.builder()
.pretext("hello")
.title("this is webhook")
.text("test")
.color("#FF0000")
.timeStampEnabled(true)
.fields("name" to "jason", "github" to "https://github.com/yunjaena")
.build()
.send(this)