Skip to content

Commit d39929b

Browse files
authored
Merge pull request #121 from Team-Shaka/feat/120
✨ Feat: 한 유저당 하나의 FCM Token 값을 저장하도록 수정
2 parents 08a8d18 + 7a918e5 commit d39929b

File tree

4 files changed

+39
-31
lines changed

4 files changed

+39
-31
lines changed

src/main/java/treehouse/server/api/user/persistence/FcmTokenRepository.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ public interface FcmTokenRepository extends JpaRepository<FcmToken, Long> {
1414

1515
void deleteAllByUser(User user);
1616

17+
void deleteByUser(User user);
18+
19+
boolean existsByUser(User user);
20+
1721
boolean existsByUserAndToken(User user, String token);
1822

19-
List<FcmToken> findAllByUser(User user);
23+
// List<FcmToken> findAllByUser(User user);
2024
}

src/main/java/treehouse/server/global/entity/User/FcmToken.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class FcmToken extends BaseDateTimeEntity {
1919
@GeneratedValue(strategy = GenerationType.IDENTITY)
2020
private Long id;
2121

22-
@ManyToOne(fetch = FetchType.LAZY)
22+
@OneToOne
2323
private User user;
2424

2525
private String token;

src/main/java/treehouse/server/global/exception/GlobalErrorCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ public enum GlobalErrorCode implements BaseErrorCode{
106106
PHONE_AUTH_TIMEOUT(BAD_REQUEST, "NCP400_3", "인증 시간이 초과되었습니다."),
107107

108108
FCM_ALREADY_EXISTS_TOKEN(BAD_REQUEST, "FCM400_1", "이미 저장되어 있는 FCM 토큰입니다."),
109+
FCM_TOKEN_NOT_EXISTS(BAD_REQUEST,"FCM400_2", "해당 유저의 FCM Token 이 존재하지 않습니다."),
109110
FCM_ACCESS_TOKEN_REQUEST_ERROR(INTERNAL_SERVER_ERROR, "FCM500_2", "서버 에러, FCM 서버에 AccessToken 요청할 때 에러 발생."),
110111
FCM_SEND_MESSAGE_ERROR(INTERNAL_SERVER_ERROR , "FCM500_3", "서버 에러, FCM 서버에 메시지를 전송할 때 에러 발생. FcmToken이 유효한지 확인해주세요."), ;
111112

src/main/java/treehouse/server/global/fcm/service/FcmService.java

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.google.firebase.messaging.FirebaseMessagingException;
55
import com.google.firebase.messaging.Message;
66
import com.google.firebase.messaging.Notification;
7+
import lombok.AllArgsConstructor;
78
import lombok.RequiredArgsConstructor;
89
import org.slf4j.Logger;
910
import org.slf4j.LoggerFactory;
@@ -19,10 +20,11 @@
1920
import treehouse.server.global.fcm.dto.FCMDto;
2021

2122
import java.util.List;
23+
import java.util.Optional;
2224

2325
@Service
2426
@RequiredArgsConstructor
25-
@Transactional(readOnly = true)
27+
//@Transactional(readOnly = true)
2628
public class FcmService {
2729
Logger logger = LoggerFactory.getLogger(FcmService.class);
2830

@@ -49,53 +51,54 @@ public void testFCMService(String fcmToken)
4951

5052
@Transactional(readOnly = false)
5153
public UserResponseDTO.saveFcmToken saveFcmToken(User user, FCMDto.saveFcmTokenDto request) {
52-
boolean isSuccess = false;
53-
logger.error("토큰 값 : {}",request.getFcmToken());
54-
if (fcmTokenRepository.existsByUserAndToken(user, request.getFcmToken())) {
55-
throw new FcmException(GlobalErrorCode.FCM_ALREADY_EXISTS_TOKEN);
56-
}else{
54+
boolean isSuccess = true;
55+
logger.info("토큰 값 : {}", request.getFcmToken());
56+
57+
58+
// 한 user 당 가장 최신의 fcm token 값 하나만 db 에 저장하도록 수정
59+
if (fcmTokenRepository.existsByUser(user)) {
60+
FcmToken fcmToken = fcmTokenRepository.findByUser(user).orElseThrow(() -> new FcmException(GlobalErrorCode.FCM_TOKEN_NOT_EXISTS));
61+
fcmToken.update(request.getFcmToken());
62+
} else {
5763
fcmTokenRepository.save(FcmToken.builder()
5864
.user(user)
5965
.token(request.getFcmToken())
6066
.build()
6167
);
62-
isSuccess = true;
6368
}
6469
return UserMapper.toSaveFcmToken(user, isSuccess);
6570
}
6671

6772

6873
public void sendFcmMessage(User receiver, String title, String body) {
6974

70-
List<FcmToken> fcmTokenList = fcmTokenRepository.findAllByUser(receiver);
71-
if (fcmTokenList.isEmpty()) {
72-
return;
73-
}
75+
FcmToken fcmToken = fcmTokenRepository.findByUser(receiver).orElseThrow(() -> new FcmException(GlobalErrorCode.FCM_TOKEN_NOT_EXISTS));
7476

75-
for (FcmToken fcmToken : fcmTokenList) {
76-
String token = fcmToken.getToken();
77-
logger.info("전송하고자 하는 FCM 토큰 값 : " + token);
78-
Message message = Message.builder()
79-
.setToken(token)
80-
.setNotification(
81-
Notification.builder()
82-
.setTitle(title)
83-
.setBody(body)
84-
.build())
85-
.build();
86-
try {
87-
String response = FirebaseMessaging.getInstance().send(message);
88-
logger.info("the response of request FCM : {}",response);
89-
} catch (FirebaseMessagingException e) {
90-
throw new FcmException(GlobalErrorCode.FCM_SEND_MESSAGE_ERROR);
91-
}
92-
}
77+
String token = fcmToken.getToken();
78+
logger.info("전송하고자 하는 FCM 토큰 값 : " + token);
79+
80+
Message message = Message.builder()
81+
.setToken(token)
82+
.setNotification(
83+
Notification.builder()
84+
.setTitle(title)
85+
.setBody(body)
86+
.build())
87+
.build();
9388

89+
try {
90+
String response = FirebaseMessaging.getInstance().send(message);
91+
logger.info("the response of request FCM : {}",response);
92+
} catch (FirebaseMessagingException e) {
93+
logger.error("FCM 푸시 알림 전송 실패, 이유 : {}", e.getMessage());
94+
throw new FcmException(GlobalErrorCode.FCM_SEND_MESSAGE_ERROR);
95+
}
9496

9597
}
9698

9799
@Transactional
98100
public void deleteAllFcmToken(User user) {
99101
fcmTokenRepository.deleteAllByUser(user);
100102
}
103+
101104
}

0 commit comments

Comments
 (0)