Skip to content

Commit

Permalink
feat: Slack 메세지 전송 기능 구현/비동기 설정
Browse files Browse the repository at this point in the history
  • Loading branch information
DWL21 committed Feb 1, 2025
1 parent 0592a6b commit 88978e2
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/main/kotlin/com/yourssu/soongpt/SoongptApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
@@ -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,
)
Original file line number Diff line number Diff line change
@@ -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)
}
Original file line number Diff line number Diff line change
@@ -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()
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.yourssu.soongpt.common.infrastructure.dto

data class SlackAlarmRequest(
val channel: String,
val text: String,
)
Original file line number Diff line number Diff line change
@@ -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())
}
}
}
}

0 comments on commit 88978e2

Please sign in to comment.