Springboot & Firebase Fcm 알림 연동

YeopKing·2022년 11월 29일
0
post-thumbnail

  • Firebase 프로젝트 생성 후 -> 프로젝트 설정 -> 서비스 계정 Tab -> 새 비공개키 생성 후
    다운로드 한 json file을 아무데나 저장한다.(저는 편의상 프로젝트 안에 저장 했습니다.)

fcm:
  key:
    path: filePath*.json
    scope: https://www.googleapis.com/auth/firebase.messageing
  • *.json 비공개 파일을 프로젝트에 저장 한 후
    application.yml 에 fcm.key.path scope 저장합니다.
// firebase FCM
    implementation 'com.google.firebase:firebase-admin:9.1.1'
  • build.gradle 에 firebase 추가해준다.
@Service
@RequiredArgsConstructor
@Slf4j
@Transactional
public class FirebaseMessageService {
    @Value("${fcm.key.path}")
    private String PATH;
...
  • 서비스 클래스에서 @Value 에 application.yml에 저장한 경로를 변수로 설정한다.

    // fcm 멀티 알림 옵션 생성
    private void firebaseCreateOption() throws IOException {
        FileInputStream refreshToken = new FileInputStream(PATH);
        FirebaseOptions options = FirebaseOptions.builder()
                .setCredentials(GoogleCredentials.fromStream(refreshToken))
                .build();

        FirebaseApp.initializeApp(options);
    }
  • Firebase 옵션을 생성하여 FirebaseApp에 세팅해준다.
    옵션을 미리 설정 해주고 난뒤에 다음 함수로 메시지를 보낸다.
/**
     * 전체 알림 메시지
     *
     * @param title
     * @param body
     * @return
     * @throws IOException
     * @throws FirebaseMessagingException
     */
    public ApiResult notificationAlarm(String title, String body, List<String> tokenList) throws IOException, FirebaseMessagingException {
        firebaseCreateOption();


        // fcm multiMessage 객체 생성 하여 보냄
        MulticastMessage message = MulticastMessage.builder()
                .putData("fcm_type", "NOTIFICATION") // 알람 종류 타입
                .putData("title", title)
                .putData("body", body)
                .addAllTokens(tokenList)
//                .addToken(token)  // 단일 토큰일 경우
                .build();

        BatchResponse response = FirebaseMessaging.getInstance().sendMulticast(message);

        failMessage(tokenList, response);

        return ApiUtils.success("message", ComCode.ALARM_SUCCESS, ComCode.SUCCESS_CODE);

    }
  • MulticastMessage 를 빌더로 생성함
    putData는 알림 메시지 데이터를 넣는다고 보면 된다.
    token list 로 단체 알림을 보낼수도 있고
    addToken으로 단건으로 보낼수 있다.

  • MulticastMessage 생성하고 난 뒤 sendMulticast(message)로 담아 보낸다.
    보내고 난 뒤 응답 response는 실패한 fcm 토큰값을 따로 걸러내기 위한 용도이다.

  • failMessage() 밑에 함수를 보고 다시 설명하겠다.

    // 토큰이 유효하지 않아서 fcm 발송이 실패한 데이터 추출
    private void failMessage(List<String> mergeTokenList, BatchResponse response) {
        if (response.getFailureCount() > 0) {
            List<SendResponse> responses = response.getResponses();
            List<String> failedTokens = new ArrayList<>();
            for (int i = 0; i < responses.size(); i++) {
                if (!responses.get(i).isSuccessful()) {
                    failedTokens.add(mergeTokenList.get(i));
                }
            }
            log.info("======================= failedTokens : " + failedTokens + "=======================(추후 실패한 토큰은 삭제 시켜줘야함) -> 쓸데없는 알람이 가서 성능 저하를 일으킴");
        }
        log.info("======================= Success : " + response + "=======================");
    }

실패한 토큰값은 추후에 성능저하를 일으킨다는 블로그를 보아
로직을 만들어 봤다.

profile
좀 더 나은 내일을 위해

0개의 댓글

Powered by GraphCDN, the GraphQL CDN