Skip to content

Commit acce9ad

Browse files
authored
Merge pull request #56 from TeamDMU/feat/sqs
[Feat] SQS ๋ชจ๋“ˆ ์ƒ์„ฑ ํ›„, FCM ๋ชจ๋“ˆ์—์„œ ๋ณ€๊ฒฝ
2 parents d77a422 + bc3695f commit acce9ad

File tree

11 files changed

+145
-2
lines changed

11 files changed

+145
-2
lines changed

โ€Ž.github/workflows/ci.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ jobs:
4141
echo "${{ secrets.MONGO }}" | base64 --decode > ./mongo.yml
4242
working-directory: ./dmforu-infrastructure/storage/mongo/src/main/resources
4343

44+
- name: Create SQS resources directory
45+
run: |
46+
mkdir -p ./dmforu-infrastructure/sqs/src/main/resources
47+
48+
- name: make sqs.yml
49+
run: |
50+
touch ./sqs.yml
51+
echo "${{ secrets.SQS }}" | base64 --decode > ./sqs.yml
52+
working-directory: ./dmforu-infrastructure/sqs/src/main/resources
53+
4454
- name: Create Firebase key resources directory
4555
run: |
4656
mkdir -p ./dmforu-infrastructure/fcm/src/main/resources/key

โ€Ž.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,5 @@ out/
4242
### Configuration Settings ###
4343
**/mongo.yml
4444
**/mysql.yml
45+
**/sqs.yml
4546
**/fire-base-key.json

