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

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

by cbwstar 2021. 8. 3.
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
반응형

댓글



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

loading