상세 컨텐츠

본문 제목

[Spring] FCM PUSH Notification (FCM PUSH 알림)

PROGRAMMING/Backend

by koharin 2022. 3. 11. 23:39

본문

728x90
반응형

이 글에서는 spring 서버에서 Firebase Adming SDK를 사용하여 firebase cloud message를 생성하고 클라이언트인 안드로이드로 송신하는 방법을 설명한다.

 

📝 Prerequisite

✔ Firebase 프로젝트 생성

https://koharinn.tistory.com/587

 

FCM PUSH Notification (안드로이드)

프로젝트에서 클라이언트 앱에 띄울 알림 기능을 구현해야 해서 FCM 을 처음 사용해보았다. 원하는 기능은 클라이언트 앱에서 특정 이벤트가 발생했을 때 특정 사용자에게 알림을 보내는건데, Fi

koharinn.tistory.com

시작하기 전, Firebase Console에서 프로젝트를 생성해야 한다.

생성한 프로젝트에서 키를 받아와야 하니, 위 글의 프로젝트 생성 과정을 참고하여 프로젝트 생성 후 다음 단계를 진행하자.

 

✔ Java 7 이상 (Java 8 이상 권장)

Admin Java SDK의 경우, Java 7은 지원이 중단되었으니 Java 8 버전 이상을 사용해야 한다.

 

 

📝 Maven Dependency

<dependency>
  <groupId>com.google.firebase</groupId>
  <artifactId>firebase-admin</artifactId>
  <version>8.1.0</version>
</dependency>

Firebase Admin SDK를 사용하기 위한 dependency를 pom.xml 파일에 추가해준다.

 

 

📝 Firebase Admin SDK

FCM 서버와 상호작용할 수 있도록 Firebase Admin SDK를 지원한다.

먼저, Firebase Admin SDK를 초기화해야 한다.

초기화 과정에서 비공개 키를 가져와야 하는데, Firebase Console 프로젝트에서 다운로드할 수 있다.

 

✔ 서비스 계정의 비공개 키

[설정] -> [프로젝트 설정]으로 이동한다.

 

[프로젝트 설정] -> [서비스 계정]으로 이동하면 위의 화면을 볼 수 있다.

서버에서 사용하는 언어, 여기에서는 자바를 선택하면 Firebase Admin SDK를 초기화하는 코드를 볼 수 있다.

그 아래의 새 비공개 키 생성으로 비공개 키를 받는다.

키가 들어있는 JSON 파일을 받게 되고, JSON 파일을 원하는 경로에 위치시킨다.

 

 

✔ Admin SDK 초기화

@Service
public class FCMInitializer {

    @PostConstruct
    public void initialize() throws IOException {
        // initialize Admin SDK using OAuth 2.0 refresh token

        FileInputStream refreshToken = new FileInputStream("/path/to/service-account-file.json");

        FirebaseOptions options = FirebaseOptions.builder()
                .setCredentials(GoogleCredentials.fromStream(refreshToken))
                .setProjectId("project-id")
                .build();

        FirebaseApp.initializeApp(options);       
    }
}

Firebase 서버 API를 호출하는데 사용되는 google 계정 인증을 위한 과정이다.

인증이 이루어지면 서버는 FCM 서버로 FCM 메시지를 보내고, FCM 서버는 클라이언트로 메시지를 전달할 수 있다.

refreshToken에서 파일은 앞 단계에서 받은 비공개 키가 들어있는 JSON 파일의 절대 경로를 적어준다.

 

setProjectId에는 생성한 프로젝트 ID를 적어준다.

[설정] -> [프로젝트 설정] -> [일반]에서 확인할 수 있는 프로젝트 번호를 적어주면 된다.

setProjectId를 지정하는 것이 필수는 아니다.

 

 

반응형

📝 Message 전송 요청 작성

Firebase Admin SDK을 사용해서 메시지 요청을 작성하고, 여러 유형의 타겟으로 전송할 수 있다.

