스프링

 

JAVA SpringMVC 웹서버로 Google FCM HTTP POST 푸시 보내기

 

오늘은 FCM콘솔로 푸시를 보내지 않고, 자바 스프링MVC 웹서버(WAS)를 이용하여 이전에 구현했던 안드로이드 어플리케이션으로 푸시를 보내보겠습니다.

 

먼저 FCM 푸시를 수신받을 어플리케이션을 제작 및 FCM 콘솔에 프로젝트를 생성을 하셔야합니다.

(사전 준비가 되지 않으신분은 아래에 이전에 작성한 포스팅 자료의 링크를 참조해주시면 되겠습니다.)

 

FCM 프로젝트 생성 및 FCM 수신 어플리케이션 제작

https://web-inf.tistory.com/21

 

이번 과정에서는 스프링MVC 프로젝트를 만드는과정은 간단한 과정이기 때문에 생략하고 진행하도록 하겠습니다.

 

1. 시작하기 

 

먼저 이전 앱 서버로 푸시를 보내는 가이드 문서가 업데이트되어 HTTP v1 API로 변경이 되었습니다.

해당 문서는 FCM 프로젝트에서 비밀 KEY파일을 받아 Access Token을 발급 받은 뒤, Access Token과 함께 안드로이드의 해당 Device Token으로 푸시 요청을 보내는 과정입니다.

 

구글 FCM HTTP v1 API 가이드 문서

 https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko

 

먼저 Access Token을 발급과정을 위해 key파일을 생성해보겠습니다.

 

 

FCM 콘솔에 접속을 합니다.

그리고 저번에 생성해뒀던 FCM TEST 프로젝트가 보이네요.

자신이 사용하는 FCM 프로젝트를 클릭해서 접속해주세요.

콘솔 링크 : https://console.firebase.google.com/u/0/project/_/settings/serviceaccounts/adminsdk?hl=ko

 

 

프로젝트에 접근한뒤, 설정에 서비스 계정 항목을 선택해서 들어가주세요.

 

 

오늘은 JAVA를 이용하여 작업을 진행하기 때문에, 자바를 선택하신뒤 비공개 키 생성 버튼을 눌러주세요.

 

 

한번더 경고창이 나오며 묻게 됩니다.

키 생성을 눌러 비밀키 JSON파일을 다운로드 받아주세요.

다운로드 하신 파일은 잘보관해주세요. 이후 작업에 사용됩니다.

 

 

2. SpringMVC 프로젝트에 API 구현하기

 

 

 

먼저 스프링MVC Maven, JAVA1.8 프로젝트와 톰캣을 준비하였습니다.

구현하는 용도에따라 다른분들은 구성이 달라질것이라 생각하여 프로젝트 생성 및 과정은 생략하였습니다.

 

또한 구글에서 제공하는 API에서는 자바환경에 Gradle 가이드만 제공되고 있어 Maven으로 동작시켜보았습니다.

세부적인 DB연결과 프로퍼티 저장등은 샘플환경만보시고 따로 작업해주시면 될 것 같습니다.

 

 

 

 

1. 준비과정 - 디바이스 토큰(Device Token)

먼저 이전에 만들어놓은 어플리케이션에서 디바이스 토큰을 가져 옵니다.

위 스크린샷에 MainActivity를 실행했을때 로그로 DeviceToken을 획득하게 설정해준후 에뮬레이터로 가져왔습니다.

(디바이스 토큰은 가끔 변경이 되므로 DB에 저장을 해두던가 별도의 방법으로 refresh받아 작업하시면될것같습니다.)

 

 

 

 

로그에 디바이스 토큰을 가져온 스크린샷 입니다.

디바이스토큰을 어디에 기록해두시면 됩니다.

 

 

 

 

2. 준비과정 - Firebase admin SDK 비밀키

먼저 사전에 생성해놓은 비밀키를 프로젝트 내에 복사해주세요.

저는 webapp > resources > google > json 경로에 복사해두었습니다.

(따로 키를 DB에 보관하시거나 저장하는 작업은 별도로 진행하시면 될 것 같습니다.)

 

 

      <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <version>1.1.1</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/com.google.api-client/google-api-client -->
        <dependency>
            <groupId>com.google.api-client</groupId>
            <artifactId>google-api-client</artifactId>
            <version>1.26.0</version>
        </dependency>
                        
        <!-- https://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client -->
        <dependency>
            <groupId>com.google.oauth-client</groupId>
            <artifactId>google-oauth-client</artifactId>
            <version>1.26.0</version>
        </dependency>
                
        <!-- https://mvnrepository.com/artifact/com.google.http-client/google-http-client -->
        <dependency>
            <groupId>com.google.http-client</groupId>
            <artifactId>google-http-client</artifactId>
            <version>1.26.0</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/com.google.http-client/google-http-client-jackson2 -->
        <dependency>
            <groupId>com.google.http-client</groupId>
            <artifactId>google-http-client-jackson2</artifactId>
            <version>1.26.0</version>
        </dependency>  
        
        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>27.0.1-jre</version>
        </dependency>

 

 

3. 준비과정 - Maven FCM전용 라이브러리 업데이트

 

