Development/Java

KakaoAPI를 활용해 위치기반 장소 검색 Java 애플리케이션을 개발해보자

Klay_J 2023. 9. 4. 20:10

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();
        }
    }
}

 

실행 결과는 아래와 같다.

키워드를 입력하지 않거나 막 입력하면 예외발생하는데, 이건 추후 손 좀 봐야겠다.

 

감사합니다.