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
반응형
'프로그램 > 스프링' 카테고리의 다른 글
[PWA] 자바로 pwa push 알림 기능 개발하기(12) (0) | 2021.08.03 |
---|---|
[PWA] 자바로 pwa push 알림 기능 개발하기(11) (0) | 2021.08.03 |
[PWA] 자바로 pwa push 알림 기능 개발하기(9) (0) | 2021.08.03 |
[PWA] 자바로 pwa push 알림 기능 개발하기(8) (0) | 2021.08.03 |
[PWA] 자바로 pwa push 알림 기능 개발하기(7) (0) | 2021.08.03 |
댓글