โ€Ždmforu-admin/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ dependencies {
1313

1414
implementation("org.springframework.boot:spring-boot-starter-web")
1515

16-
runtimeOnly(project(":dmforu-infrastructure:fcm"))
16+
runtimeOnly(project(":dmforu-infrastructure:sqs"))
1717
runtimeOnly(project(":dmforu-infrastructure:storage:mysql"))
1818
runtimeOnly(project(":dmforu-infrastructure:storage:mongo"))
1919

โ€Ždmforu-admin/src/main/kotlin/com/dmforu/admin/AdminApplication.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import java.util.*
88
@SpringBootApplication(
99
scanBasePackages = [
1010
"com.dmforu.admin",
11-
"com.dmforu.fcm",
11+
"com.dmforu.sqs",
1212
"com.dmforu.storage.db.mongo",
1313
"com.dmforu.storage.db.mysql"
1414
]

โ€Ždmforu-admin/src/main/resources/application.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ spring:
77
- mysql.yml
88
- mongo.yml
99
- monitoring.yml
10+
- sqs.yml
1011
web.resources.add-mappings: false
1112

1213
spring.lifecycle.timeout-per-shutdown-phase: 30s
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
dependencies {
2+
compileOnly(project(":dmforu-domain"))
3+
4+
implementation(enforcedPlatform("software.amazon.awssdk:bom:2.21.20"))
5+
implementation("software.amazon.awssdk:sqs")
6+
7+
testImplementation(project(":dmforu-domain"))
8+
testImplementation("org.mockito.kotlin:mockito-kotlin:4.1.0")
9+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.dmforu.sqs
2+
3+
import org.springframework.beans.factory.annotation.Value
4+
import org.springframework.context.annotation.Bean
5+
import org.springframework.context.annotation.Configuration
6+
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials
7+
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider
8+
import software.amazon.awssdk.regions.Region
9+
import software.amazon.awssdk.services.sqs.SqsAsyncClient
10+
11+
@Configuration
12+
class AWSConfig(
13+
@Value("\${cloud.aws.credentials.access-key}")
14+
val accessKey: String,
15+
16+
@Value("\${cloud.aws.credentials.secret-key}")
17+
val secretKey: String,
18+
19+
@Value("\${cloud.aws.sqs.queue.url}")
20+
val queueUrl: String,
21+
22+
@Value("\${cloud.aws.sqs.queue.message-delay-seconds}")
23+
val messageDelaySecs: Int,
24+
) {
25+
26+
@Bean
27+
fun sqsAsyncClient(): SqsAsyncClient {
28+
return SqsAsyncClient.builder()
29+
.region(Region.AP_NORTHEAST_2)
30+
.credentialsProvider(createAwsCredentialsProvider())
31+
.build()
32+
}
33+
34+
private fun createAwsCredentialsProvider(): StaticCredentialsProvider {
35+
val basicAwsCredentials = AwsBasicCredentials.create(accessKey, secretKey)
36+
37+
return StaticCredentialsProvider.create(basicAwsCredentials)
38+
}
39+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.dmforu.sqs
2+
3+
import software.amazon.awssdk.services.sqs.model.MessageAttributeValue
4+
import software.amazon.awssdk.services.sqs.model.SendMessageRequest
5+
6+
object SqsMessageMapper {
7+
8+
fun createRequest(content: String, attributes: Map<String, MessageAttributeValue>, queueUrl: String, delaySeconds: Int): SendMessageRequest {
9+
return SendMessageRequest.builder()
10+
.queueUrl(queueUrl)
11+
.delaySeconds(delaySeconds)
12+
.messageAttributes(attributes)
13+
.messageBody(content)
14+
.build()
15+
}
16+
17+
fun createAttributes(
18+
tokens: List<String>,
19+
title: String,
20+
type: String,
21+
url: String,
22+
): Map<String, MessageAttributeValue> {
23+
val attributes = mutableMapOf<String, MessageAttributeValue>()
24+
25+
attributes["tokens"] = MessageAttributeValue.builder().stringValue(tokens.toString()).dataType("String").build()
26+
attributes["title"] = MessageAttributeValue.builder().stringValue(title).dataType("String").build()
27+
attributes["type"] = MessageAttributeValue.builder().stringValue(type).dataType("String").build()
28+
attributes["url"] = MessageAttributeValue.builder().stringValue(url).dataType("String").build()
29+
30+
return attributes
31+
}
32+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package com.dmforu.sqs
2+
3+
class SqsMessageSendException (message: String, cause: Throwable? = null) : RuntimeException(message, cause)
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.dmforu.sqs
2+
3+
import com.dmforu.domain.message.MessageSender
4+
import com.dmforu.domain.message.NoticeMessage
5+
import com.dmforu.sqs.SqsMessageMapper.createAttributes
6+
import com.dmforu.sqs.SqsMessageMapper.createRequest
7+
import org.springframework.stereotype.Component
8+
import software.amazon.awssdk.services.sqs.SqsAsyncClient
9+
import software.amazon.awssdk.services.sqs.model.SendMessageResponse
10+
import software.amazon.awssdk.services.sqs.model.SqsException
11+
12+
@Component
13+
class SqsMessageSender(
14+
private val sqsAsyncClient: SqsAsyncClient,
15+
private val awsConfig: AWSConfig,
16+
) : MessageSender {
17+
18+
override fun sendNoticeMessage(message: NoticeMessage, tokens: List<String>) {
19+
val attributes = createAttributes(
20+
tokens = tokens,
21+
title = message.title,
22+
type = message.type,
23+
url = message.url
24+
)
25+
26+
val request = createRequest(
27+
content = message.body,
28+
attributes = attributes,
29+
queueUrl = awsConfig.queueUrl,
30+
delaySeconds = awsConfig.messageDelaySecs
31+
)
32+
33+
try {
34+
val future = sqsAsyncClient.sendMessage(request)
35+
36+
future.whenComplete { sendMessageResponse: SendMessageResponse, throwable: Throwable? ->
37+
if (throwable != null) {
38+
throw SqsMessageSendException("[SQS Async Client] ๋ฉ”์„ธ์ง€ ์ „์†ก์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค.", throwable)
39+
}
40+
}
41+
} catch (sqsException: SqsException) {
42+
throw SqsMessageSendException("[SQS] ๋ฉ”์„ธ์ง€ ์ „์†ก์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค.", sqsException)
43+
}
44+
}
45+
46+
47+
}

0 commit comments

Comments
ย (0)