Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

뇌약간고침

D-19 카카오맵 REST API 주소 -> 코드 변경 관련 오류 (해결) 본문

Project/과정 기록

D-19 카카오맵 REST API 주소 -> 코드 변경 관련 오류 (해결)

minulbora 2024. 4. 24. 09:22
	public Map<String, String> getGeoCod(String add) {
		
        try {
        	log.info("getGeo Start");
        	log.info("Address:"+add);
        	
        	
        	String address = URLEncoder.encode(add, "UTF-8");
        	String url = GEOCODE_URL + address+"&key="+GEOCODE_USER_INFO;
        	URL Url = new URL(url);
        	
        	HttpURLConnection conn = (HttpURLConnection) Url.openConnection();
        	conn.setRequestProperty("Authorization", "KakaoAK " + GEOCODE_USER_INFO); // 인증 헤더 추가
        	log.info("====================1");
        	//url.openConnection.getInputStream 리턴값을 is에 담기
        	
        	InputStream is = conn.getInputStream();
        	BufferedReader bf = new BufferedReader(new InputStreamReader(is,"UTF-8"));
        	
        	StringBuilder resBuilder = new StringBuilder();
        	String inputStr;
        	
        	log.info("====================2");
        	
        	while ((inputStr=bf.readLine())!=null) {
        		log.info(">>>"+inputStr);
        		resBuilder.append(inputStr); //inputStr를 파라미터로 갖는 리턴값 반환
        	}
        	
        	log.info("====================3");
        	
        	JSONObject jo = new JSONObject(resBuilder.toString());
        	JSONArray result = jo.getJSONArray("result");
        	
        	Map<String, String> ret = new HashMap<String, String>();
        	
        	log.info("result 길이 : ",result.length());
        	if(result.length()>0) {
        		JSONObject jsonObject;
        		//results안의 getJSONObject(0) 값. 즉, 배열의 첫번째 값을 jsonObject 변수에 담는다.
	               jsonObject = result.getJSONObject(0);
	               
	             //location문자를 파라미터로 가진 getDouble 사용 시 리턴값을 Double 데이터 타입의 lng 변수에 담는다.
	               Double lat = jsonObject.getJSONObject("geometry").getJSONObject("location").getDouble("lat");
	               Double lng = jsonObject.getJSONObject("geometry").getJSONObject("location").getDouble("lng");
	               ret.put("lat", lat.toString());
	               ret.put("lng", lng.toString());
	               log.info("====================");
	               log.info("LAT(위도) : ",lat);
	               log.info("LNG(경도) : ",lng);
	               log.info("====================");
	             //jsonObject안의 address_components를 파라미터로 가지는 getJSONArray 함수의 리턴 값을 ja변수에 담는다.
	               JSONArray ja = jsonObject.getJSONArray("address_components");
	               for(int l=0; l<ja.length(); l++) {
	            	   //ja의 배열길이 만큼 반복
	                   JSONObject curjo = ja.getJSONObject(l);
	                   //ja안의 JSONObject를 가져올때 파라미터 값을 l로 가진 리턴 값을 JSONObject 데이터타입의 curjo 변수에 담는다.
	                   String type = curjo.getJSONArray("types").getString(0);
	                   //curjo안의 types의 문자를 파라미터로 가지는 getJSONArray함수 안의 getString(0) 즉 첫번째 리턴값을 String 타입의 type변수에 넣는다.
	                   String short_name = curjo.getString("short_name");
	                   //curjo안의 short_name의 문자를 파라미터로 가지는 getJSONArray함수 리턴 값을 String 타입의 short_name에 담는다.
	                   if(type.equals("postal_code")) {
	                	   // type 안의 리턴 값이 postal_code문자와 일치하면
	                       System.out.println("POSTAL_CODE: "+short_name);
	                       ret.put("zip", short_name);
	                   }
	                   else if(type.equals("administrative_area_level_3")) {
	                	   // type 안의 리턴 값이 administrative_area_level_3문자와 일치하면
	                       System.out.println("CITY: "+short_name);
	                       ret.put("city", short_name);
	                   }
	                   else if(type.equals("administrative_area_level_2")) {
	                	   // type 안의 리턴 값이 administrative_area_level_2문자와 일치하면
	                       System.out.println("PROVINCE: "+short_name);
	                       ret.put("province", short_name);
	                   }
	                   else if(type.equals("administrative_area_level_1")) {
	                	   // type 안의 리턴 값이 administrative_area_level_1문자와 일치하면
	                       System.out.println("REGION: "+short_name);
	                       ret.put("region", short_name);
	                   }                    
	               }
	               
	               
	               return ret;
        	}
        	else log.info("!!!!!!!!!!!!!!!!!!");
        	return ret;
        	
        }    
        catch(Exception e) {
        	log.info("!!!!!!!!!!!!!!!!!!catch");
        	log.debug("why?", e);
        	
        	System.out.print(e);
        	return null;
        }
        
	}

 

 

 

첫 에러

org.json.JSONException: JSONObject["result"] not found.2024-04-23 17:48:26.909

 

두번째 에러

{"errorType":"AccessDeniedError","message":"cannot find Authorization : KakaoAK header"}

