Java만 이용하여 간단한 애플리케이션을 만들어보고자 한다.
과제 내용은 아래와 같다.
이 Java 어플리케이션은 입력에 기반하여 특정 위치 내의 장소를 검색 가능.
자신의 위치를 기반으로 특정위치에 있는 장소를 검색하여 출력
Kakao 로컬 REST API중 키워드로 장소 검색하기, 카테고리로 장소 검색하기 API를 활용할 것
작업 옵션
단계 1: 카카오 API 키 획득
아래 포스팅을 참고할 것.
KakaoAPI를 활용해 책을 검색하는 JAVA 애플리케이션을 만들어보자
과제를 받았다. (으어어ㅓㅓㅇ어어ㅓ) 일단 https://developers.kakao.com/ 여기서 "내 애플리케이션"에서 app을 생성한 뒤, API KEY를 받아두었다. Kakao Developers 카카오 API를 활용하여 다양한 어플리케이션
hyem5019.tistory.com
단계 2: 로컬 REST API 사용
단계 3: Java 어플리케이션 구현
예시 입력 및 출력
입력 화면
위치 키워드를 입력하세요:
검색 반경을 입력하세요(1000:1km):
출력 화면
입력한 위치 키워드:
검색 반경:
**주유소 검색 결과**
- 장소 URL(지도 위치):
- 상호명:
- 주소:
- 전화번호:
- 거리(km):
**약국 검색 결과**
- 장소 URL(지도 위치):
- 상호명:
- 주소:
- 전화번호:
- 거리(km):
프로그램 종료
이 애플리케이션의 대략적인 흐름은 아래와 같다.
1. 키워드를 입력하여 KaKaoAPI에서 해당 키워드가 가리키는 좌표를 현재 내 위치로 설정한다.
2. 내 위치를 기반으로 반경 내 가장 가까운 약국 정보를 출력한다.
public class KakaoApi {
private static final String API_KEY = "ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ";
private static final String KEYWORD_URL = "https://dapi.kakao.com/v2/local/search/keyword";
private static final String CATEGORY_URL = "https://dapi.kakao.com/v2/local/search/category";
private double x;
private double y;
private int radius;
public void setRadius(int radius) {
this.radius = radius;
}
public int getRadius() {
return radius;
}
// 키워드 검색 메서드
public JSONObject keywordSearch(String keyword) throws UnsupportedEncodingException {
String url = KEYWORD_URL + "?query=" + URLEncoder.encode(keyword, "UTF-8"); // 이게 있어야 url keyword에서 띄어쓰기까지 인식 가능
JSONObject json = getJson(url); // json = {documents : [{객체A},{객체B}....] , meta : [배열2]}
JSONArray documents = json.getJSONArray("documents"); // documents = [{객체A},{객체B}....] // documents 키값에 대응하는 value.
JSONObject mylocation = documents.getJSONObject(0); //base = {객체A}
this.x = Double.parseDouble(String.valueOf(mylocation.get("x")));
this.y = Double.parseDouble(String.valueOf(mylocation.get("y")));
return mylocation; // 키워드 검색 결과 중 가장 앞에 있는 객체 선택
}
public void categorySearch() throws JSONException {
String url = CATEGORY_URL + "?x=" + x + "&y=" + y + "&category_group_code="
+"PM9" + "&radius=" + radius;
JSONObject json = getJson(url);
JSONArray documents = json.getJSONArray("documents");
printResult(documents);
}
// REST API 이용 메서드
private JSONObject getJson(String apiUrl) { //requestURL 설정 후 Kakao-API의 response 값 인 json 을 받아오는 메서드
String json = "";
try {
HttpClient client = HttpClientBuilder.create().build();
HttpGet getRequest = new HttpGet(apiUrl); //Get 메소드 URL 생성
getRequest.addHeader("Authorization","KakaoAK "+KakaoApi.API_KEY); //API KEY 입력
HttpResponse getResponse = client.execute(getRequest); // 위에 보낸 request에 대한 response 내용(json)
BufferedReader br = new BufferedReader(new InputStreamReader(getResponse.getEntity().getContent(), "UTF-8"));
json = br.readLine();
} catch (Exception e) {
e.printStackTrace();
}
return new JSONObject(json);
}
// 검색 결과 출력 메서드
private void printResult(JSONArray arr) {
try {
JSONObject obj = arr.getJSONObject(0);
System.out.println("- 장소 URL(지도 위치): " + obj.get("place_url"));
System.out.println("- 상호명: " + obj.get("place_name"));
System.out.println("- 주소: " + obj.get("road_address_name"));
System.out.println("- 전화번호: " + obj.get("phone"));
System.out.println(
"- 거리(km): " + Double.parseDouble((String) obj.get("distance")) / 1000 + "km");
System.out.println("----------------------------------------------------");
System.out.println();
System.out.println("kakaomap URL(장소 URL) :" + obj.get("place_url"));
System.out.println("kakaomap URL(장소 URL) :exit");
System.out.println("프로그램 종료");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Main {
private static final KakaoApi kakaoApi = new KakaoApi();
private static final Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
try {
// mylocation을 키워드로 입력
System.out.print("키워드를 입력하세요: ");
String keyword = scanner.nextLine();
// mylocation 정보 가져오기
kakaoApi.keywordSearch(keyword);
// 검색 반경 입력
System.out.print("검색 반경을 입력하세요(1000:1km): ");
kakaoApi.setRadius(scanner.nextInt());
System.out.println("입력한 위치 키워드: " + keyword);
System.out.println("검색 반경: " + kakaoApi.getRadius() / 1000.0 + "km");
System.out.println();
// mylocation 기준 가까운 약국 검색(catergorySearch)
System.out.println("**약국 검색 결과**");
kakaoApi.categorySearch();
} catch (Exception e) {
e.printStackTrace();
}
}
}
실행 결과는 아래와 같다.
키워드를 입력하지 않거나 막 입력하면 예외발생하는데, 이건 추후 손 좀 봐야겠다.
감사합니다.
'Development > Java' 카테고리의 다른 글
객체지향 설계원칙 : SOLID 란? (3) | 2024.02.27 |
---|---|
객체 지향 프로그래밍이란?? 객체 지향의 4가지 특징 Feat.캡상추다 (2) | 2024.02.26 |
boolean 바인딩 에러.. boolean과 Boolean의 차이 (2) | 2024.02.02 |
KakaoAPI를 활용해 책을 검색하는 JAVA 애플리케이션을 만들어보자 (2) | 2023.08.31 |