diff --git a/src/main/java/in/koreatech/koin/infrastructure/fcm/FcmClient.java b/src/main/java/in/koreatech/koin/infrastructure/fcm/FcmClient.java index 776e98d5f..06c7c9c5d 100644 --- a/src/main/java/in/koreatech/koin/infrastructure/fcm/FcmClient.java +++ b/src/main/java/in/koreatech/koin/infrastructure/fcm/FcmClient.java @@ -3,6 +3,7 @@ import static com.google.firebase.messaging.AndroidConfig.Priority.HIGH; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.springframework.scheduling.annotation.Async; @@ -24,6 +25,8 @@ @Component public class FcmClient { + private static final int FCM_MESSAGE_BATCH_SIZE = 500; + @Async public void sendMessage( String targetDeviceToken, @@ -70,6 +73,39 @@ public boolean sendMessageWithResult( } } + public void sendMessages(List requests) { + try { + for (int start = 0; start < requests.size(); start += FCM_MESSAGE_BATCH_SIZE) { + int end = Math.min(start + FCM_MESSAGE_BATCH_SIZE, requests.size()); + List messages = requests.subList(start, end).stream() + .map(request -> Message.builder() + .setToken(request.targetDeviceToken()) + .setApnsConfig(generateAppleConfig( + request.title(), + request.content(), + request.imageUrl(), + request.path(), + request.type(), + request.schemeUri() + )) + .setAndroidConfig(generateAndroidConfig( + request.title(), + request.content(), + request.imageUrl(), + request.schemeUri(), + request.type() + )) + .build() + ) + .toList(); + + FirebaseMessaging.getInstance().sendEach(messages); + } + } catch (Exception e) { + log.warn("FCM 알림 전송 실패", e); + } + } + private ApnsConfig generateAppleConfig( String title, String content, diff --git a/src/main/java/in/koreatech/koin/infrastructure/fcm/FcmSendRequest.java b/src/main/java/in/koreatech/koin/infrastructure/fcm/FcmSendRequest.java new file mode 100644 index 000000000..308a45c8d --- /dev/null +++ b/src/main/java/in/koreatech/koin/infrastructure/fcm/FcmSendRequest.java @@ -0,0 +1,33 @@ +package in.koreatech.koin.infrastructure.fcm; + +import in.koreatech.koin.common.model.MobileAppPath; + +public record FcmSendRequest( + String targetDeviceToken, + String title, + String content, + String imageUrl, + MobileAppPath path, + String schemeUri, + String type +) { + public static FcmSendRequest of( + String targetDeviceToken, + String title, + String content, + String imageUrl, + MobileAppPath path, + String schemeUri, + String type + ) { + return new FcmSendRequest( + targetDeviceToken, + title, + content, + imageUrl, + path, + schemeUri, + type + ); + } +}