인증 헤더 문제 - 간단히 해결

 

n번째 에러

계속 변수명 오류

results -> documents

찍히는 return json 내용 확인

2024-04-23 18:12:20.439  INFO 10568 --- [nio-8088-exec-1] c.e.demo.controller.itemController       : jsonObj : {"documents":[{"address":{"mountain_yn":"N","h_code":"1144066000","region_3depth_name":"서교동","main_address_no":"447","x":"126.919446053291","sub_address_no":"5","y":"37.5564857555897","address_name":"서울 마포구 서교동 447-5","region_2depth_name":"마포구","region_3depth_h_name":"서교동","region_1depth_name":"서울","b_code":"1144012000"},"address_type":"REGION_ADDR","x":"126.919446053291","y":"37.5564857555897","address_name":"서울 마포구 서교동 447-5","road_address":{"building_name":"풍성빌딩","main_building_no":"21","road_name":"월드컵북로","region_3depth_name":"서교동","underground_yn":"N","sub_building_no":"","x":"126.919530756025","y":"37.5565464504624","address_name":"서울 마포구 월드컵북로 21","region_2depth_name":"마포구","zone_no":"04001","region_1depth_name":"서울"}}],"meta":{"total_count":1,"is_end":true,"pageable_count":1}}

 

해결!

 

	public Map<String, String> getGeoCod(String add) {
		
        try {
        	log.info("getGeo Start");
        	log.info("Address:"+add);
        	
        	
        	String address = URLEncoder.encode(add, "UTF-8");
        	String url = GEOCODE_URL + address+"&key="+GEOCODE_USER_INFO;
        	URL Url = new URL(url);
        	
        	HttpURLConnection conn = (HttpURLConnection) Url.openConnection();
        	conn.setRequestProperty("Authorization", "KakaoAK " + GEOCODE_USER_INFO); // 인증 헤더 추가
        	log.info("====================1");
        	//url.openConnection.getInputStream 리턴값을 is에 담기
        	
        	InputStream is = conn.getInputStream();
        	BufferedReader bf = new BufferedReader(new InputStreamReader(is,"UTF-8"));
        	
        	StringBuilder resBuilder = new StringBuilder();
        	String inputStr;
        	
        	log.info("====================2");
        	
        	while ((inputStr=bf.readLine())!=null) {
        		//log.info(">>>"+inputStr);
        		resBuilder.append(inputStr); //inputStr를 파라미터로 갖는 리턴값 반환
        	}
        	
        	log.info("====================3");
        	
        	JSONObject jo = new JSONObject(resBuilder.toString());
        	//log.info("jsonObj : " + jo);
        	JSONArray results = jo.getJSONArray("documents");
        	log.info("comeBack...");
        	
        	//리턴할 맵 생성
        	Map<String, String> ret = new HashMap<String, String>();
        	
        	
        	if(results != null && results.length() > 0) {
        		JSONObject jsonObj = results.getJSONObject(0);
        		JSONObject address2 = jsonObj.getJSONObject("address");

        		// 위도 및 경도 정보 가져오기
        		Double lat = address2.getDouble("y"); // 위도
        		Double lng = address2.getDouble("x"); // 경도
        		String addressName = address2.getString("address_name"); // 한글 주소


        		// "address" 정보에서 위도, 경도 및 한글 주소 추가
        		ret.put("lat", lat.toString());
        		ret.put("lng", lng.toString());
        		ret.put("addressName", addressName);

        		// 로그 출력
        		log.info("==========*return*===========");
        		log.info("LAT(위도) : " + lat);
        		log.info("LNG(경도) : " + lng);
        		log.info("한글 주소: " + addressName);
        		log.info("=============================");	
        	}
        	return ret;
        	
        }    
        catch(Exception e) {
        	log.debug("geocode Exception", e);

        	return null;
        }
        
	}

그냥 가지고 돌아온 객체 찍어보면서 객체 명을 맞춤

 

+) 이외에도 자바스크립트... 관련 오류가 너무 많아서 오전은 다 날림... 🥲🥲🥲

참고

https://developers.kakao.com/docs/latest/ko/daum-search/dev-guide

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

https://mine-it-record.tistory.com/328

 

[Kakao API] 주소 검색 API 사용하기 - Maps API (ft. javascript REST API)

주소 검색 API 사용 방법에 대해 알아보자 대체로 API 관련하여 예제가 존재하며, 그것을 가져다 쓰면 손쉽게 사용이 가능했는데 이번에 사용할 주소 검색 API는 예제가 존재하지 않는데 그래서 직

mine-it-record.tistory.com

https://enqnajrwk.tistory.com/36

 

주소로 좌표 구하기, 좌표로 주소 마커 표시하기 (카카오 맵)

좌표 얻는 json package main; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import org.json.JSONArray; import

enqnajrwk.tistory.com

 

 

'Project > 과정 기록' 카테고리의 다른 글

D-17  (0) 2024.04.25
D-18 카카오 rest api 관련 오류 (해결)  (0) 2024.04.24
D-20,D-19 매물 정보 지도 구현 로직 정리  (0) 2024.04.22
D-25  (0) 2024.04.17
D-26  (0) 2024.04.16