From 4fa84142dd207339a9421db244df035ef002c992 Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 1 Jan 2026 16:47:59 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 친구 생성시 올바른 알림 생성 --- .../backend/domain/friend/application/FriendManageService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ku_rum/backend/domain/friend/application/FriendManageService.java b/src/main/java/ku_rum/backend/domain/friend/application/FriendManageService.java index e6dbb4e5..26d73151 100644 --- a/src/main/java/ku_rum/backend/domain/friend/application/FriendManageService.java +++ b/src/main/java/ku_rum/backend/domain/friend/application/FriendManageService.java @@ -41,7 +41,7 @@ public void requestFriend(final FriendRequest friendSendRequest) { } friendRepository.save(Friend.of(fromUser, toUser, PENDING)); - alarmService.notifyAlarm(AlarmType.NEW_FRIEND_REQUEST, toUser); + alarmService.notifyAlarm(AlarmType.NEW_FRIEND_REQUEST, fromUser, toUser); } // 친구 수락 및 거절 From 292622f2b2d963f119e6618e5cd604f58d1e3a2d Mon Sep 17 00:00:00 2001 From: david-parkk Date: Thu, 1 Jan 2026 18:11:48 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 토큰이 없는 경우 알림 중지 --- .../domain/alarm/application/AlarmService.java | 2 +- .../backend/domain/alarm/application/FcmService.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/ku_rum/backend/domain/alarm/application/AlarmService.java b/src/main/java/ku_rum/backend/domain/alarm/application/AlarmService.java index 30ec7c3e..f8b0eb9a 100644 --- a/src/main/java/ku_rum/backend/domain/alarm/application/AlarmService.java +++ b/src/main/java/ku_rum/backend/domain/alarm/application/AlarmService.java @@ -68,7 +68,7 @@ public void notifyAlarm(AlarmType alarmType, Object object, User user) { return; } FcmDirectDto fcmDirectDto = alarmMessageHandler.getFcmDirectDto(object, user); - fcmService.sendToUsers(fcmDirectDto); + fcmService.sendToUsersIfTokenExists(fcmDirectDto); } @Transactional diff --git a/src/main/java/ku_rum/backend/domain/alarm/application/FcmService.java b/src/main/java/ku_rum/backend/domain/alarm/application/FcmService.java index 7c3c5759..ef05842f 100644 --- a/src/main/java/ku_rum/backend/domain/alarm/application/FcmService.java +++ b/src/main/java/ku_rum/backend/domain/alarm/application/FcmService.java @@ -36,6 +36,18 @@ public class FcmService { private final UserQueryService userQueryService; private final UserService userService; + public void sendToUsersIfTokenExists(FcmDirectDto fcmDirectDto) { + User user = userService.getUser(); + Optional token = userFcmTokenRepository.findByUser(user); + + if (token.isEmpty()) { + log.info("FCM 토큰이 존재하지 않는 유저입니다. userId={}", user.getId()); + return; + } + + sendToUsers(fcmDirectDto); + } + public void sendToUsers(FcmDirectDto request) { List users = userQueryService.getUsersByIds(request.userIds()); From 012853e95b4d9bca9d83ad2e2738b372ba49b97d Mon Sep 17 00:00:00 2001 From: david-parkk Date: Fri, 2 Jan 2026 22:38:16 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 토큰이 없는 경우 알림 중지, 로깅 --- .../domain/alarm/application/FcmService.java | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/main/java/ku_rum/backend/domain/alarm/application/FcmService.java b/src/main/java/ku_rum/backend/domain/alarm/application/FcmService.java index ef05842f..6c209bc5 100644 --- a/src/main/java/ku_rum/backend/domain/alarm/application/FcmService.java +++ b/src/main/java/ku_rum/backend/domain/alarm/application/FcmService.java @@ -37,15 +37,38 @@ public class FcmService { private final UserService userService; public void sendToUsersIfTokenExists(FcmDirectDto fcmDirectDto) { - User user = userService.getUser(); - Optional token = userFcmTokenRepository.findByUser(user); + List users = userQueryService.getUsersByIds(fcmDirectDto.userIds()); + List userFcmTokens = userFcmTokenRepository.findByUserIn(users); - if (token.isEmpty()) { - log.info("FCM 토큰이 존재하지 않는 유저입니다. userId={}", user.getId()); + List userIdsWithToken = userFcmTokens.stream() + .map(token -> token.getUser().getId()) + .toList(); + + List userIdsWithoutToken = fcmDirectDto.userIds().stream() + .filter(userId -> !userIdsWithToken.contains(userId)) + .toList(); + + if (!userIdsWithoutToken.isEmpty()) { + log.info( + "FCM 토큰이 없어 전송하지 못한 userIds={}", + userIdsWithoutToken + ); + } + + if (userIdsWithToken.isEmpty()) { + log.info( + "FCM 전송 가능한 유저가 없습니다. 요청 userIds={}", + fcmDirectDto.userIds() + ); return; } - sendToUsers(fcmDirectDto); + FcmDirectDto filteredDto = FcmDirectDto.builder() + .title(fcmDirectDto.title()) + .body(fcmDirectDto.body()) + .userIds(userIdsWithToken) + .build(); + sendToUsers(filteredDto); } public void sendToUsers(FcmDirectDto request) {