Search

FCM

카테고리
꿀팁 🐝🌸
유형
푸시 알림 Cheatsheet
Date
Tags
1 more property
FCM은 Firebase Cloud Messaging으로 서버와 기기를 무료로 연결할 수 있는 서비스이다.
이 글은 Spring Framework 기준으로 FCM과 연동하여 푸시알림을 보내는 예시를 설명한다.

설정파일

app: firebase: app: service-api-uri: https://fcm.googleapis.com/v1/projects/{앱 ID}/messages:send # firebase console에서 발급받은 서비스 키 주소 service-key-path: {{PATH}}/service-key.json scoped: # 공통 Scope https://www.googleapis.com/auth/cloud-platform
YAML
복사
서버에서 Firebase로 요청할 수 있는 설정은 끝났다.
이제 모바일과 서로 어떤 메세지를 주고 받을 것인지 협의하여 메세지 객체를 만들어보자.

Message Object

@NoArgsConstructor(access = PROTECTED) @Builder public class FcmMessageForIOS { private boolean validateOnly; private Message message; @AllArgsConstructor @Builder public static class Message { private Notification notification; private String token; } @AllArgsConstructor @Builder public static class Notification { private String title; private String body; private String image; } }
Java
복사
우리 어플리케이션에서는 제목, 본문, 이미지를 푸시알림으로 전송하려고 한다.

푸시 전송 로직 작성

1.
먼저 서버에서 설정한 내용을 기반으로 FCM에게 토큰을 요청해야 한다.
@PostConstruct public String getAccessToken() throws IOException { if (!StringUtils.isEmpty(accessToken)) { return accessToken; } GoogleCredentials googleCredentials = GoogleCredentials.fromStream( new ClassPathResource(firbaseConfigPath).getInputStream()) .createScoped(scoped); googleCredentials.refreshIfExpired(); this.accessToken = googleCredentials.getAccessToken().getTokenValue(); return accessToken; }
Java
복사
2.
요청한 토큰과 함께 Message 객체를 만들어 FCM으로 전송하면 된다.
@Service @RequiredArgsConstructor @Slf4j public class FireBaseCloudMessageService { private final UserService userService; @Value("${app.firebase.app.service-key-path}") private String firbaseConfigPath; @Value("${app.firebase.scoped}") private List<String> scoped; @Value("${app.firebase.app.service-api-uri}") private String appUri; private final ObjectMapper om; private String accessToken; public String buildMessage(User user, String title, String body, String image) throws JsonProcessingException { if (user.getDeviceType() == DeviceType.android) { return om.writeValueAsString(FcmMessageForAndroid.builder() .message(FcmMessageForAndroid.Message.builder() .token(user.getPushToken()) .data(FcmMessageForAndroid.Notification.builder() .title(title) .body(body) .image(image) .build() ).build() ) .validateOnly(false) .build()); } return om.writeValueAsString(FcmMessageForIOS.builder() .message(FcmMessageForIOS.Message.builder() .token(user.getPushToken()) .notification(FcmMessageForIOS.Notification.builder() .title(title) .body(body) .image(image) .build() ).build() ) .validateOnly(false) .build()); } }
Java
복사
이 글은 단순히 FCM을 이용해 모바일과 연동하는 방법이다. IOS에서 APNs를 이용하거나 메세지 객체에 추가적인 정보가 들어갈 수도 있고 다양한 변수를 고려해야 한다.