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

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

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

3.2.4 Controller 코딩하기

Controller파일 부터 작성하자.

PwaPushController.java 열어서 아래와 같이 코딩한다. 주석으로 설명을 대신하겠다.

@Controller   //controller 파일이라고 정의해 주는 애노테이션이다.

public class PwaPushController {

//로깅을 찍기 위해서 선언해 준다.        
private Logger logger = LoggerFactory.getLogger(PwaPushController.class);
        
    //서비스가 기동시 생성된 객체를 주입하여 사용할수 있게 해준다.
   @Resource(name = "pwaPushService")
   private PwaPushService pwaPushService;
        
    //jpa 생성자를 주입하여 jpa쿼리를 사용할수 있게 해준다.
        @Autowired
        private UserSuvscriInfoRepository userSuvscriInfoRepository;

        /**
         * 알림허용 등록 브라우저에서 호출하는 주소다.
         * @return ModelAndView
         * @exception Exception
         */
        @RequestMapping({"/push/subscribe.do"})
        public ModelAndView subscribe(HttpServletRequest request,
           HttpServletResponse response, @RequestBody String transactionConfig)
           throws GeneralSecurityException, InterruptedException, JoseException,
           ExecutionException, IOException {
                  
           logger.debug("/push/subscribe.do 호출");                        
           ModelAndView mav = new ModelAndView("jsonView");
           //@RequestBody 형식으로 전달 받는 데이터는 문자로 넘어온다. 문자 데이터를
        //객체형식으로 바꿔야 한다.
           logger.debug("transactionConfig 문자형식 : " + transactionConfig);
          
           ObjectMapper mapper = new ObjectMapper();
           Map<String, Object> subscribeMap = new HashMap<String, Object>();
          
           try {
                // convert JSON string to Map
           // 문자 형식 데이터를 Map 형식으로 변경하였다.
                   subscribeMap = mapper.readValue(transactionConfig, Map.class);
                   logger.debug("subscribeMap : " + subscribeMap);
                   logger.debug("keys : " + subscribeMap.get("keys"));
                   
 Map<String, Object> mapKeys = (Map<String, Object>) subscribeMap.get("keys");
                  
                   logger.debug("mapKeys===> : " + mapKeys);
                   //화면에서 구독 알림 허용 요청시 파라미터를 UserSubscriInfo
              // 엔티티 객체에 담는다. 엔티티가 db에서 테이블이라고 생각하면 된다.
                   UserSubscriInfo userSubscriInfo = new UserSubscriInfo();
                   userSubscriInfo.setAuthor(mapKeys.get("auth").toString());

                   userSubscriInfo.setP256dh(mapKeys.get("p256dh").toString());          
                   userSubscriInfo.setEndpoint(subscribeMap.get("endpoint").toString());
                   // userSubscriInfo.setExpirationTime(subscribeMap.get("expirationTime").toString());
                   userSubscriInfo.setUseYn("Y");
                  //객체에 담은후에 jpa에서 제공해주는 save함수 호출하여 db에 정보를 저장한다.
                   userSuvscriInfoRepository.save(userSubscriInfo);
                  
                   mav.addObject("ResultCode", "SUCCESS");
                   mav.addObject("ErrorMsg", "");
                  
           } catch (IOException e) {
                   e.printStackTrace();
                   mav.addObject("ResultCode", "ERROR");
                   mav.addObject("ErrorMsg", "에러발생");
           } catch ( Exception e ) {
                  mav.addObject("ResultCode", "ERROR");
                  mav.addObject("ErrorMsg", "에러발생");
           }        
                return mav;
        }
}
  • 알림허용(구독) 을 만들었다.
  • 알림해제(구독취소)을 구현하자.
 /**
         * 알림해제
         * @return ModelAndView
         * @exception Exception
         */
        @RequestMapping({"/push/unsubscribe.do"})
        public ModelAndView unsubscribe(HttpServletRequest request,
        HttpServletResponse response, @RequestBody String transactionConfig) throws
                     GeneralSecurityException, InterruptedException, JoseException,
                     ExecutionException, IOException {
                  
           logger.debug("/push/unsubscribe.do 호출");
                                
           ModelAndView mav = new ModelAndView("jsonView");
          
           logger.debug("transactionConfig 문자형식 : " + transactionConfig);
          
           ObjectMapper mapper = new ObjectMapper();
           Map<String, Object> subscribeMap = new HashMap<String, Object>();
          
           try {
                // convert JSON string to Map
           // 문자를 Map 형식으로 변환한다.
                   subscribeMap = mapper.readValue(transactionConfig, Map.class);
                   logger.debug("subscribeMap : " + subscribeMap);
                   logger.debug("keys : " + subscribeMap.get("keys"));
                  
  Map<String, Object> mapKeys = (Map<String, Object>) subscribeMap.get("keys");
                  
                   logger.debug("mapKeys===> : " + mapKeys);
        //구독취소 요청이 오면 db에 저장된 구독 정보를 삭제한다.
           userSuvscriInfoRepository.deleteByP256dh(mapKeys.get("p256dh").toString());
                  
                   mav.addObject("ResultCode", "SUCCESS");
                   mav.addObject("ErrorMsg", "");
                  
           } catch (IOException e) {
                   e.printStackTrace();
                   mav.addObject("ResultCode", "ERROR");
                   mav.addObject("ErrorMsg", "에러발생");
           } catch ( Exception e ) {
                  mav.addObject("ResultCode", "ERROR");
                  mav.addObject("ErrorMsg", "에러발생");
           }        
                return mav;
        }
  • 구독, 구독취소 기능이 구현 되었다.
  • 알림기능을 구현하자.
