본문 바로가기
프로그램/스프링

[PWA] 자바로 pwa push 알림 기능 개발하기(12)

by cbwstar 2021. 8. 3.
728x90
반응형

이제 service 인터페이스를 상속받은 구현체를 작성하자

PwaPushServiceImpl.java 파일을 열자

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 파일을 열자

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
반응형


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."