고객 문의 확인을 보조하는 슬랙봇 개발

Slack Bolt for Java를 이용해 슬랙 봇을 개발해 슬랙 채널에 고객 문의가 올라오면 슬랙봇이 문의와 관련된 부가적인 정보를 달아줘 바로 확인할 수 있도록 개선. 사진 참조
Kotlin DSL, 확장 함수를 이용한 코드 가독성 개선. 코드 참조
누구나 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