반응형
SpringPRJ2.0
<!-- JSON 형태의 데이터 생성 및 내용 읽기를 위한 라이브러리 다운로드 -->
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<!-- RequestBody 사용시, JSON 변환이 안되는 경우 추가함 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
pom.xml에 라이브러리를 추가해 줍니다.
package poly.dto;
public class AccStatDTO {
//json 결과를 받기 위한 호출하는 URL
private String url;
//json 결과에 정의된 항목들 시작
private String reqYYYYMM;
private String reqAcode;
private String recordCnt;
private String yyyymm;
private String a_code;
private String a_name;
private String stat_a;
private String stat_b;
private String reg_id;
private String reg_dt;
private String chg_id;
private String chg_dt;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getReqYYYYMM() {
return reqYYYYMM;
}
public void setReqYYYYMM(String reqYYYYMM) {
this.reqYYYYMM = reqYYYYMM;
}
public String getReqAcode() {
return reqAcode;
}
public void setReqAcode(String reqAcode) {
this.reqAcode = reqAcode;
}
public String getRecordCnt() {
return recordCnt;
}
public void setRecordCnt(String recordCnt) {
this.recordCnt = recordCnt;
}
public String getYyyymm() {
return yyyymm;
}
public void setYyyymm(String yyyymm) {
this.yyyymm = yyyymm;
}
public String getA_code() {
return a_code;
}
public void setA_code(String a_code) {
this.a_code = a_code;
}
public String getA_name() {
return a_name;
}
public void setA_name(String a_name) {
this.a_name = a_name;
}
public String getStat_a() {
return stat_a;
}
public void setStat_a(String stat_a) {
this.stat_a = stat_a;
}
public String getStat_b() {
return stat_b;
}
public void setStat_b(String stat_b) {
this.stat_b = stat_b;
}
public String getReg_id() {
return reg_id;
}
public void setReg_id(String reg_id) {
this.reg_id = reg_id;
}
public String getReg_dt() {
return reg_dt;
}
public void setReg_dt(String reg_dt) {
this.reg_dt = reg_dt;
}
public String getChg_id() {
return chg_id;
}
public void setChg_id(String chg_id) {
this.chg_id = chg_id;
}
public String getChg_dt() {
return chg_dt;
}
public void setChg_dt(String chg_dt) {
this.chg_dt = chg_dt;
}
}
DTO
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;
}
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;
}
}
Service
package poly.controller;
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 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() > 9) {
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";
}
}
Controller
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import = "poly.util.CmmUtil" %>
<%@page import = "poly.dto.AccStatDTO" %>
<%@page import = "java.util.Map" %>
<%@page import = "java.util.List" %>
<%@page import = "java.util.ArrayList" %>
<%@page import = "java.util.HashMap" %>
<%@page import = "java.util.Iterator" %>
<%
//Controller로부터 전달받은 데이터
Map<String, Object> rMap = (Map<String, Object>)request.getAttribute("rMap");
if(rMap == null) {
rMap = new HashMap<String, Object>();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>OpenAPI 호출 결과</title>
</head>
<body>
<hr/><br/>
요청 파라미터(reqYYYYMM) : <%=CmmUtil.nvl((String)rMap.get("reqYYYYMM")) %> <br/>
요청 파라미터(reqAcode) : <%=CmmUtil.nvl((String)rMap.get("reqAcode")) %> <br/><br/>
<hr/><br/>
요청 결과<br/>
출력 레코드 수 : <%=(Long)rMap.get("recordCnt") %> <br/><br/>
출력 결과<br/><br/>
<%
//배열로 저장된 결과 레코드들
List<AccStatDTO>rList = (List<AccStatDTO>)rMap.get("res");
Iterator<AccStatDTO> it = rList.iterator();
while(it.hasNext()) {
AccStatDTO rDTO = (AccStatDTO)it.next();
out.println("yyyymm : " + CmmUtil.nvl(rDTO.getYyyymm()) + "<br/>");
out.println("a_code : " + CmmUtil.nvl(rDTO.getA_code()) + "<br/>");
out.println("a_name : " + CmmUtil.nvl(rDTO.getA_name()) + "<br/>");
out.println("stat_a : " + CmmUtil.nvl(rDTO.getStat_a()) + "<br/>");
out.println("stat_b : " + CmmUtil.nvl(rDTO.getStat_b()) + "<br/>");
out.println("-------------------------------------<br/>");
}
%>
</body>
</html>
jsp
페이지를 실행시켜 보면 데이터를 잘 가져온 것을 볼 수 있습니다.
url에 값을 넣어줘서 페이지를 로딩해 보면 원하는 값만 가져올 수 있습니다.
반응형
'Framework & Library > Spring Framework' 카테고리의 다른 글
[Spring Framework] : 자연어처리 (1) | 2021.11.20 |
---|---|
[Spring Framework] : Rest 기반 Open API Server 구현 (3부) (0) | 2021.11.03 |
[Spring Framework] : Rest 기반 Open API Server 구현 (1부) (0) | 2021.11.03 |
[Spring Framework] : 오피니언 마이닝, Opinion Mining (긍정 및 부정 분석) (0) | 2021.10.29 |
[Spring Framework] : 딥러닝 (이미지 인식) (0) | 2021.10.27 |
댓글