본문 바로가기
카테고리 없음

[Spring][Android/Kotlin] FCM으로 안드로이드에 푸쉬 알람 보내기 (3)

by 웅대 2023. 8. 16.
728x90
반응형

https://growth-coder.tistory.com/237

이전 포스팅에서 간단한 안드로이드 애플리케이션을 생성하고 firebase 콘솔 창을 통해서 푸쉬 알람을 보내보았다.

 

이제 스프링부트 서버에서 푸쉬 알람을 보내보려고 한다.

 

FCM 서버와 소통하는 방식

FCM 서버와 데이터를 주고 받기 위한 방법은 크게 Firebase Admin SDK를 사용하거나 원시 프로토콜인 FCM v1 HTTP API를 사용하는 방법이 있다.

 

원시 프로토콜은 FCM v1 HTTP API 말고도 이전에 사용하던 API가 있지만 FCM v1 HTTP API를 사용하는 것을 권장한다.

 

Firebase Admin SDK를 사용하면 요청 승인, 메시지 보내기 등등 다양한 기능들을 편리하게 사용할 수 있기 때문에 Firebase Admin SDK를 사용할 예정이다.

 

Android에 Firebase Admin SDK 추가

Firebase Admin SDK를 사용하기로 결정했으므로 스프링부트 서버에 Firebase Admin SDK를 추가해보자.

 

우선 우리가 만든 firebase 프로젝트에 들어가서 프로젝트 설정으로 들어간다.

서비스 계정에서 자바를 누르고 새 비공개 키를 생성한다.

생성된 비공개 키를 src/main/resources 디렉토리 안에 넣어두자. 

 

실제 프로젝트라면 실수로 깃허브에 올리지 않도록 주의하자.

 

그리고 firebase-admin 의존성을 추가하자.

 

<build.gradle>

dependencies {
	.
    .
    .
	implementation 'com.google.firebase:firebase-admin:9.2.0'

}

그리고 SDK를 초기화하는 코드를 작성하자.

 

한 번만 하면 되기 때문에 설정 파일을 생성해서 @PostConstruct로 SDK를 초기화하자.

@Configuration
public class FirebaseConfig {
    @PostConstruct
    public void init(){
        try{
            FileInputStream serviceAccount =
                    new FileInputStream("src/main/resources/service-Key.json");
            FirebaseOptions options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .build();
            FirebaseApp.initializeApp(options);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

 

알림 메시지 보내기

우리는 put 요청으로 title과 body를 받아서 이를 통해 Message 객체를 생성하고 토큰을 이용해 알림 메시지를 보낼 것이다.

 

다음은 입력받을 객체인 RequestDto이다.

 

<RequestDto>

@Getter
@AllArgsConstructor
public class RequestDto {
    private String title;
    private String content;
}

다음은 컨트롤러이다.

 

<MessageController>

@RestController
public class MessageController {
    @PostMapping("/fcm")
    public String fcm(@RequestBody RequestDto requestDto) throws FirebaseMessagingException {
        String registrationToken = "메시지를 보낼 기기 토큰";
        Notification notification = Notification.builder()
                .setTitle(requestDto.getTitle())
                .setBody(requestDto.getContent()).build();
        Message message = Message.builder()
                .setNotification(notification)
                .setToken(registrationToken)
                .build();

        String response = FirebaseMessaging.getInstance().send(message);
        System.out.println("Successfully sent message: " + response);
        return response;
    }
}

Message 객체를 구성할 때는 원하는 메시지 유형에 따라서 구성하면 된다.

 

모든 플랫폼으로 알림 메시지를 보내고 싶다면 메시지 형식은 다음과 같다.

 

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
  }
}

이에 따라 Message 객체를 구성하면 된다. 필요한 필드가 있으면 Message 객체를 열어보면 다양한 필드를 확인할 수 있다.

 

 

메시지 유형은 1편에서 정리를 해두었다.

https://growth-coder.tistory.com/236

 

[Spring][Android/Kotlin] FCM으로 안드로이드에 푸쉬 알람 보내기 (1)

프로젝트를 진행하던 도중 푸쉬 알람 기능이 필요해서 FCM 사용법에 대해 공부해보려고 한다. 먼저 기본적인 흐름이다. 메시지 정보 FCM을 사용하기에 앞서 FCM에서 사용하는 메시지의 정보에 대

growth-coder.tistory.com

 

더 다양한 유형을 알고 싶다면 아래 공식 문서를 참고하자.

https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ko 

 

FCM 메시지 정보  |  Firebase 클라우드 메시징

Google I/O 2023에서 Firebase의 주요 소식을 확인하세요. 자세히 알아보기 의견 보내기 FCM 메시지 정보 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Firebase 클라

firebase.google.com

 

admin SDK에서는 여러 기기에 푸쉬 알람을 전달하는 방법도 제공하고 있다.

 

굳이 반복문으로 한 기기씩 알람을 전달하기 보다는 이 기능을 사용해보자.

 

List<String> registrationTokens = Arrays.asList(
    "YOUR_REGISTRATION_TOKEN_1",
    // ...
    "YOUR_REGISTRATION_TOKEN_n"
);

Notification notification = Notification.builder()
     .setTitle(requestDto.getTitle())
     .setBody(requestDto.getContent()).build();
     
MulticastMessage message = MulticastMessage.builder()
    .addAllTokens(registrationTokens)
    .setNotification(notification)
    .build();
    
BatchResponse response = FirebaseMessaging.getInstance().sendMulticast(message);

만약 이미지를 넣고 싶다면 Notification 객체 안의 image 필드 안에 이미지 url을 넣으면 된다.

 

서비스 키의 비공개 계정을 공개하지 않도록 주의하고 사용자 토큰 또한 비활성 토큰이 리소스를 낭비하지 않도록 관리하는 로직도 추가로 작성하면 좋을 것 같다.

참고

https://firework-ham.tistory.com/111

 

[Spring Boot] Firebase 연동 방법.

이번 포스팅은 Spring Boot에 Firebase 연동하는 방법을 정리하려고 합니다. Firebase SDK를 활용한 기본 연동 그리고 컬렉션에 있는 정보를 가져오는 방법을 간단히 정리 하겠습니다. 00. 디펜던시 등록 h

firework-ham.tistory.com

https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko 

 

앱 서버 전송 요청 작성  |  Firebase 클라우드 메시징

Google I/O 2023에서 Firebase의 주요 소식을 확인하세요. 자세히 알아보기 의견 보내기 앱 서버 전송 요청 작성 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Fire

firebase.google.com

[SpringBoot] FCM을 통해 Push알림 보내보기 (tistory.com)

 

[SpringBoot] FCM을 통해 Push알림 보내보기

( + 진행 당시, 기능 구현에 집중하다보니 전체적인 설계나 코드가 클린하지 못할 수 있으니 이 부분은 리팩토링 하면서 적용하시면 좋을 것 같아요! :) ) 현재 참여하고 있는 IT연합 동아리 YAPP에

sol-devlog.tistory.com

 

728x90
반응형

댓글