728x90
반응형
이제 service 인터페이스를 상속받은 구현체를 작성하자
PwaPushServiceImpl.java 파일을 열자
package pwapush.service.impl;
import java.io.IOException;
import java.net.URLEncoder;
import java.security.GeneralSecurityException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.jose4j.base64url.Base64;
import org.jose4j.json.internal.json_simple.JSONObject;
import org.jose4j.lang.JoseException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.io.support.ResourcePropertySource;
import org.springframework.stereotype.Service;
import nl.martijndwars.webpush.Notification;
import nl.martijndwars.webpush.PushService;
import pwapush.model.UserSubscriInfo;
import pwapush.service.PwaPushService;
@Service("pwaPushService")
public class PwaPushServiceImpl implements PwaPushService {
private Logger logger = LoggerFactory.getLogger(PwaPushServiceImpl.class);
@SuppressWarnings("unchecked")
@Override
public void sendMessage(Map<String, Object> messageMap, List<UserSubscriInfo> userSubscriInfo) throws GeneralSecurityException, InterruptedException, JoseException, ExecutionException, IOException {
// 컨테이너 생성
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
// 환경변수 관리 객체 생성
ConfigurableEnvironment env = ctx.getEnvironment();
// 프로퍼티 관리 객체 생성
MutablePropertySources prop = env.getPropertySources();
// 프로퍼티 관리 객체에 프로퍼티 파일 추가
prop.addLast(new ResourcePropertySource("classpath:pwa.properties"));
// 프로퍼티 정보 얻기
String publicKey = env.getProperty("publicKey");
String privateKey = env.getProperty("privateKey");
logger.debug("publicKey=======>"+ publicKey);
logger.debug("privateKey=======>"+ privateKey);
logger.debug("sendMessage=======>"+ messageMap);
logger.debug("userSubscriInfo=======>"+ userSubscriInfo);
/* 화면에 출력할 내용 셋팅 인자로 넘어온 값을 셋팅해준다. */
JSONObject jsonObject = new JSONObject();
jsonObject.put("title",
Base64.encode(URLEncoder.encode(
messageMap.get("title").toString(),"UTF-8").getBytes()) );
jsonObject.put("body", Base64.encode(URLEncoder.encode(
messageMap.get("body").toString(),"UTF-8").getBytes()));
jsonObject.put("icon", messageMap.get("icon")); //나타날이미지
jsonObject.put("badge", messageMap.get("badge"));
jsonObject.put("vibrate", messageMap.get("vibrate"));
jsonObject.put("params", messageMap.get("params"));
jsonObject.put("image", messageMap.get("image"));
jsonObject.put("requireInteraction",
messageMap.get("requireInteraction"));
jsonObject.put("actions", messageMap.get("actions"));
String payload = jsonObject.toString();
logger.debug("payload=======>"+ payload);
PushSubscription pushSubscription = new PushSubscription();
Notification notification;
PushService pushService;
//db에 등록되어 있는 구독자를 가지고 와서 메세지를 전송한다.
for (UserSubscriInfo userInfo : userSubscriInfo) {
pushSubscription.setEndpoint(userInfo.getEndpoint());
pushSubscription.setKey(userInfo.getP256dh());
pushSubscription.setAuth(userInfo.getAuthor());
notification = new Notification(
pushSubscription.getEndpoint(),
pushSubscription.getUserPublicKey(),
pushSubscription.getAuthAsBytes(),
payload.getBytes()
);
pushService = new PushService();
pushService.setPublicKey(publicKey);
pushService.setPrivateKey(privateKey);
pushService.setSubject("mailto:admin@domain.com");
// Send the notification
pushService.send(notification);
}
}
}
3.2.7 repository 코딩하기위에 구현체가 db에 구독자를 가지고 와서 파라미터로 넘어온 push알림 메세지를 사용자들에게 전송하는 전송부다.
jpa 인터페이스를 상속받아서 저장하는 인터페이스를 작성해 보자.
UserSuvscriInfoRepository.java 파일을 열자
package pwapush.repository;
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.data.jpa.repository.JpaRepository;
import pwapush.model.UserSubscriInfo;
public interface UserSuvscriInfoRepository extends JpaRepository<UserSubscriInfo, Integer>{
/* 구독자 정보를 배열로 가지고 온다. */
List<UserSubscriInfo> findByP256dh(String p256dh);
/* 구독취소시 삭제 처리 한다. */
@Transactional
int deleteByP256dh(String p256dh);
}
서버쪽 구현은 끝났다.
웹페이지 구현이 남았다.
728x90
반응형
'프로그램 > 스프링' 카테고리의 다른 글
스프링부트 메이븐 컴파일 (0) | 2023.05.10 |
---|---|
스프링 대용량 멀티 배치_스케줄 (0) | 2022.08.16 |
[PWA] 자바로 pwa push 알림 기능 개발하기(11) (0) | 2021.08.03 |
[PWA] 자바로 pwa push 알림 기능 개발하기(10) (0) | 2021.08.03 |
[PWA] 자바로 pwa push 알림 기능 개발하기(9) (0) | 2021.08.03 |
댓글