From 88978e21ae24524d9f466e556cfa569c25a8ac1b Mon Sep 17 00:00:00 2001 From: dwl21 Date: Sat, 1 Feb 2025 00:26:22 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20Slack=20=EB=A9=94=EC=84=B8=EC=A7=80=20?= =?UTF-8?q?=EC=A0=84=EC=86=A1=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84/?= =?UTF-8?q?=EB=B9=84=EB=8F=99=EA=B8=B0=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yourssu/soongpt/SoongptApplication.kt | 4 ++ .../soongpt/common/config/SlackProperties.kt | 8 ++++ .../infrastructure/SlackAlarmFeignClient.kt | 16 ++++++++ .../infrastructure/SlackAlarmProducer.kt | 21 +++++++++++ .../infrastructure/dto/SlackAlarmRequest.kt | 6 +++ .../infrastructure/SlackAlarmProducerTest.kt | 37 +++++++++++++++++++ 6 files changed, 92 insertions(+) create mode 100644 src/main/kotlin/com/yourssu/soongpt/common/config/SlackProperties.kt create mode 100644 src/main/kotlin/com/yourssu/soongpt/common/infrastructure/SlackAlarmFeignClient.kt create mode 100644 src/main/kotlin/com/yourssu/soongpt/common/infrastructure/SlackAlarmProducer.kt create mode 100644 src/main/kotlin/com/yourssu/soongpt/common/infrastructure/dto/SlackAlarmRequest.kt create mode 100644 src/test/kotlin/com/yourssu/soongpt/common/infrastructure/SlackAlarmProducerTest.kt diff --git a/src/main/kotlin/com/yourssu/soongpt/SoongptApplication.kt b/src/main/kotlin/com/yourssu/soongpt/SoongptApplication.kt index c0ee680..78bc737 100644 --- a/src/main/kotlin/com/yourssu/soongpt/SoongptApplication.kt +++ b/src/main/kotlin/com/yourssu/soongpt/SoongptApplication.kt @@ -3,8 +3,12 @@ package com.yourssu.soongpt import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.context.properties.ConfigurationPropertiesScan import org.springframework.boot.runApplication +import org.springframework.cloud.openfeign.EnableFeignClients +import org.springframework.scheduling.annotation.EnableAsync @SpringBootApplication +@EnableFeignClients +@EnableAsync @ConfigurationPropertiesScan class SoongptApplication diff --git a/src/main/kotlin/com/yourssu/soongpt/common/config/SlackProperties.kt b/src/main/kotlin/com/yourssu/soongpt/common/config/SlackProperties.kt new file mode 100644 index 0000000..774af73 --- /dev/null +++ b/src/main/kotlin/com/yourssu/soongpt/common/config/SlackProperties.kt @@ -0,0 +1,8 @@ +package com.yourssu.soongpt.common.config + +import org.springframework.boot.context.properties.ConfigurationProperties + +@ConfigurationProperties(prefix = "slack") +class SlackProperties( + val channelId: String, +) \ No newline at end of file diff --git a/src/main/kotlin/com/yourssu/soongpt/common/infrastructure/SlackAlarmFeignClient.kt b/src/main/kotlin/com/yourssu/soongpt/common/infrastructure/SlackAlarmFeignClient.kt new file mode 100644 index 0000000..54639ed --- /dev/null +++ b/src/main/kotlin/com/yourssu/soongpt/common/infrastructure/SlackAlarmFeignClient.kt @@ -0,0 +1,16 @@ +package com.yourssu.soongpt.common.infrastructure + +import com.yourssu.soongpt.common.infrastructure.dto.SlackAlarmRequest +import org.springframework.cloud.openfeign.FeignClient +import org.springframework.stereotype.Component +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody + +@Component +@FeignClient( + name = "slackAlarmClient", +) +interface SlackAlarmFeignClient { + @PostMapping + fun sendAlarm(@RequestBody request: SlackAlarmRequest) +} \ No newline at end of file diff --git a/src/main/kotlin/com/yourssu/soongpt/common/infrastructure/SlackAlarmProducer.kt b/src/main/kotlin/com/yourssu/soongpt/common/infrastructure/SlackAlarmProducer.kt new file mode 100644 index 0000000..d6a88db --- /dev/null +++ b/src/main/kotlin/com/yourssu/soongpt/common/infrastructure/SlackAlarmProducer.kt @@ -0,0 +1,21 @@ +package com.yourssu.soongpt.common.infrastructure + +import com.yourssu.soongpt.common.config.SlackProperties +import com.yourssu.soongpt.common.infrastructure.dto.SlackAlarmRequest +import org.springframework.scheduling.annotation.Async +import org.springframework.stereotype.Component + +@Component +class SlackAlarmProducer( + private val slackAlarmFeignClient: SlackAlarmFeignClient, + private val slackProperties: SlackProperties, +) { + @Async + fun sendAlarm(message: String) { + try { + slackAlarmFeignClient.sendAlarm(SlackAlarmRequest(channel = slackProperties.channelId, text = message)) + } catch (e: Exception) { + e.printStackTrace() + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/yourssu/soongpt/common/infrastructure/dto/SlackAlarmRequest.kt b/src/main/kotlin/com/yourssu/soongpt/common/infrastructure/dto/SlackAlarmRequest.kt new file mode 100644 index 0000000..65ca2d0 --- /dev/null +++ b/src/main/kotlin/com/yourssu/soongpt/common/infrastructure/dto/SlackAlarmRequest.kt @@ -0,0 +1,6 @@ +package com.yourssu.soongpt.common.infrastructure.dto + +data class SlackAlarmRequest( + val channel: String, + val text: String, +) diff --git a/src/test/kotlin/com/yourssu/soongpt/common/infrastructure/SlackAlarmProducerTest.kt b/src/test/kotlin/com/yourssu/soongpt/common/infrastructure/SlackAlarmProducerTest.kt new file mode 100644 index 0000000..25e2db4 --- /dev/null +++ b/src/test/kotlin/com/yourssu/soongpt/common/infrastructure/SlackAlarmProducerTest.kt @@ -0,0 +1,37 @@ +package com.yourssu.soongpt.common.infrastructure + +import com.yourssu.soongpt.common.support.config.ApplicationTest +import org.junit.jupiter.api.* +import org.mockito.kotlin.any +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.test.context.bean.override.mockito.MockitoBean + +@ApplicationTest +class SlackAlarmProducerTest { + @Autowired + private lateinit var slackAlarmProducer: SlackAlarmProducer + + @MockitoBean + private lateinit var slackAlarmFeignClient: SlackAlarmFeignClient + + @Nested + @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores::class) + inner class sendAlarm_메서드는 { + private val message = "메세지 형식 테스트" + + @Nested + @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores::class) + inner class 메세지가_주어지면 { + @Test + @DisplayName("yaml 파일에 설정된 채널로 슬랙 메세지를 비동기 방식으로 보낸다.") + fun success() { + slackAlarmProducer.sendAlarm(message) + + verify(slackAlarmFeignClient, times(1)) + .sendAlarm(any()) + } + } + } +} \ No newline at end of file