| 
					
				 | 
			
			
				@@ -37,7 +37,6 @@ import org.w3c.dom.Document; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.w3c.dom.Node; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.w3c.dom.NodeList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.icontrols.kakao.common.ERROR_INFO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.icontrols.kakao.common.KAKAO_RESULT; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.icontrols.kakao.common.KEY_INFO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.icontrols.kakao.common.SERVERINFO; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -78,16 +77,21 @@ public class KakaoEventHandler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			int result = CommonUtil.compareStringTypeTime(currentTime, tokenExpiresTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			boolean connFlag = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//			boolean connFlag = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 현재 시간이 토큰 만료시간보다 크다면 토큰이 만료 됐다는 뜻. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 카카오 이벤트 서버에서 토큰을 갱신 받은 뒤 이벤트를 전송해야 한다. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if(result < 1)  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				 connFlag = sendKakaoTokenRefresh(donghoInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(result < 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				donghoInfo = sendKakaoTokenRefresh(donghoInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(donghoInfo == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					retMap.put("result", KAKAO_RESULT.FAIL_INTERNAL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					retMap.put("message", "ID-["+donghoInfo.getId() + "]-Fail to Token Refresh"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return CompletableFuture.completedFuture(retMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if(!connFlag) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				retMap.put("result", KAKAO_RESULT.FAIL_INTERNAL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				retMap.put("message", "ID-["+donghoInfo.getId() + "]-Fail to Token Refresh"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return CompletableFuture.completedFuture(retMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				logger.info("prev donghoInfo : " + donghoInfo.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				params.put(KEY_INFO.HTTP_KEY_AUTHORIZATION, donghoInfo.getKakaoAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logger.info("["+donghoInfo.getKakaoAccessToken()+"] - 유효한 토큰"); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -112,25 +116,28 @@ public class KakaoEventHandler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			case KAKAO_RESULT.FAIL_EXPIREDTOKEN:  // 만료된 토큰, 토큰 재발급 뒤 재시도. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				// 재시도 할때는 따로 결과를 받지 않을려고.. 성공할때까지 계속 시도하는것도 비효율적. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				logger.info("["+donghoInfo.getKakaoAccessToken()+"]-인증토큰 만료 토큰 갱신 요청"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				connFlag = sendKakaoTokenRefresh(donghoInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				DonghoInfo tmpDonghoInfo = sendKakaoTokenRefresh(donghoInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				if(!connFlag) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(tmpDonghoInfo == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					retMap.put("result", KAKAO_RESULT.FAIL_INTERNAL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					retMap.put("message", "ID-["+donghoInfo.getId() + "]-Fail to Token Refresh Retry"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					retMap.put("message", "ID-["+tmpDonghoInfo.getId() + "]-Fail to Token Refresh Retry"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 					return CompletableFuture.completedFuture(retMap); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				logger.info("["+donghoInfo.getKakaoAccessToken()+"]-이벤트 재전송 시도"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				sendResult = sendStatusResult(donghoInfo, params); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				logger.info("["+tmpDonghoInfo.getKakaoAccessToken()+"]-이벤트 재전송 시도"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				params.put(KEY_INFO.HTTP_KEY_AUTHORIZATION, tmpDonghoInfo.getKakaoAccessToken()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				sendResult = sendStatusResult(tmpDonghoInfo, params); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				code = (int) sendResult.get("result"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				retMap.put("result", code); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				if(code != KAKAO_RESULT.SUCCESS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					retMap.put("message", "ID-["+donghoInfo.getId() + "]-이벤트 재전송 실패 - [" + sendResult.get("message") + "]"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					retMap.put("message", "ID-["+tmpDonghoInfo.getId() + "]-이벤트 재전송 실패 - [" + sendResult.get("message") + "]"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				}else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					retMap.put("message", "ID-["+donghoInfo.getId() + "]-이벤트 재전송 성공"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					retMap.put("message", "ID-["+tmpDonghoInfo.getId() + "]-이벤트 재전송 성공"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				break; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -145,6 +152,8 @@ public class KakaoEventHandler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			retMap.put("result", KAKAO_RESULT.FAIL_INTERNAL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			retMap.put("message", "ID-["+donghoInfo.getId() + "]-" + e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			logger.error("ERROR" + e.getStackTrace()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			e.printStackTrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return CompletableFuture.completedFuture(retMap); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -188,7 +197,7 @@ public class KakaoEventHandler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 제어기기 별로 상태 이벤트 구분하여 처리하도록 해야 한다 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			HttpEntity<Object> entity = new HttpEntity<Object>(params, headers); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			String url = SERVERINFO.isDev?SERVERINFO.SendDevEventURL + ":" + SERVERINFO.SendDevEventPort + "/events":SERVERINFO.SendKakaoEventURL+":"+SERVERINFO.SendKakaoEventPort+ "/events"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			String url = SERVERINFO.isDev?SERVERINFO.SendDevEventURL + ":" + SERVERINFO.SendDevEventPort + "/events":SERVERINFO.SendKakaoEventURL + ":" + SERVERINFO.SendKakaoEventPort + "/events"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logger.info("SendStatusResult URL : " + url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logger.info("SendStatusResult header : " + headers.toString()); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -233,7 +242,7 @@ public class KakaoEventHandler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 * @param ho 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 * @param params 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	public boolean sendKakaoTokenRefresh(DonghoInfo donghoInfo){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public DonghoInfo sendKakaoTokenRefresh(DonghoInfo donghoInfo){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		DonghoInfoRepository repo = (DonghoInfoRepository)BeanUtils.getBean("donghoInfoRepository"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		String refreshToken = donghoInfo.getKakaoRefreshToken(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -246,17 +255,19 @@ public class KakaoEventHandler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		headers.add("Authorization", "Basic " + encoding); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		MultiValueMap<String, String> parameters = new LinkedMultiValueMap<String, String>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		parameters.add("grant_type", "refresh_token"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		parameters.add("refresh_token", refreshToken); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(parameters, headers); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String url = SERVERINFO.isDev?SERVERINFO.SendDevEventURL + ":" + SERVERINFO.SendDevEventPort + "/events/token":SERVERINFO.SendKakaoEventURL+":"+SERVERINFO.SendKakaoEventPort+ "/events/token"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		String url = SERVERINFO.isDev?SERVERINFO.SendDevEventURL + ":" + SERVERINFO.SendDevEventPort + "/events/token":SERVERINFO.SendKakaoEventURL + ":" + SERVERINFO.SendKakaoEventPort +"/events/token"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//		String url = "https://kakaohome-api.i.kakao.com/events/token"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		logger.info("[TOKEN REFRESH REQUEST] URL : " + url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		logger.info("[TOKEN REFRESH REQUEST] header : " + headers.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		logger.info("[TOKEN REFRESH REQUEST] return value : " + entity.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logger.info("[TOKEN parameter] --" +parameters.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		URI uri = URI.create(url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		CloseableHttpClient httpClient = HttpClients.custom().setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -264,31 +275,42 @@ public class KakaoEventHandler { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		requestFactory.setHttpClient(httpClient); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		requestFactory.setConnectTimeout(3000); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		RestTemplate restTemplate = new RestTemplate(requestFactory); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		String answer = restTemplate.postForObject(url, entity, String.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		logger.debug("[TOKEN REFRESH REQUEST] = " + answer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Map<String, Object> retMap = CommonUtil.jsonToMap(answer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if(retMap.containsKey(KEY_INFO.HTTP_KEY_ACCESS_TOKEN) && retMap.containsKey(KEY_INFO.HTTP_KEY_REFRESH_TOKEN) && retMap.containsKey(KEY_INFO.HTTP_KEY_EXPIRES_IN)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			donghoInfo.setKakaoAccessToken((String)retMap.get(KEY_INFO.HTTP_KEY_ACCESS_TOKEN)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			donghoInfo.setKakaoRefreshToken((String)retMap.get(KEY_INFO.HTTP_KEY_REFRESH_TOKEN)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			donghoInfo.setKakaoExpiresTime(Integer.toString((int)retMap.get(KEY_INFO.HTTP_KEY_EXPIRES_IN))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			donghoInfo.setKakaoTokenCreateTime(CommonUtil.getStrTypeCurTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			donghoInfo.setKakaoTokenExpireTime(CommonUtil.getStrTypeCurTimeAfterSec(Integer.parseInt(donghoInfo.getKakaoExpiresTime()))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		String answer = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			RestTemplate restTemplate = new RestTemplate(requestFactory); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			answer = restTemplate.postForObject(url, entity, String.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			logger.info("[TOKEN REFRESH REQUEST] = " + answer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			repo.save(donghoInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Map<String, Object> retMap = CommonUtil.jsonToMap(answer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		}else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			logger.error("****************************************************"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			logger.error("토클 리프레시 실패"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			logger.error("****************************************************"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(retMap.containsKey(KEY_INFO.HTTP_KEY_ACCESS_TOKEN) && retMap.containsKey(KEY_INFO.HTTP_KEY_REFRESH_TOKEN) && retMap.containsKey(KEY_INFO.HTTP_KEY_EXPIRES_IN)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				donghoInfo.setKakaoAccessToken((String)retMap.get(KEY_INFO.HTTP_KEY_ACCESS_TOKEN)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				donghoInfo.setKakaoRefreshToken((String)retMap.get(KEY_INFO.HTTP_KEY_REFRESH_TOKEN)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				donghoInfo.setKakaoExpiresTime(Integer.toString((int)retMap.get(KEY_INFO.HTTP_KEY_EXPIRES_IN))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				donghoInfo.setKakaoTokenCreateTime(CommonUtil.getStrTypeCurTime()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				donghoInfo.setKakaoTokenExpireTime(CommonUtil.getStrTypeCurTimeAfterSec(Integer.parseInt(donghoInfo.getKakaoExpiresTime()))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				repo.save(donghoInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				logger.info("****************************************************"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				logger.info("토큰 리프레시 성공"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				logger.info(donghoInfo.toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				logger.info("****************************************************"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return donghoInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}catch(Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			logger.error("[TOKEN REFRESH REQUEST ERROR] - " + e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			e.printStackTrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logger.error("****************************************************"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logger.error("토클 리프레시 실패"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logger.error("****************************************************"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |