FCM 알림 발송 및 배포 , 응답시간 지연 에러

Created
2023/11/27 01:51
담당자

배경

실시간 알람을 유저에게 보내기 위해, 알림이 필요한 로직에 넣어서 구현을 했다. 하지만 FCM서버를 초기화하는데 에러가 생기고, 메시지 발송도 안되고 이로 인해 기존 서비스들도 제대로 작동하지 않는 문제에 직면했다.

Problem

1.
FCM 서버로의 초기화 요청 실패
2.
메시지 발송 실패
3.
로컬에서는 알림 발송 성공, 배포 환경(Google Cloud Platform)에서는 알림 발송 실패
4.
서비스가 FCM 의 응답 시간을 기다림으로 인해 서비스의 응답시간이 지연 됨.

Reason

1.
초기화 요청실패 : fcm에서 발급 받은 private key를 resources 폴더에 저장하여 사용
IOException 처리를 안 해주면 에러 발생
@PostConstruct public void init() { try { FirebaseOptions options = FirebaseOptions.builder() .setCredentials(GoogleCredentials.fromStream(new ClassPathResource( fcmPrivateKeyPath).getInputStream()) .createScoped(fireBaseScope)) .build(); if (FirebaseApp.getApps().isEmpty()) { FirebaseApp.initializeApp(options); log.info("Firebase application has been initialized"); } } catch (IOException e) { log.error(e.getMessage()); throw new BudException(FIREBASE_INIT_FAILED); } }
Java
복사
FCM 초기화 코드
2.
메시지 발송 실패
발송되는 메시지의 형태를 갖추었다면 특이 에러는 발생하지 않음
만약 fcm토큰이 사용 불가가 된다면 아래와 같은 에러 발생
FCM에서 Error 가 발생하면 서비스도 실패하는 에러 발생
FCM token의 특징
3.
FCM으로부터 발급 받은 privateKey.json파일을 읽어오는 경로가 로컬과 배포 환경이 서로 다름.
로컬 : path: src/main/resources/budproject-da24e-firebase-adminsdk-r64ws-a4abd7f94d.json
배포환경 : path: file:/home/runner/work/bud/bud-BE/src/main/resources/budproject-da24e-firebase-adminsdk-r64ws-a4abd7f94d.json
4. FCM으로 인한 서비스 응답지연
구현한 로직이 해당 서비스가 FCM의 응답이 완료될 때까지 서비스가 기다려야하는 것 때문에 응답 시간이 늦어지는 것을 발견하였다.
하기의 코드가 서비스 로직에 그대로 들어가 있기 때문에 당연한 일이였다.
notificationService.sendMessage(member, post);

Try to solve

fcm서버로의 모든 요청은 Try - Catch로 처리함으로써 Fcm으로 인한 오류가 서비스에 영향을 끼치지 않도록 함.
하나의 FCM프로젝트에는 하나의 private key파일과, 기기별로 발급되는 fcm토큰을 사용하여 통신함을 숙지
FCM 초기화에 필요한 private파일을 불러오는 경로를 수정
ApplicationEventPublisher, Async를 이용해 비동기적으로 이벤트를 처리하여 해결하였음.
해결 후 ApplicationEventPublisher 적용 모습
eventPublisher.publishEvent(new CreatePostEvent(member, post));

느낀점

1.
1번 , 3번 문제의 경우에서는 정확한 소통 및 공유의 필요성을 느꼈다.
내가 팀원분에게 정확하게 이 경로에 파일을 넣어주셔야한다고 말했어야 했는데 그러지 않았다.
다음부터는 서버에 올리는 것은 무엇이든 꼼꼼하게 체크하고 팀원분들과 정확하게 소통해야겠다는 것을 배웠다.
2.
2번 , 4번 문제에 대해서는 여러 상황들에 대한 테스트가 부족해서 발생했던 것이기 때문에 테스트를 좀 더 꼼꼼하게 해야겠다는 것을 느꼈다.
미리미리 테스트해서 Notifiaction에서 오류가 날 경우 서비스에 영향을 끼치기 때문에 서비스에 영향을 가지 않도록 예외 처리를 해두었어야 했는데 그 부분이 미진하였다.
테스트를 통해 기존의 응답시간과 비교를 해서 늦어진다는 것을 캐치했어야 했는데 캐치하지 못했다.
알림과 같은 부가적인 기능이 끼치는 서비스에 대한 영향도는 최소화 해야한다는 것을 배웠다.