* 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();
}
}
}
}
'JAVA' 카테고리의 다른 글
java.util.function 패키지 21. 05. 06. (0) | 2021.05.07 |
---|---|
14장 람다와 스트림 21. 04. 30. (0) | 2021.05.05 |
07장- 객체지향 프로그래밍Ⅱ(6. 추상클래스, 7. 인터페이스) 21. 02. 24. (0) | 2021.02.24 |
09장- java.lang패키지와 유용한 클래스 21. 02. 21. (0) | 2021.02.21 |
05장- 배열 21. 02. 20. (0) | 2021.02.20 |