이 글에서는 기기 등록 토큰 (registration token)으로 타겟을 지정하여 메시지를 전송하는 방법을 설명한다.

또한 메시지는 알림 메시지, 데이터 메시지의 2가지 종류가 있는데, 알림 페이로드와 데이터 페이로드를 모두 포함하는 알림 메시지를 전송하는 방법이다.

 

✔️ 특정 기기에 메시지 전송

메시지는 다음을 목적으로 알림과 데이터 페이로드를 포함한다

알림 페이로드: 클라이언트에서 띄울 알림의 title과 body 정보 포함

데이터 페이로드: 클라이언트에서 알림 클릭 시 이동할 인텐트에 포함할 정보를 위해 설정

 

@Service
public class FCMService {

    // send message to android
    public String sendMessage(int requestId, String registrationToken) throws FirebaseMessagingException {
        Message message = Message.builder()
                .setAndroidConfig(AndroidConfig.builder()
                        .setTtl(3600*1000)
                        .setPriority(AndroidConfig.Priority.HIGH)
                        .setRestrictedPackageName("org.smu.blood") // 애플리케이션 패키지 이름
                        .setDirectBootOk(true)
                        .setNotification(AndroidNotification.builder()
                                .setTitle("BLRING") // 알림 제목
                                .setBody("헌혈 요청글에 헌혈이 신청되었습니다.") // 알림 본문
                                .setIcon("@drawable/bling")
                                .build())
                        .build())
                .putData("requestId", Integer.toString(requestId)) // request 식별 정보(requestId) 넣기
                .setToken(registrationToken) // 요청자의 디바이스에 대한 registration token으로 설정
                .build();


        // Send a message to the device corresponding to the provided registration token.
        String response = FirebaseMessaging.getInstance().send(message);

        return response;
    }
}

위의 코드에서 데이터 페이로드에 포함한 requestId는 필요에 따라 적절히 바꾸거나, 데이터 페이로드를 사용하지 않으면 된다.

registration token의 경우 어떤 사용자 기기로 보내야 하는지에 대한 목적지 정보이므로, 유효한 토큰이어야 제대로 원하는 기기에 메시지가 전달될 수 있다.

유효하지 않은 토큰 대상으로 메시지를 계속 전달하려고 하면 INVALID_ARGUMENT 에러를 보게 된다.

따라서 항상 업데이트된 사용자의 registration token을 DB에서 저장할 수 있도록 구현하는 것이 중요하다.

 

클라이언트가 안드로이드이기 때문에 AndroidConfig를 사용하여 Priority, ttl, packagename, notification과 같은 필요 정보를 넣어줬다.

Notification에는 안드로이드에서 알림을 띄울 때 보여줄 title, body 정보와 기타 아이콘을 설정해준다.

 

이렇게 만들어준 메시지가 클라이언트로 정상 전달이 되었다면, 위와 같은 보내진 메시지 정보를 반환해준다.

 

 

 

📝 클라이언트에서 메시지 수신

서버에서 알림을 보내면 클라이언트에 바로 알림이 수신되고, 클라이언트에서 받은 메시지에 담긴 정보를 바탕으로 Notification을 생성해서 띄워주면 알림을 띄울 수 있다.

fcm 수신만으로는 바로 알림을 띄울 수 있는건 아니고, 클라이언트 측에서 알림으로 메시지를 가공해줘야 알림을 띄울 수 있게 된다.

 

 

 

728x90
반응형

'PROGRAMMING > Backend' 카테고리의 다른 글

AWS EC2에 Spring 서버 배포  (1) 2022.03.04
[Spring] JWT Token 사용하기  (0) 2022.02.27
[Spring] 테스트 코드 작성  (0) 2022.02.24
[Spring] 응답 문자열 한글 깨짐 문제 해결  (0) 2022.02.16
JWT (JSON Web Token)  (0) 2022.01.28

관련글 더보기