본문 바로가기
Framework & Library/Spring Framework

[Spring Framework] : Rest 기반 Open API Server 구현 (2부)

by 오주현 2021. 11. 3.
반응형
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에 값을 넣어줘서 페이지를 로딩해 보면 원하는 값만 가져올 수 있습니다.

반응형

댓글