나한테 필요한 방법을 찾는게 JavaMailSender 때와 다르게 쉽지 않았데, ChatGPT가 기가막히게 답변을 해줬다.
https://chatgpt.com/share/3f28d12d-e306-4234-8ca2-fa713898c07c
이를 토대로 구현해보려 한다.
구현 후 테스트까지 완료했다. 그 과정을 기록하고자 한다.
1. developers.kakao.com에서 앱 등록, 사이트 도메인 등록, 앱 키 확인
카카오 개발자 등록 참고 자료 : https://fromnowwon.tistory.com/entry/kakao-api
2. depndency 추가implementation 'com.fasterxml.jackson.core:jackson-databind'3. application 설정 파일에 카카오 api url과 key 설정
kakao.api.url=https://dapi.kakao.com/v2/local/search/address.json kakao.api.key= 위 1번에서 발급 된 REST API 키4. KaKaoAddressService 구현
import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class KakaoAddressService { @Value("${kakao.api.url}") private String apiUrl; @Value("${kakao.api.key}") private String apiKey; private final RestTemplate restTemplate = new RestTemplate(); public String searchAddress(String query) { HttpHeaders headers = new HttpHeaders(); headers.set("Authorization", "KakaoAK " + apiKey); HttpEntity<String> entity = new HttpEntity<>(headers); String url = apiUrl + "?query=" + query; return restTemplate.exchange(url, org.springframework.http.HttpMethod.GET, entity, String.class).getBody(); } }
- KakaoAddressService를 이용해 실주소 리스트를 찾아 JSON형식으로 return해주는 컨트롤러 메서드 생성
@RestController @RequiredArgsConstructor public class KakaoApiControllerImpl implements KakaoApiController{ private final KakaoAddressService kakaoAddressService; @Override @GetMapping("/searchAddress") public String searchAddress(String query) { return kakaoAddressService.searchAddress(query); } }
- Postman에서 Get메서드, 쿼리파라미터로 검색어 전달 받기
- 반환된 결과 확인
위 JSON데이터 형식은 다음과 같다.HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 { "meta": { "total_count": 4, "pageable_count": 4, "is_end": true }, "documents": [ { "address_name": "전북 익산시 부송동 100", "y": "35.97664845766847", "x": "126.99597295767953", "address_type": "REGION_ADDR", "address": { "address_name": "전북 익산시 부송동 100", "region_1depth_name": "전북", "region_2depth_name": "익산시", "region_3depth_name": "부송동", "region_3depth_h_name": "삼성동", "h_code": "4514069000", "b_code": "4514013400", "mountain_yn": "N", "main_address_no": "100", "sub_address_no": "", "x": "126.99597295767953", "y": "35.97664845766847" }, "road_address": { "address_name": "전북 익산시 망산길 11-17", "region_1depth_name": "전북", "region_2depth_name": "익산시", "region_3depth_name": "부송동", "road_name": "망산길", "underground_yn": "N", "main_building_no": "11", "sub_building_no": "17", "building_name": "", "zone_no": "54547", "y": "35.976749396987046", "x": "126.99599512792346" } }, ... ] }자세한 정보는 아래 Kakao Developers 사이트의 문서를 참고
https://developers.kakao.com/docs/latest/ko/local/dev-guide
+ 여기서 403Forbidden이 반환되는 상황이 발생할 수 있다. SpringSecurity의 Configuration클래스에서 경로허용을 제대로 해주었다면 이 글을 참고바람
여기까지 프론트 단에서 검색할 주소를 String으로 전달받은 후, 검색된 실주소 리스트를 JSON형식으로 응답해주는 데까지 구현되었다.
그런 다음에는 다시 프론트단에서 전달받은 실주소를 선택하여, 저장할 주소를 백엔드에 전달해주면 이를 회원 객체에 저장해준다.(회원가입)
Kakao API를 통해서 검색된 데이터는 위 사진과 같이 도로명, 지번, 심지어 위도 경도까지 보여주는데 이 중 어디부터 어디까지 회원 객체의 주소로 저장해야 할 지, 동시에 프론트로부터 전달 받아야 할지 의논해보아야 겠다.