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
더 다양한 유형을 알고 싶다면 아래 공식 문서를 참고하자.
https://firebase.google.com/docs/cloud-messaging/concept-options?hl=ko
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
https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko
[SpringBoot] FCM을 통해 Push알림 보내보기 (tistory.com)
댓글