Framework/Spring

[Spring Boot]Firebase Admin SDK를 이용해 푸쉬 보내기

SHXL2 2024. 7. 4. 11:35
반응형

최근 만든 앱에 푸쉬 기능을 추가할 일이 생겨 Spring Boot로 구축된 서버에 Firebase를 적용했습니다.

이번 포스팅에서는 Firebase Admin SDK를 이용해 푸쉬를 보내는 방법을 알아보겠습니다. 이외에도 FCM를 이용한 글이 있으니 참고해 주세요.

Node를 이용한 FCM Push

Flutter FCM 설정하기

 

※ 테스트 환경
  • Spring Boot 2.7.5
  • JDK 1.8
  • Gradle

1. Firebase Admin SDK 다운로드

파이어베이스 접속 후 Admin SDK를 다운받습니다. 다운받은 파일을 resousrces 디렉토리에 저장합니다. 

 

2. 의존성 추가

푸쉬를 위해 firebase-admin을 추가합니다.

build.gradle

    implementation group: 'com.google.firebase', name: 'firebase-admin', version: '8.1.0'

 

3. Firebase 설정

sdk를 이용해 파이어베이스를 초기화합니다.

private final static String FIREBASE_CONFIG_PATH = "/fcm/nongsil-firebase-adminsdk-ac946-de25f2eb6a.json";

/**
 * Firebase 초기화
 *
 * @return
 * @throws IOException
 */
private static void initFirebase() throws IOException {
    GoogleCredentials googleCredentials = GoogleCredentials
        .fromStream(new ClassPathResource(FIREBASE_CONFIG_PATH).getInputStream())
        .createScoped(Arrays.asList(
            "https://www.googleapis.com/auth/firebase",
            "https://www.googleapis.com/auth/cloud-platform",
            "https://www.googleapis.com/auth/firebase.readonly"));
    googleCredentials.refreshAccessToken();

    FirebaseOptions options = FirebaseOptions.builder()
        .setCredentials(googleCredentials)
        .build();

    if (FirebaseApp.getApps().isEmpty()) {
        FirebaseApp.initializeApp(options);
    }
}

 

4. 메세지 생성

푸쉬를 통해 전달할 메세지를 생성합니다.

단일 메세지 구성과 다중 메세지 구성 모두 가능합니다. 다중 메세지 구성시 MulticastMessage를 사용합니다.

paramMap을 통해 구성된 메세지는 모바일앱에서 RemoteMessage를 통해 확인할 수 있습니다.

 

private Message makeOnePushMessage(FcmDto fcmDto) {
    //메세지 설정
    Map<String, String> paramMap = new HashMap<>();
    paramMap.put("id", Long.toString(fcmDto.getPushSeq()));
    paramMap.put("title", fcmDto.getTitle());
    paramMap.put("content", fcmDto.getContent());
    paramMap.put("link", fcmDto.getPushLink());
    paramMap.put("badge", "1");

    // IOS 설정
    ApnsConfig apnsConfig = ApnsConfig.builder()
        .putHeader("apns-priority", "5")
        .setAps(Aps.builder()
            .setContentAvailable(true)
            .setMutableContent(true)
            .setSound("default")
            .setBadge(1)
            .setAlert(ApsAlert.builder()
                .setTitle(fcmDto.getTitle())
                .setBody(fcmDto.getContent()).build())
            .build())
        .setFcmOptions(ApnsFcmOptions.builder()
            .build())
        .build();

    // Android 설정
    AndroidConfig androidConfig = AndroidConfig.builder()
        .setPriority(AndroidConfig.Priority.HIGH)
        .build();

    return Message.builder()
        .setToken(fcmDto.getPushToken())
        .putAllData(paramMap)
        .setApnsConfig(apnsConfig)
        .setAndroidConfig(androidConfig)
        .build();
}

 

5. 메세지 발송

이제 발송 메소드를 만들어 초기화 -> 메세지 생성 -> 푸쉬 발송 순으로 실행합니다.

public MessageDto sendOne(FcmDto fcmDto) {
    try {
        // 1) Firebase 초기화
        initFirebase();

        // 2) 푸쉬 메세지 생성
        Message message = makeOnePushMessage(fcmDto);

        // 3) 푸쉬 발송
        FirebaseMessaging.getInstance().send(message);
    } catch (Exception e) {
        throw new CustomException("푸쉬 발송에 실패했습니다.");
    }

    return MessageDto.builder()
        .message("success")
        .build();
}

 

MessageDto는 아래와 같이 정의되어 있습니다.

@Data
@Builder
public class MessageDto {

    private String message;
    private Object result;

    public MessageDto(String message) {
        this.message = message;
    }

    public MessageDto(String message, Object result) {
        this.message = message;
        this.result = result;
    }
}

 

6. 테스트

테스트 컨트롤러를 추가했고, 푸쉬 토큰을 전달해 실행해보겠습니다.

푸쉬 토큰은 앱에서 FirebaseMessaging을 통해 기기 고유의 토큰을 생성해야 합니다.

 

@RestController
@RequestMapping("fcm")
@RequiredArgsConstructor
public class FcmApi {

    private final FcmService fcmService;

    @GetMapping(value = "/test")
    public ResponseEntity<MessageDto> pushTest(
        @RequestParam(value = "token") String token
    ) {
        fcmService.sendOne(FcmDto.builder()
            .pushSeq(1L)
            .title("테스트 푸쉬 발송")
            .content("테스트 푸쉬 발송입니다.")
            .pushToken(token)
            .pushLink("/board/info")
            .build());

        return ResponseEntity.ok().body(new MessageDto("success", ""));
    }
}

 

Postman을 통해 테스트해보면 푸쉬가 잘 전송되는 것을 확인할 수 있습니다.

 


전체 코드는 GitHub에서 확인하실 수 있습니다.

예제에 사용되지 않은 다중 푸쉬 메소드도 포함되어 있으니 참고해 주세요.

반응형