반응형
Rest 기반 Open API Server 구현 (3부)
package poly.service;
import java.util.Map;
import poly.dto.AccStatDTO;
public interface IGetAccStatService {
//open API 서버로부터 전달받는 JSON 데이터
// 교통사고건수 가져오기
Map<String, Object> getAccStatForJSON(AccStatDTO pDTO) throws Exception;
//OPenAPI 서버로부터 전달받는 JSON 데이터
// 야간 교통사고건수 가져오기
Map<String, Object> getAccStatNightForJSON(AccStatDTO pDTO) throws Exception;
}
IService
package poly.service.impl;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import org.apache.log4j.Logger;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.springframework.stereotype.Service;
import poly.dto.AccStatDTO;
import poly.service.IGetAccStatService;
import poly.util.CmmUtil;
@Service("GetAccStatService")
public class GatAccStatService implements IGetAccStatService {
private Logger log = Logger.getLogger(this.getClass());
/*
* JSON 결과를 받아오기 위한 함수 URL을 파라미터로 전달하며느 자동으로 JSON 결과를 String 변수에 저장하고 결과 값을 반환
*/
private String getUrlForJSON(String callUrl) {
log.info(this.getClass().getName() + ".getUrlForJSON start !");
log.info("Requested URL :" + callUrl);
StringBuilder sb = new StringBuilder();
URLConnection urlConn = null;
InputStreamReader in = null;
//Json 결과값이 저장되는 변수
String json = "";
//SSL 적용된 사이트일 경우, 데이터 증명을 위해 사용
HostnameVerifier allHostsValid = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
try {
// 웹 사이트 접속을 위한 URL 피싱
URL url = new URL(callUrl);
//접속
urlConn = url.openConnection();
//접속하면 , 응답을 60초( 60 * 10000ms)동안 기다림
if (urlConn != null) {
urlConn.setReadTimeout(60 * 1000);
}
if(urlConn != null && urlConn.getInputStream() != null) {
in = new InputStreamReader(urlConn.getInputStream(), Charset.forName("UTF-8"));
BufferedReader bufferedReader = new BufferedReader(in);
//주어진 문자 입력 스트림 inputStream에 대해 기본 크기의 버퍼를 갖는 객체를 생성
if (bufferedReader != null) {
int cp;
while ((cp = bufferedReader.read()) != -1) {
sb.append((char) cp);
}
bufferedReader.close();
}
}
in.close();
} catch (Exception e) {
throw new RuntimeException("Exception URL : " + callUrl, e);
}
json = sb.toString(); // json 결과 저장
log.info("Json result : " + json);
log.info(this.getClass().getName() + ".getUrlForJSON End !");
return json;
}
// 교통사고 정보 가져오기 pDTO 교통사고 정보 가져오기 위한 파라미터들, jSOn결과를 Map 형태로 변환 결과
@Override
public Map<String, Object> getAccStatForJSON(AccStatDTO pDTO) throws Exception {
log.info(this.getClass().getName() + ".getAccStatForJSON start !");
//json 읽은 값을 controller에 전달하기 위한 결과 변수
Map<String, Object> rMap = new HashMap<String, Object>();
//JSON결과 받아오기
String json = getUrlForJSON(CmmUtil.nvl(pDTO.getUrl()));
//String 변수의 문자열을 json 형태의 데이터 구조로 변경하기 위한 객체를 메모리에 올림
JSONParser parser = new JSONParser();
//String 변수의 문자열을 json 형태의 데이터 구조로 변경하기 위해 자바 최상위 Object 변환
Object obj = parser.parse(json);
//변환된 Object 객체를 json 데이터 구조로 변경
JSONObject jsonObject = (JSONObject) obj;
//요청한 파라미터 가져오기
String reqYYYYMM = CmmUtil.nvl((String) jsonObject.get("reqYYYYMM"));
log.info("reqYYYYMM :" + reqYYYYMM);
rMap.put("reqYYYYMM", reqYYYYMM); //데이터 저장
//요청한 파라미터 가져오기
String reqAcode = CmmUtil.nvl((String) jsonObject.get("reqAcode"));
log.info("reqAcode : " + reqAcode);
rMap.put("reqAcode", reqAcode); //데이터 저장
//요청한 파라미터 가져오기
long recordCnt = (Long) jsonObject.get("recordCnt");
log.info("recordCnt :: " + recordCnt); //
rMap.put("recordCnt", recordCnt); //데이터 저장
//json에[ 저장된 배열형태 데이터
JSONArray resArr = (JSONArray) jsonObject.get("res");
//JSON 배열에 저장된 데이터를 List<AccStatDTO> 구조로 변경하기 위해 메모리에 올림
List<AccStatDTO> rList = new ArrayList<AccStatDTO>();
//각 레코드마다 DTO로 저장
AccStatDTO rDTO = null;
for (int i = 0; i < resArr.size(); i++) {
JSONObject result = (JSONObject) resArr.get(i);
rDTO = new AccStatDTO(); //데이터 저장을 위해 메모리 올림
//로그 출력
log.info("yyyymm :: " + CmmUtil.nvl((String)result.get("yyyymm")));
log.info("a_code :: " + CmmUtil.nvl((String)result.get("a_code")));
log.info("a_name :: " + CmmUtil.nvl((String)result.get("a_name")));
log.info("stat_a :: " + CmmUtil.nvl((String)result.get("stat_a")));
log.info("stat_b :: " + CmmUtil.nvl((String)result.get("stat_b")));
//json 데이터를 dto에 저장
rDTO.setYyyymm(CmmUtil.nvl((String)result.get("yyyymm")));
rDTO.setA_code(CmmUtil.nvl((String)result.get("a_code")));
rDTO.setA_name(CmmUtil.nvl((String)result.get("a_name")));
rDTO.setStat_a(CmmUtil.nvl((String)result.get("stat_a")));
rDTO.setStat_b(CmmUtil.nvl((String)result.get("stat_b")));
//저장된 DTO를 list에 저장
rList.add(rDTO);
}
//Controller에 저장할 데이터 저장
rMap.put("res", rList);
log.info(this.getClass().getName() + ".getAccStatForJSON end! ");
return rMap;
}
@Override
public Map<String, Object> getAccStatNightForJSON(AccStatDTO pDTO) throws Exception {
log.info(this.getClass().getName() + ".getAccStatNightForJSON start !");
//JSON 읽은 값을 Controller에 전달하기 위한 결과 변수
Map<String, Object> rMap = new HashMap<String, Object>();
//JSON 결과 받아오기
String json = getUrlForJSON(CmmUtil.nvl(pDTO.getUrl()));
// String 변수의 문자열을 json 형태의 데이터 구조로 변경하기 위한 객체를 메모리에 올림
JSONParser parser = new JSONParser();
// String 변수의 문자열을 json 형태의 데이터 구조로 변경하기 위해 자바 최상위 Object 변환
Object obj = parser.parse(json);
// 변환된 Object 객체를 json 데이터 구조로 변경
JSONObject jsonObject = (JSONObject) obj;
//요청한 파라미터 가져오기
String reqYYYYMM = CmmUtil.nvl((String) jsonObject.get("reqYYYYMM"));
log.info("reqYYYYMM :: " + reqYYYYMM);
rMap.put("reqYYYYMM", reqYYYYMM); //데이터 저장
//요청한 파라미터 가져오기
String reqAcode = CmmUtil.nvl((String) jsonObject.get("reqAcode"));
log.info("reqAcode :: " + reqAcode);
rMap.put("reqAcode", reqAcode); //데이터 저장
// 요청한 파라미터 가져오기
long recordCnt = (Long) jsonObject.get("recordCnt");
log.info("recordCnt :: " + recordCnt);
rMap.put("recordCnt", recordCnt); //데이터 저장
// json에 저장된 배열형태 데이터
JSONArray resArr = (JSONArray) jsonObject.get("res");
//JSON 배열에 저장된 List<AccStatDTO> 구조로 변경하기 위해 메모리에 올림
List<AccStatDTO> rList = new ArrayList<AccStatDTO>();
// 각 레코드마다 DTO로 저장
AccStatDTO rDTO = null;
for (int i = 0; i < resArr.size(); i++) {
JSONObject result = (JSONObject) resArr.get(i);
rDTO = new AccStatDTO(); //데이터 저장을 위해 메모리 올림
//로그 출력
log.info("yyyymm :: " + CmmUtil.nvl((String)result.get("yyyymm")));
log.info("a_code :: " + CmmUtil.nvl((String)result.get("a_code")));
log.info("a_name :: " + CmmUtil.nvl((String)result.get("a_name")));
log.info("stat_a :: " + CmmUtil.nvl((String)result.get("stat_a")));
log.info("stat_b :: " + CmmUtil.nvl((String)result.get("stat_b")));
//json 데이터를 dto에 저장
rDTO.setYyyymm(CmmUtil.nvl((String)result.get("yyyymm")));
rDTO.setA_code(CmmUtil.nvl((String)result.get("a_code")));
rDTO.setA_name(CmmUtil.nvl((String)result.get("a_name")));
rDTO.setStat_a(CmmUtil.nvl((String)result.get("stat_a")));
rDTO.setStat_b(CmmUtil.nvl((String)result.get("stat_b")));
//저장된 DTO를 list에 저장
rList.add(rDTO);
}
//Controller에 저장할 데이터 저장
rMap.put("res", rList);
log.info(this.getClass().getName() + ".getAccStatNightForJSON end !");
return rMap;
}
}
Service
package poly.controller;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import poly.dto.AccStatDTO;
import poly.service.IGetAccStatService;
import poly.util.CmmUtil;
@Controller("GetAccStatController")
public class GetAccStatController {
private Logger log = Logger.getLogger(this.getClass());
@Resource(name = "GetAccStatService")
private IGetAccStatService getAccStatService;
//JSON 결과를 받아오기 위한 함수
@RequestMapping(value = "AccStat/getAccStatForJSON")
public String getAccStatForJSON(HttpServletRequest request, HttpServletResponse response, ModelMap model)
throws Exception {
log.info(this.getClass().getName() + ".getAccStatForJSON start !");
//OpenAPI url
String url = "http://localhost:9010/accStat/getAccStatInfo.do?1=1";
//OpenAPI용 파라미터 받아오기
String yyyymm = CmmUtil.nvl(request.getParameter("yyyymm")); //사고 년월
String a_code = CmmUtil.nvl(request.getParameter("a_code")); // 사고 구분
//yyyymm에 값이 있다면
if(yyyymm.length() > 0) {
url += "&yyyymm=" + yyyymm;
}
// a_code에 값이 있다면
if(a_code.length() > 0) {
url += "&a_code=" + a_code;
}
log.info("url : " + url);
//OpenAPI 호출을 위한 파라미터 저장하기
AccStatDTO pDTO = new AccStatDTO();
pDTO.setUrl(url);
// JSON으로부터 받은 결과를 자바에서 처리가능한 데이터 구조로 변경
Map<String, Object> rMap = getAccStatService.getAccStatForJSON(pDTO);
//JSON으로부터 받은 결과를 자바에서 처리 가능한 데이터 구조로 변경한 변수를 JSP에 전달
model.addAttribute("rMap", rMap);
log.info(this.getClass().getName() + ".getAccStatForJSON end !");
return "/AccStat/getAccStatForJSON";
}
//JSON 결과를 받아오기 위한 함수
@RequestMapping(value = "AccStat/getAccStatNightForJSON")
@ResponseBody
public Map<String, Object> getAccStatNightForJSON(HttpServletRequest request, HttpServletResponse response)
throws Exception {
log.info(this.getClass().getName() + ".getAccStatNightForJSON start !");
// OpenAPI url
String url = "http://localhost:9010/accStat/getAccStatInfo.do?1=1";
// OpenAPI용 파라미터 받아오기
String yyyymm = CmmUtil.nvl(request.getParameter("yyyymm")); //사고 년월
String a_code = CmmUtil.nvl(request.getParameter("a_code")); // 사고 구분
//yyyymm에 값이 있다면
if(yyyymm.length() > 0) {
url += "&yyyymm=" + yyyymm;
}
// a_code에 값이 있다면
if(a_code.length() > 0) {
url += "&a_code=" + a_code;
}
log.info("url : " + url);
//OpenAPI 호출을 위한 파라미터 저장하기
AccStatDTO pDTO = new AccStatDTO();
pDTO.setUrl(url);
//JSON으로부터 받은 결과를 자바에서 처리가능한 데이터 구조로 변경
Map<String, Object> rMap = getAccStatService.getAccStatNightForJSON(pDTO);
if(rMap == null) {
rMap = new HashMap<String, Object>();
}
log.info(this.getClass().getName() + ".getAccStatNightForJSON end!");
return rMap;
}
@RequestMapping(value = "AccStat/accStatForAjax")
public String accStatForAjax(HttpServletRequest request, HttpServletResponse response, ModelMap model)
throws Exception {
log.info(this.getClass().getName() + ".accStatForAjax start !");
log.info(this.getClass().getName() + ".accStatForAjax end !");
return "/AccStat/accStatForAjax";
}
}
Controller
jQuery를 추가해 줍니다.
위 사이트에 접속하고 다운로드 합니다.
다운로드를 눌러 들어가 줍니다.
원하는 버전을 찾고 다운로드 링크를 우클릭해서 다른 이름으로 저장으로 다운을 합니다.
이런 파일이 생성되는 것을 볼 수 있습니다.
다운 받은 쿼리 파일을 WEB-INF 폴더 아래 js 폴더 안에 넣어줍니다.
드래그해서 끌어 넣으면 들어가 집니다.
확인까지 합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>OpenAPI 호출하기</title>
<script type="text/javascript" src = "/js/jquery-3.6.0.min.js"></script>
<script type = "text/javascript">
$(document).ready(function() {
$("#execute").click(function(){
$.ajax({
url : '/AccStat/getAccStatNightForJSON.do',
type : 'post',
dataType: "JSON",
data : $("form").serialize(),
success : function(json){
$('#display_json').text(json);
$('#display_reqYYYYMM').text(json.reqYYYYMM);
$('#display_reqAcode').text(json.reqAcode);
$('#display_recordCnt').text(json.recordCnt);
var resHTML = "";
var resObj = json.res;
for(var i= 0; i < resObj.length; i++){
resHTML += ("{yyyymm:" + json.res[i].yyyymm+ ",");
resHTML += ("a_code:" + json.res[i].a_code+ ",");
resHTML += ("a_name:" + json.res[i].a_name+ ",");
resHTML += ("stat_a:" + json.res[i].stat_a+ "}");
}
$('#display_res').text(resHTML);
}
})
})
});
</script>
</head>
<body>
OpenAPI 호출하기
<hr />
<br />
<form name ="form" method ="post">
교통사고년월 : <input type = "text" name= "yyyymm" maxlength = "6" /> <br />
교통사고구분:
<select name = "a_code">
<option value ="">전체</option>
<option value ="A">사고건수</option>
<option value ="B">사망자수</option>
<option value ="C">부상자수</option>
</select> <br /> <br />
<input type = "button" id= "execute" value = "RestAPI 호출은 WAS를 통해!!" />
</form>
<br/><br/>
<hr/>
JSON :<span id ="display_json" style ="width : 300px"></span><br/>
reqYYYYMM :<span id ="display_reqYYYYMM" style ="width : 300px"></span><br/>
reqAcode :<span id ="display_reqAcode" style ="width : 300px"></span><br/>
recordCnt :<span id ="display_recordCnt" style ="width : 300px"></span><br/>
res :<span id ="display_res" style ="width : 100%"></span><br/>
</body>
</html>
JSP
페이지에 들어가서 호출을 눌러봅니다.
데이터가 전부 다 잘 나오는 것을 볼 수 있습니다.
원하는 날짜를 불러와도 정상적으로 불러와 집니다.
반응형
'Framework & Library > Spring Framework' 카테고리의 다른 글
[Spring Framework] : 웹 크롤링 후 자연어 처리 (0) | 2021.11.20 |
---|---|
[Spring Framework] : 자연어처리 (1) | 2021.11.20 |
[Spring Framework] : Rest 기반 Open API Server 구현 (2부) (0) | 2021.11.03 |
[Spring Framework] : Rest 기반 Open API Server 구현 (1부) (0) | 2021.11.03 |
[Spring Framework] : 오피니언 마이닝, Opinion Mining (긍정 및 부정 분석) (0) | 2021.10.29 |
댓글