전체 방문자
오늘
어제
이대코
ServerNeverDown
이대코
  • 분류 전체보기 (110)
    • Project (9)
      • GASIP_대학 커뮤니티 (5)
      • CATCHROOM_야놀자중고숙박거래 (2)
      • CANCER-FINE_암환자를 위한 정보 제공 사.. (2)
    • Development (46)
      • Python (9)
      • Java (8)
      • Kotlin (1)
      • Spring&Springboot (4)
      • BootCamp (10)
      • DevOps (1)
      • TrobleShooting (6)
      • Network (1)
      • DataBase (2)
      • OS (1)
      • Design Pattern (2)
    • Coding Test (52)
      • BOJ (1)
      • DFS,BFS (4)
      • 그리디 알고리즘 (6)
      • Dynamic Programming (2)
      • 이진 탐색 (0)
      • 초보자를 위한 파이썬 300제 (29)
      • 구현 (10)
    • Stock (3)
      • Market View (2)
      • Analysis of stocks (0)
      • Knowledge (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 글쓰기

인기 글

hELLO · Designed By 정상우.
이대코

ServerNeverDown

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

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

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

 

실행 결과는 아래와 같다.

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

 

감사합니다.

저작자표시 비영리 변경금지 (새창열림)

'Development > Java' 카테고리의 다른 글

자바는 왜 객체지향 언어인가요?  (4) 2025.03.15
객체지향 설계원칙 : SOLID 란?  (3) 2024.02.27
객체 지향 프로그래밍이란?? 객체 지향의 4가지 특징 Feat.캡상추다  (2) 2024.02.26
boolean 바인딩 에러.. boolean과 Boolean의 차이  (2) 2024.02.02
KakaoAPI를 활용해 책을 검색하는 JAVA 애플리케이션을 만들어보자  (2) 2023.08.31
    'Development/Java' 카테고리의 다른 글
    • 객체지향 설계원칙 : SOLID 란?
    • 객체 지향 프로그래밍이란?? 객체 지향의 4가지 특징 Feat.캡상추다
    • boolean 바인딩 에러.. boolean과 Boolean의 차이
    • KakaoAPI를 활용해 책을 검색하는 JAVA 애플리케이션을 만들어보자
    이대코
    이대코
    20대에 대장암 걸린 코틀린/자바 백엔드 개발자의 블로그입니다.

    티스토리툴바