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를 이용하거나 메세지 객체에 추가적인 정보가 들어갈 수도 있고 다양한 변수를 고려해야 한다.