From 368b82b7fbcb7a85271d491ddc4bce32da137c0c Mon Sep 17 00:00:00 2001 From: Park Yun Chan Date: Wed, 28 Aug 2024 23:53:59 +0900 Subject: [PATCH] =?UTF-8?q?FCM=20=EC=95=8C=EB=A6=BC=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20SQS=20+=20Lambda=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81=20(#238)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feature: SQS + lambda 사용하여 Fcm 알림 구현 * sqsProperties 추가 * fix: test코드 SqsAutoConfiguration Exclude처리 * fix: FcmMessage record로 수정 및 createBatches 수정 --- build.gradle | 5 + .../domain/fcm/api/FcmController.java | 18 ---- .../application/FcmNotificationService.java | 35 +++++-- .../domain/fcm/application/FcmService.java | 98 ------------------- .../domain/fcm/domain/FcmMessage.java | 8 ++ .../sqs/application/SqsMessageService.java | 87 ++++++++++++++++ .../stonebed/global/config/fcm/FcmConfig.java | 39 -------- .../stonebed/global/config/sqs/SqsConfig.java | 28 ++++++ .../infra/properties/FcmProperties.java | 6 -- .../infra/properties/PropertiesConfig.java | 2 +- .../infra/properties/SqsProperties.java | 6 ++ src/main/resources/application-cloud.yml | 7 ++ src/main/resources/application.yml | 3 - .../stonebed/StonebedApplicationTests.java | 7 ++ .../FcmNotificationServiceTest.java | 2 - .../application/FcmScheduledServiceTest.java | 2 - .../fixtureMonkeyTest/TestFixtureMonkey.java | 7 ++ 17 files changed, 181 insertions(+), 179 deletions(-) delete mode 100644 src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmService.java create mode 100644 src/main/java/com/depromeet/stonebed/domain/fcm/domain/FcmMessage.java create mode 100644 src/main/java/com/depromeet/stonebed/domain/sqs/application/SqsMessageService.java delete mode 100644 src/main/java/com/depromeet/stonebed/global/config/fcm/FcmConfig.java create mode 100644 src/main/java/com/depromeet/stonebed/global/config/sqs/SqsConfig.java delete mode 100644 src/main/java/com/depromeet/stonebed/infra/properties/FcmProperties.java create mode 100644 src/main/java/com/depromeet/stonebed/infra/properties/SqsProperties.java diff --git a/build.gradle b/build.gradle index 244ce2cd..f15b873f 100644 --- a/build.gradle +++ b/build.gradle @@ -97,6 +97,11 @@ dependencies { // FCM implementation 'com.google.firebase:firebase-admin:9.3.0' implementation 'com.fasterxml.jackson.core:jackson-core:2.16.1' + + // SQS + implementation platform("io.awspring.cloud:spring-cloud-aws-dependencies:3.0.1") + implementation 'io.awspring.cloud:spring-cloud-aws-starter-sqs' + implementation 'software.amazon.awssdk:sqs' } tasks.named('test') { diff --git a/src/main/java/com/depromeet/stonebed/domain/fcm/api/FcmController.java b/src/main/java/com/depromeet/stonebed/domain/fcm/api/FcmController.java index d93bb16c..10a8db96 100644 --- a/src/main/java/com/depromeet/stonebed/domain/fcm/api/FcmController.java +++ b/src/main/java/com/depromeet/stonebed/domain/fcm/api/FcmController.java @@ -1,19 +1,14 @@ package com.depromeet.stonebed.domain.fcm.api; import com.depromeet.stonebed.domain.fcm.application.FcmNotificationService; -import com.depromeet.stonebed.domain.fcm.application.FcmService; import com.depromeet.stonebed.domain.fcm.application.FcmTokenService; -import com.depromeet.stonebed.domain.fcm.dto.request.FcmSendRequest; import com.depromeet.stonebed.domain.fcm.dto.request.FcmTokenRequest; import com.depromeet.stonebed.domain.fcm.dto.response.FcmNotificationResponse; -import com.depromeet.stonebed.global.util.FcmNotificationUtil; -import com.google.firebase.messaging.Notification; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; -import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; @@ -31,22 +26,9 @@ @RequestMapping("/alarm") @RequiredArgsConstructor public class FcmController { - private final FcmService fcmService; private final FcmTokenService fcmTokenService; private final FcmNotificationService fcmNotificationService; - @Operation(summary = "푸시 메시지 전송", description = "저장된 모든 토큰에 푸시 메시지를 전송합니다.") - @PostMapping("/send") - public ResponseEntity pushMessageToAll( - @RequestBody @Validated FcmSendRequest fcmSendRequest) { - Notification notification = - FcmNotificationUtil.buildNotification( - fcmSendRequest.title(), fcmSendRequest.body()); - List tokens = fcmTokenService.getAllTokens(); - fcmService.sendMulticastMessage(notification, tokens); - return ResponseEntity.ok().build(); - } - @Operation(summary = "FCM 토큰 저장", description = "로그인 시 FCM 토큰을 저장합니다.") @PostMapping("/token") public ResponseEntity fcmTokenStore( diff --git a/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationService.java b/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationService.java index 61d61966..89704fba 100644 --- a/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationService.java +++ b/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationService.java @@ -2,6 +2,7 @@ import com.depromeet.stonebed.domain.fcm.dao.FcmNotificationRepository; import com.depromeet.stonebed.domain.fcm.dao.FcmRepository; +import com.depromeet.stonebed.domain.fcm.domain.FcmMessage; import com.depromeet.stonebed.domain.fcm.domain.FcmNotification; import com.depromeet.stonebed.domain.fcm.domain.FcmNotificationType; import com.depromeet.stonebed.domain.fcm.domain.FcmToken; @@ -11,12 +12,11 @@ import com.depromeet.stonebed.domain.missionRecord.dao.MissionRecordBoostRepository; import com.depromeet.stonebed.domain.missionRecord.dao.MissionRecordRepository; import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecord; +import com.depromeet.stonebed.domain.sqs.application.SqsMessageService; import com.depromeet.stonebed.global.common.constants.FcmNotificationConstants; import com.depromeet.stonebed.global.error.ErrorCode; import com.depromeet.stonebed.global.error.exception.CustomException; -import com.depromeet.stonebed.global.util.FcmNotificationUtil; import com.depromeet.stonebed.global.util.MemberUtil; -import com.google.firebase.messaging.Notification; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.IntStream; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -35,7 +36,7 @@ @RequiredArgsConstructor @Transactional public class FcmNotificationService { - private final FcmService fcmService; + private final SqsMessageService sqsMessageService; private final FcmNotificationRepository notificationRepository; private final MissionRecordBoostRepository missionRecordBoostRepository; private final MissionRecordRepository missionRecordRepository; @@ -151,17 +152,18 @@ private FcmNotificationConstants determineNotificationType(Long totalBoostCount) private void sendBoostNotification( MissionRecord missionRecord, FcmNotificationConstants notificationConstants) { - Notification notification = - FcmNotificationUtil.buildNotification( - notificationConstants.getTitle(), notificationConstants.getMessage()); - String token = fcmRepository .findByMember(missionRecord.getMember()) .map(FcmToken::getToken) .orElseThrow(() -> new CustomException(ErrorCode.FAILED_TO_FIND_FCM_TOKEN)); - fcmService.sendSingleMessage(notification, token); + FcmMessage fcmMessage = + FcmMessage.of( + notificationConstants.getTitle(), + notificationConstants.getMessage(), + token); + sqsMessageService.sendMessage(fcmMessage); saveNotification( FcmNotificationType.BOOSTER, @@ -204,10 +206,23 @@ private List buildNotificationList( } public void sendAndNotifications(String title, String message, List tokens) { - Notification notification = FcmNotificationUtil.buildNotification(title, message); - fcmService.sendMulticastMessage(notification, tokens); + List> batches = createBatches(tokens, 10); + + for (List batch : batches) { + sqsMessageService.sendBatchMessages(batch, title, message); + } List notifications = buildNotificationList(title, message, tokens); notificationRepository.saveAll(notifications); } + + private List> createBatches(List tokens, int batchSize) { + return IntStream.range(0, (tokens.size() + batchSize - 1) / batchSize) + .mapToObj( + i -> + tokens.subList( + i * batchSize, + Math.min(tokens.size(), (i + 1) * batchSize))) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmService.java b/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmService.java deleted file mode 100644 index 1f81f500..00000000 --- a/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmService.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.depromeet.stonebed.domain.fcm.application; - -import com.depromeet.stonebed.domain.fcm.domain.FcmResponseErrorType; -import com.google.firebase.messaging.*; -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.List; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Slf4j -@Service -@RequiredArgsConstructor -public class FcmService { - private static final int BATCH_SIZE = 500; - - private final FcmTokenService fcmTokenService; - - @Transactional(readOnly = true) - public void sendMulticastMessage(Notification notification, List tokens) { - int totalTokens = tokens.size(); - - for (int i = 0; i < totalTokens; i += BATCH_SIZE) { - List batchTokens = tokens.subList(i, Math.min(i + BATCH_SIZE, totalTokens)); - MulticastMessage message = buildMulticastMessage(notification, batchTokens); - sendMessage(message, batchTokens); - } - - log.info("전체 메세지를 일괄 전송했습니다. 총 메세지 수: {}", totalTokens); - } - - private MulticastMessage buildMulticastMessage(Notification notification, List tokens) { - HashMap data = new HashMap<>(); - data.put("time", LocalDateTime.now().toString()); - - return MulticastMessage.builder() - .putAllData(data) - .setNotification(notification) - .addAllTokens(tokens) - .build(); - } - - private void sendMessage(MulticastMessage message, List tokens) { - try { - BatchResponse response = FirebaseMessaging.getInstance().sendMulticast(message); - handleBatchResponse(response, tokens); - } catch (FirebaseMessagingException e) { - log.error("FCM 메시지 전송에 실패했습니다: ", e); - } - } - - private void sendMessage(Message message) { - try { - String response = FirebaseMessaging.getInstance().send(message); - log.info("성공적으로 메시지를 전송했습니다. 메시지 ID: {}", response); - } catch (FirebaseMessagingException e) { - log.error("FCM 메시지 전송에 실패했습니다: ", e); - } - } - - public void sendSingleMessage(Notification notification, String token) { - Message message = buildSingleMessage(notification, token); - sendMessage(message); - } - - private Message buildSingleMessage(Notification notification, String token) { - HashMap data = new HashMap<>(); - - return Message.builder() - .putAllData(data) - .setNotification(notification) - .setToken(token) - .build(); - } - - private void handleBatchResponse(BatchResponse response, List tokens) { - response.getResponses().stream() - .filter(sendResponse -> !sendResponse.isSuccessful()) - .forEach( - sendResponse -> { - String token = - tokens.get(response.getResponses().indexOf(sendResponse)); - if (isInvalidOrNotRegistered(sendResponse)) { - fcmTokenService.invalidateToken(token); - log.warn("FCM 토큰 {}이(가) 유효하지 않거나 등록되지 않았습니다. 토큰을 무효화합니다.", token); - } - }); - } - - private boolean isInvalidOrNotRegistered(SendResponse sendResponse) { - String errorMessage = sendResponse.getException().getMessage(); - return FcmResponseErrorType.contains(errorMessage, FcmResponseErrorType.NOT_REGISTERED) - || FcmResponseErrorType.contains( - errorMessage, FcmResponseErrorType.INVALID_REGISTRATION); - } -} diff --git a/src/main/java/com/depromeet/stonebed/domain/fcm/domain/FcmMessage.java b/src/main/java/com/depromeet/stonebed/domain/fcm/domain/FcmMessage.java new file mode 100644 index 00000000..cfde6096 --- /dev/null +++ b/src/main/java/com/depromeet/stonebed/domain/fcm/domain/FcmMessage.java @@ -0,0 +1,8 @@ +package com.depromeet.stonebed.domain.fcm.domain; + +public record FcmMessage(String title, String body, String token) { + + public static FcmMessage of(String title, String body, String token) { + return new FcmMessage(title, body, token); + } +} diff --git a/src/main/java/com/depromeet/stonebed/domain/sqs/application/SqsMessageService.java b/src/main/java/com/depromeet/stonebed/domain/sqs/application/SqsMessageService.java new file mode 100644 index 00000000..cf168dd9 --- /dev/null +++ b/src/main/java/com/depromeet/stonebed/domain/sqs/application/SqsMessageService.java @@ -0,0 +1,87 @@ +package com.depromeet.stonebed.domain.sqs.application; + +import com.depromeet.stonebed.domain.fcm.domain.FcmMessage; +import com.depromeet.stonebed.infra.properties.SqsProperties; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import software.amazon.awssdk.services.sqs.SqsClient; +import software.amazon.awssdk.services.sqs.model.BatchResultErrorEntry; +import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest; +import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry; +import software.amazon.awssdk.services.sqs.model.SendMessageBatchResponse; +import software.amazon.awssdk.services.sqs.model.SendMessageRequest; +import software.amazon.awssdk.services.sqs.model.SendMessageResponse; + +@Slf4j +@Transactional +@RequiredArgsConstructor +@Service +public class SqsMessageService { + + private final SqsClient sqsClient; + + private final SqsProperties sqsProperties; + + private final ObjectMapper objectMapper; + + public void sendMessage(Object message) { + try { + String messageBody = objectMapper.writeValueAsString(message); + SendMessageRequest sendMsgRequest = + SendMessageRequest.builder() + .queueUrl(sqsProperties.queueUrl()) + .messageBody(messageBody) + .build(); + + SendMessageResponse sendMsgResponse = sqsClient.sendMessage(sendMsgRequest); + log.info("메시지 전송 완료, ID: {}", sendMsgResponse.messageId()); + } catch (Exception e) { + log.error("SQS 메시지 전송 실패: {}", e.getMessage()); + } + } + + public void sendBatchMessages(List tokens, String title, String message) { + List entries = new ArrayList<>(); + for (String token : tokens) { + try { + FcmMessage fcmMessage = FcmMessage.of(title, message, token); + String messageBody = objectMapper.writeValueAsString(fcmMessage); + SendMessageBatchRequestEntry entry = + SendMessageBatchRequestEntry.builder() + .id(UUID.randomUUID().toString()) + .messageBody(messageBody) + .build(); + entries.add(entry); + } catch (Exception e) { + log.error("메시지 직렬화 실패: {}", e.getMessage()); + } + } + + SendMessageBatchRequest batchRequest = + SendMessageBatchRequest.builder() + .queueUrl(sqsProperties.queueUrl()) + .entries(entries) + .build(); + + try { + SendMessageBatchResponse batchResponse = sqsClient.sendMessageBatch(batchRequest); + + // 실패한 메시지 처리 + List failedMessages = batchResponse.failed(); + if (!failedMessages.isEmpty()) { + for (BatchResultErrorEntry failed : failedMessages) { + log.error("메시지 전송 실패, ID {}: {}", failed.id(), failed.message()); + } + } + + } catch (Exception e) { + log.error("SQS 배치 메시지 전송 실패: {}", e.getMessage()); + } + } +} diff --git a/src/main/java/com/depromeet/stonebed/global/config/fcm/FcmConfig.java b/src/main/java/com/depromeet/stonebed/global/config/fcm/FcmConfig.java deleted file mode 100644 index f94cd531..00000000 --- a/src/main/java/com/depromeet/stonebed/global/config/fcm/FcmConfig.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.depromeet.stonebed.global.config.fcm; - -import com.depromeet.stonebed.infra.properties.FcmProperties; -import com.google.auth.oauth2.GoogleCredentials; -import com.google.firebase.FirebaseApp; -import com.google.firebase.FirebaseOptions; -import com.google.firebase.messaging.FirebaseMessaging; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@RequiredArgsConstructor -public class FcmConfig { - - private final FcmProperties fcmProperties; - - @Bean - public FirebaseMessaging firebaseMessaging() throws IOException { - String firebaseCredential = fcmProperties.credential(); - - if (firebaseCredential == null || firebaseCredential.isEmpty()) { - throw new IllegalStateException("FCM_CREDENTIAL environment variable is not set."); - } - - ByteArrayInputStream credentials = - new ByteArrayInputStream(firebaseCredential.getBytes(StandardCharsets.UTF_8)); - FirebaseOptions options = - FirebaseOptions.builder() - .setCredentials(GoogleCredentials.fromStream(credentials)) - .build(); - - FirebaseApp firebaseApp = FirebaseApp.initializeApp(options); - return FirebaseMessaging.getInstance(firebaseApp); - } -} diff --git a/src/main/java/com/depromeet/stonebed/global/config/sqs/SqsConfig.java b/src/main/java/com/depromeet/stonebed/global/config/sqs/SqsConfig.java new file mode 100644 index 00000000..cb914b84 --- /dev/null +++ b/src/main/java/com/depromeet/stonebed/global/config/sqs/SqsConfig.java @@ -0,0 +1,28 @@ +package com.depromeet.stonebed.global.config.sqs; + +import com.depromeet.stonebed.infra.properties.SqsProperties; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.sqs.SqsClient; + +@Configuration +@RequiredArgsConstructor +public class SqsConfig { + + private final SqsProperties sqsProperties; + + @Bean + public SqsClient sqsClient() { + AwsBasicCredentials awsCreds = + AwsBasicCredentials.create(sqsProperties.accessKey(), sqsProperties.secretKey()); + + return SqsClient.builder() + .region(Region.of(sqsProperties.region())) + .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) + .build(); + } +} diff --git a/src/main/java/com/depromeet/stonebed/infra/properties/FcmProperties.java b/src/main/java/com/depromeet/stonebed/infra/properties/FcmProperties.java deleted file mode 100644 index 8fd2118f..00000000 --- a/src/main/java/com/depromeet/stonebed/infra/properties/FcmProperties.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.depromeet.stonebed.infra.properties; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -@ConfigurationProperties(prefix = "fcm") -public record FcmProperties(String credential) {} diff --git a/src/main/java/com/depromeet/stonebed/infra/properties/PropertiesConfig.java b/src/main/java/com/depromeet/stonebed/infra/properties/PropertiesConfig.java index ff6a0eb2..0d8c3752 100644 --- a/src/main/java/com/depromeet/stonebed/infra/properties/PropertiesConfig.java +++ b/src/main/java/com/depromeet/stonebed/infra/properties/PropertiesConfig.java @@ -9,7 +9,7 @@ JwtProperties.class, AppleProperties.class, SwaggerProperties.class, - FcmProperties.class + SqsProperties.class }) @Configuration public class PropertiesConfig {} diff --git a/src/main/java/com/depromeet/stonebed/infra/properties/SqsProperties.java b/src/main/java/com/depromeet/stonebed/infra/properties/SqsProperties.java new file mode 100644 index 00000000..d7e3219c --- /dev/null +++ b/src/main/java/com/depromeet/stonebed/infra/properties/SqsProperties.java @@ -0,0 +1,6 @@ +package com.depromeet.stonebed.infra.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "sqs") +public record SqsProperties(String accessKey, String secretKey, String region, String queueUrl) {} diff --git a/src/main/resources/application-cloud.yml b/src/main/resources/application-cloud.yml index d8036b59..7c7413b3 100644 --- a/src/main/resources/application-cloud.yml +++ b/src/main/resources/application-cloud.yml @@ -8,3 +8,10 @@ storage: bucket: ${S3_IMAGE_BUCKET:} region: ${AWS_REGION:} endpoint: ${S3_ENDPOINT:https://s3.ap-northeast-2.amazonaws.com} + +sqs: + accessKey: ${AWS_ACCESS_KEY:} + secretKey: ${AWS_SECRET_KEY:} + region: ${AWS_REGION:} + queue-url: ${SQS_QUEUE_URL} + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b934c339..d8fd2762 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -20,6 +20,3 @@ logging: com.depromeet.stonebed.*.*.application.*: debug org.hibernate.SQL: debug org.hibernate.type: trace - -fcm: - credential: ${FCM_CREDENTIAL} diff --git a/src/test/java/com/depromeet/stonebed/StonebedApplicationTests.java b/src/test/java/com/depromeet/stonebed/StonebedApplicationTests.java index 3bde8dcd..54b43338 100644 --- a/src/test/java/com/depromeet/stonebed/StonebedApplicationTests.java +++ b/src/test/java/com/depromeet/stonebed/StonebedApplicationTests.java @@ -1,17 +1,24 @@ package com.depromeet.stonebed; import com.depromeet.stonebed.domain.fcm.application.FcmNotificationService; +import com.depromeet.stonebed.domain.sqs.application.SqsMessageService; import com.google.firebase.messaging.FirebaseMessaging; +import io.awspring.cloud.autoconfigure.sqs.SqsAutoConfiguration; import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ActiveProfiles; +import software.amazon.awssdk.services.sqs.SqsClient; +@EnableAutoConfiguration(exclude = {SqsAutoConfiguration.class}) @SpringBootTest @ActiveProfiles("test") class StonebedApplicationTests { @MockBean private FirebaseMessaging firebaseMessaging; @MockBean private FcmNotificationService fcmNotificationService; + @MockBean private SqsMessageService sqsMessageService; + @MockBean private SqsClient sqsClient; @Test void contextLoads() {} diff --git a/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationServiceTest.java b/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationServiceTest.java index 1eccbe4a..35192d04 100644 --- a/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationServiceTest.java +++ b/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationServiceTest.java @@ -31,8 +31,6 @@ @ActiveProfiles("test") @ExtendWith(MockitoExtension.class) public class FcmNotificationServiceTest extends FixtureMonkeySetUp { - - @Mock private FcmService fcmService; @Mock private FcmNotificationRepository notificationRepository; @Mock private MissionRecordRepository missionRecordRepository; @Mock private MissionRecordBoostRepository missionRecordBoostRepository; diff --git a/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmScheduledServiceTest.java b/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmScheduledServiceTest.java index 9f4e256b..2b27de78 100644 --- a/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmScheduledServiceTest.java +++ b/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmScheduledServiceTest.java @@ -26,8 +26,6 @@ @ActiveProfiles("test") @ExtendWith(MockitoExtension.class) public class FcmScheduledServiceTest extends FixtureMonkeySetUp { - - @Mock private FcmService fcmService; @Mock private FcmNotificationService fcmNotificationService; @Mock private FcmRepository fcmRepository; @Mock private FcmTokenService fcmTokenService; diff --git a/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/TestFixtureMonkey.java b/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/TestFixtureMonkey.java index 57af9b14..037d6839 100644 --- a/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/TestFixtureMonkey.java +++ b/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/TestFixtureMonkey.java @@ -3,21 +3,28 @@ import static org.assertj.core.api.BDDAssertions.*; import com.depromeet.stonebed.domain.fcm.application.FcmNotificationService; +import com.depromeet.stonebed.domain.sqs.application.SqsMessageService; import com.google.firebase.messaging.FirebaseMessaging; import com.navercorp.fixturemonkey.FixtureMonkey; import com.navercorp.fixturemonkey.api.introspector.FieldReflectionArbitraryIntrospector; +import io.awspring.cloud.autoconfigure.sqs.SqsAutoConfiguration; import net.jqwik.api.Arbitraries; import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.ActiveProfiles; +import software.amazon.awssdk.services.sqs.SqsClient; +@EnableAutoConfiguration(exclude = {SqsAutoConfiguration.class}) @SpringBootTest @ActiveProfiles("test") class TestFixtureMonkey { @MockBean private FirebaseMessaging firebaseMessaging; @MockBean private FcmNotificationService fcmNotificationService; + @MockBean private SqsMessageService sqsMessageService; + @MockBean private SqsClient sqsClient; @Test void checkPerson() {