[Spring Boot]APNs과 FCM를 활용하여 푸시알림 구현하기 (1)
↑ 이전 글에서는 APNs와 Firebase 설정을 진행했다. 이번 포스팅에서는 코드를 작성해볼 것이다. Flow에 대해 간단히 설명하면, API 서버에서 FCM으로, FCM에서 APNs로, APNs에서 클라이언트로 푸시 알림을 보낸다. 따라서 우리는 API 서버에서 FCM으로 푸시 알림을 보내는 부분만 구현하면 된다.
먼저 미리 만들어둔 Firebase 프로젝트에서 Admin SDK를 생성해준다. 그리고 만들어진 json 파일을 Spring Boot 프로젝트에 넣어준다. 경로는 src/resources/firebase
다.
@Configuration
public class FCMConfig {
private final ClassPathResource firebaseResource = new ClassPathResource(
"firebase/파일이름.json");
@Bean
FirebaseApp firebaseApp() throws IOException {
FirebaseOptions options = FirebaseOptions.builder()
.setCredentials(GoogleCredentials.fromStream(
firebaseResource.getInputStream()))
.build();
return FirebaseApp.initializeApp(options);
}
@Bean
FirebaseMessaging firebaseMessaging() throws IOException {
return FirebaseMessaging.getInstance(firebaseApp());
}
}
위의 코드는 FirebaseConfig
다. 만약 Firebase 관련된 Bean을 더 등록할 일이 없다면 두 Bean의 코드를 합쳐서 FirebaseMessaging
Bean만 등록해도 상관없다.
지금부터는 Dto, Service를 구현하여 본격적으로 푸시알람 기능을 구현할 것이다. 필자가 구현하려는 기능은 커플 연동 기능
이기 때문에 특정 사용자에서 푸시 알람을 보내는 기능을 구현할 것이다. 따라서 특정 클라이언트를 구별할 수 있는 토큰
이 필요하다. 토큰을 발급 받는 것은 ios(클라이언트)에서 진행 후 서비스를 시작하거나 회원가입 및 프로필 등록 시 같이 넘겨 받아 Member 엔티티
에 저장해두었다.
public record NotificationRequest(@NotBlank String deviceToken,
String title,
String body) {
@Builder
public NotificationRequest {}
public Notification toNotification() {
return Notification.builder()
.setTitle(title)
.setBody(body)
.build();
}
}
만약 이미지나 데이터를 보낸다면 이 DTO에 추가해줘도 된다.
@Service
@RequiredArgsConstructor
public class FCMService {
private final FirebaseMessaging firebaseMessaging;
public void sendNotification(NotificationRequest notificationRequest) throws FirebaseMessagingException {
Message message = Message.builder()
.setToken(notificationRequest.deviceToken())
.setNotification(notificationRequest.toNotification())
.build();
firebaseMessaging.send(message);
}
}
미리 구현해놓은 DTO의 toNotification()
메서드를 활용하여 Message 객체를 만들어준 후 FCM을 전송했다. (해당 Service를 주입받을 Controller의 에러 처리는 ControllerAdvice에서 핸들링 했다.)
https://melonplaymods.com/2023/06/10/roblox-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/police-car-mod-for-melon-playground-2/
https://melonplaymods.com/2023/06/11/simple-helicopter-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/items-from-geometry-dash-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/nami-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/motorcycle-mod-for-melon-playground-3/
https://melonplaymods.com/2023/06/11/colorful-bottles-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/skibidi-toilet-army-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/stickman-sdeath_layt-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/building-in-the-shape-of-a-tank-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/troll-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/the-dollnpc-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/realistic-person-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/m416-rifle-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/headstones-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/decorative-basket-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/unusual-weapon-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/swords-from-terraria-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/fire-haven-wubbox-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/donuts-mod-for-melon-playground/