본문 바로가기

JAVA

통합 구현 (JSON을 이용한 파싱) 21. 03. 03.

* KAKAO의 API를 이용해 데이터를 읽어와 JSON Parser를 이용해 파싱한다.<br>
* 연계주기를 이용해 시간 간격을 두고 데이터를 읽는다.<br>
* 인증키는 developers.kakao.com에서 부여 받아 사용한다.<br>
* 외부라이브러리 JSONObject클래스는 maven repository에서 탐색해서 적용한다. <br>
*
평가항목<br>
1.1 외부 및 내부 모듈 간의 데이터 연계 요구사항대로 출력되었는가. 미흡하면 부분별 –1점<br>
1.2 연계한 데이터에서 이름, 주소, 위도, 경도를 맞게 사용하는지 항목별 1점.<br>
1.3 외부 및 내부 모듈 간의 연계를 위한 유틸리티함수를 이용, 데이터 표준대로 출력되었는가. 미흡하면 부분별 –1점<br>
2.1 연계 데이터가 요청이 적절한 get 파라미터 데이터로 송수신이 되었는가. 미흡하면 부분별 –1점<br>
2.2 개발하고자 하는 응용소프트웨어와 연계 대상 모듈 간의 데이터 연계 요구사항을 고려하여 연계주기를 정의 한 코딩이 있는가. 미흡하면 부분별 –1점<br>
2.3 개발하고자하는 응용소프트웨어와 연계 대상 내외부 모듈 간의 연계 목적을 고려하여 데이터 연계 실패 시 처리방안을 코딩에 추가하였는가. 미흡하면 부분별 –1점<br>
2.4 응용소프트웨어와 관련된 내외부 모듈 간의 연계 데이터의 중요성을 고려하여 송수신 시 보안 인증키를 발급받고 사용 하였는가. 미흡하면 부분별 –1점<br>
3.1 애플리케이션에 필요한 JSON출력 라이브러리를 적용하였는가. 미흡하면 부분별 –1점<br>
3.2 애플리케이션 구현을 위해 선택한 라이브러리를 Java 언어 특성에 맞게 구성되었는가. 미흡하면 부분별 –1점<br>
3.3 선택한 라이브러리를 사용하여 애플리케이션 구현되었는가. 미흡하면 부분별 –1점<br>
3.4 KAKAO 개발자 센터에서 제공하는 테스트페이지결과와 구현된 애플리케이션 결과가 같은지 테스트를 수행한다. 미흡하면 부분별 –1점<br>

 

package scenario.juso;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONObject;


public class KakaoApi2 {
	private static final String MAIN_API = "https://dapi.kakao.com/v2/local/search/keyword.json"; // 키워드를 통해 주소받기 URL
																									// API 요청 메인 주소
	private static final String SERVICE_KEY = "7097eb2e299d693c29ebee8a50df2245"; // API 사용 서비스 키

	private static final String[] MENUS = { "이름", "주소", "위도", "경도" }; // 출력시 사용될 범례
	private static final int[] COUNT_MENU = { 20, 40, 40, 40 }; // 출력시 사용될 범례의 길이

	private static final int RANDOM_PAGE = (int) (Math.random() * 5 + 1); // 페이지번호 랜덤 생성

