본문 바로가기

프로그래밍/안드로이드[Android]

[Firebase] 스프링 웹서버에서 안드로이드에 푸시 메시지 보내기[FCM를 이용]



스프링 웹서버에서 Firebase를 이용하여 안드로이드로 푸시 메시지를 보내는 방법에 대해 알려드리고자 합니다.

 

위와 같이 웹서버에서 원하는 내용을 안드로이드에 푸시를 보내는 방법을 소개해 드리겠습니다.

 

또한 기존의 HTTP가 아닌 HTTP v1으로 알려드리겠습니다.

 

현재 기존의 HTTP 버전도 제공하고 있지만 Firebase에서는 Http -> Http v1으로 이전을 권고하고 있습니다.

Firebase 시작하기

우선 Firebase 회원가입과 프로젝트 생성이 되어있어야 합니다.

 

아직 진행하시지 않으신 분은 아래의 글을 참고해 주세요

 

[Firebase] Firebase 처음 시작하기[안드로이드에 푸시 알림]

GCM 에서 FCM 으로 변경 기존에 구글 GCM을 활용한 푸시서비스 방식을 사용하고 있는데요 구글 정책상 GCM은 사용 중지했습니다. 19년도 4월 이후에는 즉시 삭제가 되므로 FCM으로 반드시 변경을 해줘

baessi.tistory.com

 

 

Firebase 설정

Firebase에서 앱 서버로 푸시를 보내는 방법이 HTTP에서 HTTP v1 API로 변경되면서 그전 버전을 사용하시는 분이시라면 이전을 해야 됩니다.

 

또한 Access Token을 발급받아야 사용이 가능합니다.

 

일단 Firebase에서 제공하는 앱 서버 전송 요청 가이드입니다 간단히만 참고하시기 바랍니다.

 

앱 서버 전송 요청 작성  |  Firebase

Firebase Admin SDK 또는 FCM 앱 서버 프로토콜을 사용하여 메시지 요청을 작성하고 다음과 같은 타겟 유형으로 전송할 수 있습니다. 주제 이름 조건 기기 등록 토큰 기기 그룹 이름(기존 프로토콜 및 Node.js용 Firebase Admin SDK만 해당) 사전 정의된 필드로 구성된 알림 페이로드 또는 사용자가 직접 정의한 필드로 구성된 데이터 페이로드와 함께 메시지를 보내거나 두 가지 유형의 페이로드를 모두 포함하는 메시지를 보낼 수 있습

firebase.google.com

자 그럼 Access Token을 발급을 받도록 하겠습니다.

Project Overview -> 프로젝트 설정을 클릭합니다.

자 다음으로 서비스 계정 탭을 클릭합니다.

 

다음으로 스프링 프레임 워크를 이용하므로

자바를 체크 -> 새 비공개 키 생성을 클릭합니다.

 

그럼 경고 창을 볼 수 있습니다. 비공개 키이므로 유출에 주의를 하셔야 합니다!

키 생성 버튼을 클릭합니다.

그리고 파일을 다운로드합니다.(다운로드하신 파일은 잘 보관합니다.)

디바이스 토큰 확인

자 그리고 Firebase를 이용하기 위해 안드로이드 애플리케이션의 디바이스 토큰을 알아야 합니다.

 

디바이스 토큰이란 쉽게 말해서 FCM를 이용하는 데 있어 식별할 수 있는 고유 키값으로 디바이스를 구분하는 데 사용할 수 있습니다.

 

이러한 디바이스 토큰을 별도로 DB에 저장하여 원하는 타깃에게만 푸시를 할 수 있도록 하는 원리입니다.

 

또한 디바이스 코드는 변경될 수 있다는 점 참고하셔야 합니다.

 

주기적으로 DB에 Update 하는 방식으로 코딩을 하셔야 합니다.

 

따라서 저는 개인 핸드폰의 디바이스 토큰을 이용하겠습니다.(에뮬로도 가능합니다.)

 

다음과 같이 메인 액티비티에서 Logcat를 이용하여 확인합니다.

아래는 소스 코드입니다.

Log.d("DeviceToken: ", FirebaseInstanceId.getInstance().getToken().toString());

 

그리고 안드로이드를 실행하고 Logcat에서 확인합니다.

 

아래는 디바이스 토큰입니다.

나머지 부분은 모자이크 처리를 해서 전체를 복사하시면 됩니다.

maven 추가

그리고 Firebase를 사용하기 위해 maven 추가를 합니다.

maven 추가 후 maven clean과 install은 필수입니다.

<!-- Firebase-->
<dependency>
    <groupId>com.google.firebase</groupId>
    <artifactId>firebase-admin</artifactId>
    <version>6.7.0</version>
</dependency>

 

 

소스코드 작성

