•
Slack Bolt for Java를 이용해 슬랙 봇을 개발해 슬랙 채널에 고객 문의가 올라오면 슬랙봇이 문의와 관련된 부가적인 정보를 달아줘 바로 확인할 수 있도록 개선. 사진 참조
•
•
누구나 Spring에서 슬랙 봇을 만들 수 있도록 Slack Bolt for Java를 감싼 프레임워크를 개발 및 문서화
◦
이후 이 프레임워크를 사용해서 하드웨어 팀 업무를 보조하는 슬랙 봇을 개발
•
AWS CodeBuild, jib를 통해 컨테이너 이미지를 빌드하고 AWS ECR을 통해서 관리
•
AWS ECS Fargate를 이용해서 배포 및 운영
AS-IS, TO-BE
기존 방식
슬랙 봇을 통해 관련된 정보를 손쉽게 확인 가능
Kotlin DSL, 확장 함수를 이용한 코드 가독성 개선
@EventListener(condition = "#wrapper.actionIds.contains('킥보드 로그 보기')")
fun kickboardLog(wrapper: BlockActionWrapper) {
// ...
wrapper.context.postMessage {
channel(wrapper.payload.channel.id)
threadTs(wrapper.payload.container.messageTs)
blocks(
withBlocks {
section {
markdownText("${param.helper}아 보고싶은 이벤트들을 알려줄게")
eventNameSelector(eventNameList, param)
}
},
)
}
}
private fun SectionBlockBuilder.eventNameSelector(eventNameList: List<String>, param: BlockActionValue) = accessory {
multiStaticSelect {
placeholder("이벤트 이름을 선택")
actionId("킥보드 로그 보기 with 이벤트 목록")
options {
eventNameList.forEach {
option {
plainText(text = it, emoji = true)
value(
LogPatternSelectActionValue(
param.helper,
param.useId,
param.deerId,
param.useStartAt,
param.useEndAt,
eventPatternName = it,
).toJsonString(),
)
}
}
}
}
}
@EventListener(condition = "#wrapper.actionIds.contains('킥보드 로그 보기 with 이벤트 목록')")
fun kickboardLogWithEventNames(wrapper: BlockActionWrapper) {
// ...
wrapper.context.postMessage {
channel(wrapper.payload.channel.id)
threadTs(wrapper.payload.container.messageTs)
blocks(
withBlocks {
header { text("이용 시간 동안 발생한 이벤트") }
divider()
selectedEventList(selectedEventNameList)
logList(findLog)
},
)
}
}
private fun LayoutBlockDsl.selectedEventList(selectedEventNameList: List<String>) = context {
elements {
image(
"https://user-images.githubusercontent.com/46379947/173763168-2b367fa7-7b79-4652-95c0-7a8eae6ec15a.png",
altText = "이상한 고양이",
)
markdownText(selectedEventNameList.joinToString(", ") { it })
}
}
private fun LayoutBlockDsl.logList(findLog: List<EnhancedEvents>) = findLog.chunked(5).forEach {
section {
fields {
it.forEach {
markdownText("${it.timestamp.prettyKORStringWithoutYear()} *${summaryEvent(it.data)}*")
markdownText(" ")
}
}
}
}
Kotlin