	public static void main(String[] args) {
		for(int j = 0 ; j < 3 ; j++) {
			String url = buildRequestUrl(MAIN_API, RANDOM_PAGE + j, 3, "천안 편의점");
			System.out.println(url);
			KakaoApi2 api = new KakaoApi2();
			JSONObject obj = api.restCall(url);
			System.out.println(obj);
			
			JSONArray arr = obj.getJSONArray("documents");
			System.out.println("김보경 :: " + new SimpleDateFormat("yyyy-MM-dd kk:mm:ss").format(new Date()));
			System.out.println(CommonUtils.format(MENUS, COUNT_MENU));
			for(int i = 0 ; i < arr.length(); i++) {
				JSONObject o = arr.getJSONObject(i);
				String[] strings = {
					o.getString("place_name"),
					o.getString("road_address_name"),
					o.getString("x"),
					o.getString("y"),
				};
				System.out.println(CommonUtils.format(strings, COUNT_MENU));
			}
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	/**
	 * 
	 * 요청 주소 문자열 생성
	 * 
	 * @param api
	 * @param page
	 * @param size
	 * @param query
	 * @return
	 */
	private static String buildRequestUrl(String api, int page, int size, String query) {
		String param = null;
		try {
			param = "?page=" + page + "&size=" + size + "&query=" + URLEncoder.encode(query, "utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return api + param;
	}

	/**
	 * REST API 호출
	 * 
	 * @param paramUrl
	 * 
	 */
	private JSONObject restCall(String paramUrl) {
		StringBuilder sb = new StringBuilder();
		try {
			URL url = new URL(paramUrl);
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			String auth = "KakaoAK " + SERVICE_KEY;
			conn.setRequestProperty("Authorization", auth);

			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

			String line = null;
			while ((line = br.readLine()) != null) {
				sb.append(line);
			}
		} catch (IOException e) {
			System.out.println("RestCall Fail : " + e.getMessage());
		}
		return new JSONObject(sb.toString());
	}
}

{ } : 오브젝트 타입

[ ] : 배열 타입

 

- 도로명주소 API

public class Juso {
	public static final String[] MENUS = { "우편번호", "건물이름", "도로명주소", "지번주소" };
	public static final int[] COUNT_MENU = { 20, 40, 40, 40 };

	public static void main(String[] args) {
		/*
		 * 5번(본인 번호)
		 * 
		 * */
		for(int k = 0 ; k < 3 ; k++) {
		
			String currentPage = 5 + k +""; // 학번 학번+1 학번+2 (5초간격)
			String countPerPage = "5";
			String resultType = "json";
			String confmKey = "devU01TX0FVVEgyMDIxMDIxNTE2NTkxMDExMDgwODI=";
			String keyword = "대학교";
			
			try {			
				String apiUrl = "https://www.juso.go.kr/addrlink/addrLinkApi.do?currentPage="+currentPage
						+"&countPerPage="+countPerPage+"&keyword="+URLEncoder.encode(keyword,"UTF-8")
						+"&confmKey="+confmKey+"&resultType="+resultType;
				URL url = new URL(apiUrl);
				BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
				StringBuffer sb = new StringBuffer();
				String tempStr = null;
				while(true){ 
					tempStr = br.readLine();
					if(tempStr == null) break;
					sb.append(tempStr);	
				}
				br.close();
				JSONObject jsonObject = new JSONObject(sb.toString());
				JSONArray array = jsonObject.getJSONObject("results").getJSONArray("juso");
				
				// 키와 값을 묶어서 하나의 데이터로 저장.
				List<Map<String, String>> list = new ArrayList<>();
				for(int i = 0 ; i < array.length() ; i++) {
	//				System.out.println(array.getJSONObject(i));
					JSONObject obj = array.getJSONObject(i);
//					obj.getString("bdNm");
					Map<String, String> map = new HashMap<>();
					map.put("bdNm", obj.getString("bdNm"));
					map.put("jibunAddr", obj.getString("jibunAddr"));
					map.put("zipNo", obj.getString("zipNo"));
					map.put("roadAddr", obj.getString("roadAddr"));
					list.add(map);
				}
				System.out.println("김보경 :: " + new SimpleDateFormat("yyyy-MM-dd kk:mm:ss").format(new Date()));
				System.out.println(CommonUtils.getFormat(MENUS, COUNT_MENU));
				for(int i = 0 ; i < list.size() ; i++) {
					String[] strings = new String[]{
						list.get(i).get("zipNo"), 
						list.get(i).get("bdNm"),
						list.get(i).get("jibunAddr"),
						list.get(i).get("roadAddr"),
					};
					System.out.println(CommonUtils.getFormat(strings, COUNT_MENU));
				}
				Thread.sleep(5000);
				
			} catch (IOException e) {
				e.printStackTrace();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}