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