자 다음으로는 저는 별도의 클래스를 생성하여 FcmUtil.java라는 파일을 만들었습니다.

FcmUtil.java

@Component
public class FcmUtil {
    public void send_FCM(String tokenId, String title, String content) {
        try {    
            //본인의 json 파일 경로 입력
            FileInputStream refreshToken = new FileInputStream("<json 파일 경로>");
            
            FirebaseOptions options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(refreshToken))
                    .setDatabaseUrl("<Firebase의 Url>")
                    .build();
            
            //Firebase 처음 호출시에만 initializing 처리
            if(FirebaseApp.getApps().isEmpty()) { 
                FirebaseApp.initializeApp(options);
            }
            
            //String registrationToken = 안드로이드 토큰 입력;
            String registrationToken = tokenId;

            //message 작성
            Message msg = Message.builder()
                    .setAndroidConfig(AndroidConfig.builder()
                        .setTtl(3600 * 1000) // 1 hour in milliseconds
                        .setPriority(AndroidConfig.Priority.NORMAL)
                        .setNotification(AndroidNotification.builder()
                            .setTitle(title)
                            .setBody(content)
                            .setIcon("stock_ticker_update")
                            .setColor("#f45342")
                            .build())
                        .build())
                    .setToken(registrationToken)
                    .build();

            //메세지를 FirebaseMessaging 에 보내기
            String response = FirebaseMessaging.getInstance().send(msg);
            //결과 출력
            System.out.println("Successfully sent message: " + response);
                 
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

}

자 다음으로는 아까 Firebase에서 다운로드한 파일을 스프링 내부에 복사합니다.

저는 webapp -> resources -> fcm에 넣었습니다.

그러고 나서 json 파일의 경로를 가져옵니다.

Location 경로를 복사합니다.

그리고 FileInputStream("<json 파일 경로>"); 이 부분에 String 형태로 절대 경로를 넣어줍니다.

글로벌 프로퍼티로 따로 경로를 관리하시는 분들은 해당 자리에 경로만 맞춰 주시면 됩니다.

그리고. setDatabaseUrl("<Firebase의 Url>") 이 부분에는 Firebase의 프로젝트 경로를 넣습니다.

 

https://<프로젝트 명>.firebaseio.com

FcmUtil.java를 모두 작성하고 다음은 컨트롤러 부분에서 클래스를 호출합니다.

 

매개변수로 토큰 id, title. message 부분을 전달합니다.

 

자 간단하게 URL을 호출하면 푸시가 가는지 테스트하기 위해 컨트롤러에 다음과 같이 작성합니다.

 

저는 간단하게 웹에서 Url을 호출하면 바로 동작하게끔 코딩을 하였습니다.

@RequestMapping(value = "/fcmtest.do")
    public  @ResponseBody String fcmtest(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
      
        String tokenId="안드로이드 토큰 입력";
        String title="제목입니다";
        String content="내용입니다";
      
        FcmUtil FcmUtil = new FcmUtil();
        FcmUtil.send_FCM(tokenId, title, content);
      
        return "test";
}

자 이렇게 한 후 해당 URL를 호출합니다.

 

호출하면 해당 토큰의 안드로이드에 푸시 알림이 가야 정상작동으로 볼 수 있습니다.

 

호출 후 다음과 같이 이클립스에서 메시지를 볼 수 있습니다.

안드로이드에서 푸시 알림을 확인합니다.

 

확인할 때는 앱을 켜지 마시고 앱을 닫거나 백그라운드 상태로 두고 확인을 해야 합니다.

 

(참고로 앱 실행 중에는 수신이 안됩니다. 앱 실행 중 수신은 별도로 구현해야 합니다.. 추후에 다른 글로 안내해 드리겠습니다.)

자 이렇게 푸시 알림이 잘 도착했습니다.

 

푸시 알림의 세부 설정도 가능합니다.

 

세부 설정에 대한 내용은 다음 사이트를 참고하시면 됩니다.

 

메시지 전송  |  Firebase

시작하기 전에 Admin FCM API를 사용하려면 우선 서버에 Firebase Admin SDK 추가 단계를 따릅니다. 또한 Firebase 프로젝트 ID로 Admin SDK를 초기화해야 합니다. 다음 3가지 방법 중 하나를 사용합니다. projectId Firebase 앱 옵션을 명시적으로 지정합니다. 서비스 계정 사용자 인증 정보로 SDK를 초기화합니다. GCLOUD_PROJECT 환경 변수를 설정합니다. export GCLOUD_PROJECT='m

firebase.google.com

섹션 설정

푸시 알림의 세부 설정

자 이렇게 해서 Firebase를 이용하여 스프링 웹서버에서 안드로이드로 푸시 알림을 보내는 방법에 대해 정리했습니다.

 

감사합니다.