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

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

by 오주현 2021. 11. 3.
반응형
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를 추가해 줍니다.

jQuery

 

jQuery

What is jQuery? jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers.

jquery.com

위 사이트에 접속하고 다운로드 합니다.

다운로드를 눌러 들어가 줍니다.

 

 

원하는 버전을 찾고 다운로드 링크를 우클릭해서 다른 이름으로 저장으로 다운을 합니다.

 

이런 파일이 생성되는 것을 볼 수 있습니다.

 

다운 받은 쿼리 파일을 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


페이지에 들어가서 호출을 눌러봅니다.

 

데이터가 전부 다 잘 나오는 것을 볼 수 있습니다.

 

원하는 날짜를 불러와도 정상적으로 불러와 집니다.

반응형

댓글