안녕하세요.
오늘은 FCM을 이용한 해당 어플로 push 전송을 하는 예제를 포스팅하겠습니다.
시작하기에 앞서 안드로이드 및 ios 등 Firebase console 에서 프로젝트를 생성 하신뒤
FCM key를 이용한 디바이스 토큰을 발급 받아야 테스트가 가능합니다.
blog.naver.com/ndb796/221553341369
준비가 안되셨다면 해당 예제를 준비하셔야 합니다.
시작하겠습니다.
1. Pom.xml 추가
<!--firebase-->
<dependency>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-admin</artifactId>
<version>6.5.0</version>
</dependency>
<!--https://mvnrepository.com/artifact/org.json/json-->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
<!--logger-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
2. 패키지 구조
일단 저의 패키지 구조는 이렇습니다.
이런 구조입니다.
뭐 물론 바꾸셔도 상관없구요 !
3. NotificationController.java
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import org.json.JSONException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import kr.jihoinc.kidcare.adm.pushapi.handle.AndroidPushPeriodicNotifications;
import kr.jihoinc.kidcare.adm.pushapi.service.AndroidPushNotificationsService;
import kr.jihoinc.kidcare.adm.pushdtl.model.PushDtlVO;
import kr.jihoinc.kidcare.adm.pushdtl.service.PushDtlService;
@RestController
public class NotificationController {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
AndroidPushNotificationsService androidPushNotificationsService;
@Autowired
private PushDtlService pushDtlService;
@GetMapping(value = "/pushMst/pushApi/pushSend")
public @ResponseBody ResponseEntity<String> send() throws JSONException, InterruptedException {
AndroidPushPeriodicNotifications androidPushPeriodicNotifications = new AndroidPushPeriodicNotifications();
/*
* PushDtlVO pusDtlVO = new PushDtlVO(); ArrayList<String> saveArr = new
* ArrayList<>(); List<PushDtlVO> dataList =
* pushDtlService.pushDtlList(pusDtlVO); for(PushDtlVO data : dataList) {
* saveArr.add(data.getUserId()); } pusDtlVO.setTestArr(saveArr);
*/
String notifications = androidPushPeriodicNotifications.PeriodicNotificationJson();
System.out.println("##########notifications#########" +notifications);
HttpEntity<String> request = new HttpEntity<>(notifications);
System.out.println("##########request#########" +request);
CompletableFuture<String> pushNotification = androidPushNotificationsService.send(request);
CompletableFuture.allOf(pushNotification).join();
try{
String firebaseResponse = pushNotification.get();
return new ResponseEntity<>(firebaseResponse, HttpStatus.OK);
}
catch (InterruptedException e){
logger.debug("got interrupted!");
throw new InterruptedException();
}
catch (ExecutionException e){
logger.debug("execution error!");
}
return new ResponseEntity<>("Push Notification ERROR!", HttpStatus.BAD_REQUEST);
}
}
주석 처리되어 있는 부분은 제가 프로젝트 진행하면서 글 작성을 위하여 잠시 해놓은거니
신경 안쓰셔도 됩니다.
4. AndroidPushPeriodicNotifications.java
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import kr.jihoinc.kidcare.adm.pushdtl.service.PushDtlService;
public class AndroidPushPeriodicNotifications {
@Autowired
private PushDtlService pushDtlService;
public String PeriodicNotificationJson() throws JSONException {
LocalDate localDate = LocalDate.now();
String sampleData[] = {"token1", "token2"}; // 디바이스 토큰을 넣어주셔야 합니다.
/*
* System.out.println("@@@@@@@pushDtl"+pushDtlVO.getTestArr());
* ArrayList<String> sampleData = pushDtlVO.getTestArr();
* System.out.println("@@@@@@@@@@@"+sampleData);
*/
List<String> tokenlist = new ArrayList<String>();
JSONObject body = new JSONObject();
JSONArray array = new JSONArray();
for(int i=0; i<sampleData.length; i++) {
tokenlist.add(sampleData[i]);
}
for(int i=0; i<tokenlist.size(); i++) {
array.put(tokenlist.get(i));
}
body.put("registration_ids",array);
body.put("priority", "high");
JSONObject notification = new JSONObject();
notification.put("title","hello!");
notification.put("body","hello");
body.put("notification", notification);
System.out.println("##########body.toString()#########" +body.toString());
System.out.println(body.toString());
return body.toString();
}
}
다른분들은 해당 메소드를 static으로 선언하여 사용하시던데 저는.. static으로 사용 할려하니
데이터가 안들어가서요. static으로 변환하여 사용 하셔도 됩니다.
5.HeaderRequestInterceptor.java
import java.io.IOException;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.support.HttpRequestWrapper;
public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor {
private final String headerName;
private final String headerValue;
public HeaderRequestInterceptor(String headerName, String headerValue) {
this.headerName = headerName;
this.headerValue = headerValue;
}
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
HttpRequest wrapper = new HttpRequestWrapper(request);
wrapper.getHeaders().set(headerName, headerValue);
return execution.execute(wrapper, body);
}
}
6.AndroidPushNotificationsService.java
package kr.jihoinc.kidcare.adm.pushapi.service;
import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
import org.springframework.http.HttpEntity;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import kr.jihoinc.kidcare.adm.pushapi.handle.HeaderRequestInterceptor;
@Service
public class AndroidPushNotificationsService {
private static final String firebase_server_key="FCM KEY !!!!!!!!!!!!!!!!!!!!!!!!!";
private static final String firebase_api_url="https://fcm.googleapis.com/fcm/send";
@Async
public CompletableFuture<String> send(HttpEntity<String> entity) {
RestTemplate restTemplate = new RestTemplate();
ArrayList<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
interceptors.add(new HeaderRequestInterceptor("Authorization", "key=" + firebase_server_key));
interceptors.add(new HeaderRequestInterceptor("Content-Type", "application/json"));
restTemplate.setInterceptors(interceptors);
String firebaseResponse = restTemplate.postForObject(firebase_api_url, entity, String.class);
return CompletableFuture.completedFuture(firebaseResponse);
}
}
위에 있는 FCM KEY는 ! 협업 하고있다면 안드로이드 개발자분에게 물어보면 되지만
직접 찾아가실려면 아래와 같이 보시면 됩니다.
톱니바퀴 클릭 후 프로젝트 설정 누르신 뒤
클라우드 메시징 클릭 후 서버키 입력 하시면 됩니다!
그런뒤 테스트 해보시면 됩니다!
이상 포스팅 마치도록하겠습니다.
감사합니다.
'개발 > Spring' 카테고리의 다른 글
[Spring] poi 병목현상 해결! (0) | 2020.11.12 |
---|---|
[Spring] poi를 이용한 excel 다운로드 (0) | 2020.11.06 |
[Spring] 파일 정보를 못가져오는 에러! MultipartFile에 Xss Filter적용 (0) | 2020.10.30 |
[Spring] 스프링부트 시큐리티를 이용한 로그인! (0) | 2020.10.19 |
[Java] Spring RestTemplate 에서 인증서 유효성 검사 안 함 (0) | 2020.03.27 |