/**
         * 알림전송
         * @return ModelAndView
         * @exception Exception
         */
        @RequestMapping({"/push/sendMessage.do"})
        public ModelAndView sendMessage(HttpServletRequest request,
         HttpServletResponse response, @RequestBody String transactionConfig) throws  
         GeneralSecurityException, InterruptedException, JoseException,
         ExecutionException, IOException {
                  
           logger.debug("/push/sendMessage.do 호출");
                                
           ModelAndView mav = new ModelAndView("jsonView");
          
           logger.debug("transactionConfig 문자형식 : " + transactionConfig);
          
           ObjectMapper mapper = new ObjectMapper();
           Map<String, Object> messageMap = new HashMap<String, Object>();
          
           try {
                // convert JSON string to Map
           // 알림메세지를 읽어서 map형식으로 변환한다.
                   messageMap = mapper.readValue(transactionConfig, Map.class);
                   logger.debug("messageMap : " + messageMap);
  //구독요청한 정보를 list로 읽어서 push알림을 전송한다.        
  List<UserSubscriInfo> userSubscriInfo = userSuvscriInfoRepository.findAll();
                    
                   pwaPushService.sendMessage(messageMap,userSubscriInfo);
                  
                   mav.addObject("ResultCode", "SUCCESS");
                   mav.addObject("ErrorMsg", "");
                  
           } catch (IOException e) {
                   e.printStackTrace();
                   mav.addObject("ResultCode", "ERROR");
                   mav.addObject("ErrorMsg", "에러발생");
           } catch ( Exception e ) {
                  mav.addObject("ResultCode", "ERROR");
                  mav.addObject("ErrorMsg", "에러발생");
           }        
                return mav;
        }

push 와 관련된 controller쪽 구현은 끝났다.

push 알림을 하기 위해서는 서버와 클라이언트 간에 암호화 키가 있어야 한다. 지금 구현한것은 서버쪽이고 브라우저에서 호출하는 클라이언트도 구현을 하여야 한다.

암호화 키 생성 로직도 만들자.

        

  /**
         * 암호화 키생성
         * @return ModelAndView
         * @exception Exception
         */
        @RequestMapping({"/push/keyGenerater.do"})
        public void keyGenerater(HttpServletRequest request,
                              HttpServletResponse response) {
                  
           logger.debug("/push/keyGenerater.do 호출");
                    
           GenerateKeyCommand generateKeyCommand = new GenerateKeyCommand();
              
                try {
             //암호화 키를 생성하여 console창에 public키와 private키를 출력한다.
                        new GenerateKeyHandler(generateKeyCommand).run();
                } catch (InvalidAlgorithmParameterException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (NoSuchAlgorithmException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (NoSuchProviderException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }

암호화 키 생성 로직을 구현하였다.

이 암호화 키는 pwa.properties 파일에 설정을 하면 된다.

728x90
반응형

댓글



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

loading