프로젝트의 pom에 해당 dependecy를 붙여놓고 라이브러리를 다운받아주세요.

구글 가이드에서는 api-client라이브러리만 다운받으면 진행이 된다고 적혀있지만, 사실상 위에 기재된 라이브러리가 모두 필요하였습니다.

추가로 Spring의 RestTemplate을 사용하였으며, API로 파라미터를 넘길때는 JSON을 사용하였습니다.

(많은 삽질이 있었습니다.)

 

 

GOOGLE SEND API를 보시면 이제, 액세스 키 발급조건과, 디바이스토큰은 획득하였으며 POST방식으로 푸시를 보내주기만 하면됩니다.

(위 API 문서 링크에 있는 자료 입니다.)

 

 

@RequestMapping(value="/fcmTest", method=RequestMethod.GET, produces="text/plain;charset=UTF-8")
    public void fcmTest() throws Exception {
        try {    
            
            String path = "C:/** .. **/webapp/resources/google/{fcm-test-*******************************.json}";           
            String MESSAGING_SCOPE = "https://www.googleapis.com/auth/firebase.messaging";
            String[] SCOPES = { MESSAGING_SCOPE };
            
            GoogleCredential googleCredential = GoogleCredential
                                .fromStream(new FileInputStream(path))
                                .createScoped(Arrays.asList(SCOPES));
            googleCredential.refreshToken();
                                
            HttpHeaders headers = new HttpHeaders();
            headers.add("content-type" , MediaType.APPLICATION_JSON_VALUE);
            headers.add("Authorization", "Bearer " + googleCredential.getAccessToken());
            
            JSONObject notification = new JSONObject();
            notification.put("body", "TEST");
            notification.put("title", "TEST");
            
            JSONObject message = new JSONObject();
            message.put("token", "fa_qIyte8d4:APA91bHOGnZulT059PyK3z_sb1dIkDXTiZUIuRksmS7TdK6XgXAS5kopeGIwUfyhad3X3iXMNknCUOZaF6_mgoj1ohG10CanRyJ_EW1d3xN2E-1DPiLdbMK4pdOgdhB1ztZClqB-25rC");
            message.put("notification", notification);
            
            JSONObject jsonParams = new JSONObject();
            jsonParams.put("message", message);
            
            HttpEntity<JSONObject> httpEntity = new HttpEntity<JSONObject>(jsonParams, headers);
            RestTemplate rt = new RestTemplate();            
            
            ResponseEntity<String> res = rt.exchange("https://fcm.googleapis.com/v1/projects/{프로젝트명}/messages:send"
                    , HttpMethod.POST
                    , httpEntity
                    , String.class);
        
            if (res.getStatusCode() != HttpStatus.OK) {
                log.debug("FCM-Exception");
                log.debug(res.getStatusCode().toString());
                log.debug(res.getHeaders().toString());
                log.debug(res.getBody().toString());
                
            } else {
                log.debug(res.getStatusCode().toString());
                log.debug(res.getHeaders().toString());
                log.debug(res.getBody().toLowerCase());
                
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

 

먼저 풀소스 입니다.

테스트용으로 컨트롤러 단에 바로 호출하여 동작하도록 작성하였습니다.

'{ }' 부분은 자신의 조건에 맞춰 기입하셔야합니다.

 

구글 액세스키를 발급받은뒤 RestTemplate을 통하여 POST로 푸시를 발송하는 과정 입니다.

이제 중요포인트만 따로 뽑아서 설명을 드리고 마치겠습니다.

 

 

 

1. AccessKey 발급

 

먼저 AccessKey를 발급하기위해서는, 비밀키 경로를 InputStream으로 읽을수 있게 요구합니다.

절대경로로 작성되어야 하며, 차후에 프로퍼티에 기록 또는 DB 기록작업을 작업하시면 될 것 같습니다.

 

 

 

 

2. 푸시 내용 및 디바이스토큰으로 전송

 

발급된 액세스토큰을 HTTP헤더에 넣습니다. (빨간색 박스)

푸시내용을 JSON Object으로 API파라미터 조건에 맞게 담습니다. (초록색 박스)

앱에서 가져온 디바이스 토큰을 JSON Object로 API파라미터 조건에 맞게 담습니다. (노란색 박스)

마지막으로 요청할 주소를 넣습니다.

주의사항으로 자신의 프로젝트ID를 기입하여야 합니다. (파란색박스)

(프로젝트ID는 프로젝트 콘솔 -> 설정 -> 일반 에서 확인할수 있습니다.)

 

코드 작성을 마치셨으면 발송 후 로그를 확인 합니다.

 

요청을 통하여 '200' 으로 정상 요청이 되었다는것을 확인할수있습니다.

 

 

에뮬레이터 역시나 정상도착하여 아까 기입한 'TEST' 라는 푸시가 날라온걸 확인 할 수 있습니다.

 

 

이상으로 Spring MVC Maven 프로젝트를 통한 FCM 푸시 보내기를 마치겠습니다.

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

지레 짐작 매꾸러기 , 쓸데없는 데까지 미리 짐작하여 무슨 일을 하다가는 낭패보기가 일쑤라는 말.

댓글 ( 4)

댓글 남기기

작성