본문 바로가기
★ 프로젝트 + 트러블 슈팅 ★

[Reverse Geocoing] RestTemplate 활용 네이버 API 사용법 (만남의 광장)

by 리승우 2023. 2. 15.

인증키 발급법

1. 네이버 클라우드 플랫폼 가입

 

https://www.ncloud.com/ 페이지로 이동하여 회원가입

 

 

2. 계정 생성 후 화면상단의 Console 클릭

 

3. 네이버 지도 API 인증키 발급받기

왼쪽 배너에서 Products & Services를 클릭 후

오른쪽 메뉴항목들중 AI-NAVER API를 클릭.

다음 화면에서 아래 Add aplication 파란색 버튼을 클릭한 후,

Application name을 원하는 대로 적어주고 (아무거나 적어도 됨)

Maps에서 이용하고자 하는 서비스인 Reverse Geocoding을 클릭해주고,

(혹시 나중에 Geocoding도 같이 필요할꺼 같다면 같이 클릭)

Web service URL도 아무 주소를 적어주면 됨.

이제 인증키를 받기위한 절차는 모두 진행되었고,

인증키는 본인이 만든 Application의 이름 하단에 Autentication을 클릭하면

본인의 Client IDClient Secret을 확인할 수 있음.

 



spring boot에 해당 API사용 및 적용 (RestTemplate 사용)

 

네이버에서는 보안상의 이유 때문에 javascript 에서 API 호출하는 방식을 막아두었다고 한다.

 

그래서 서버 단에서 실행을 시키려고 한다.

그러기 위해 알아본 결과, Spring의 내장 클래스인 RestTemplate를 사용하면 간편하게 Rest 방식 API를 호출할 수 있다는 것을 알게 되었다.

 

RestTemplate는 Rest API 서비스를 요청 후 응답 받을 수 있도록 설계되어있으며 HTTP 프로토콜의 메소드(ex. GET, POST, DELETE, PUT)들에 적합한 여러 메소드들을 제공한다

 

 

RestTemplate 특징

 · Spring 3.0 부터 지원하는 Spring의 HTTP 통신 템플릿

 · HTTP 요청 후 JSON, XML, String 과 같은 응답을 받을 수 있는 템플릿

 · Blocking I/O 기반의 동기방식을 사용하는 템플릿

 · RESTful 형식에 맞추어진 템플릿

 · Header, Content-Tpye등을 설정하여 외부 API 호출

 · Server to Server 통신에 사용

 

RestTemplate 동작원리

1. 애플리케이션 내부에서 REST API에 요청하기 위해 RestTemplate의 메서드를 호출.

2. RestTemplate은 MessageConverter를 이용해 java object를 request body에 담을 message(JSON etc.)로 변환한다. 메시지 형태는 상황에 따라 다름

3. ClientHttpRequestFactory에서 ClientHttpRequest을 받아와 요청을 전달.

4. 실질적으로 ClientHttpRequest가 HTTP 통신으로 요청을 수행.

5. RestTemplate이 에러핸들링 진행.

6. ClientHttpResponse에서 응답 데이터를 가져와 오류가 있으면 처리.

7. MessageConverter를 이용해 response body의 message를 java object로 변환.

8. 결과를 애플리케이션에 돌려줌.

※ RestTemplate은 통신 과정을 ClientHttpRequestFactory(ClientHttpRequest, ClientHttpResponse)에 위임합니다. ClientHttpRequestFactory의 실체는 HttpURLConnection, Apache HttpComponents, HttpClient와 같은 HTTP Client

 

 

 

RestTemplate에는 여러가지 주요 메서드들이 있으나, 현재는 아래 메서드말고는 사용할 이유가 없어서 한개의 메서드만 기재해놓을 예정이다.

 

 

그리하여, 아래와 같이 API를 사용하여 네이버 API를 사용할 수 있게 되었다.

이제 유저가 로그인을 하게되면, 살고있는 도시의 이름을 알 수 있게된다.

@Service
@RequiredArgsConstructor
public class MemberService {

    private final JwtUtil jwtUtil;
    private final PasswordEncoder passwordEncoder;
    private final MemberRepository memberRepository;
    private final RefreshTokenRepository refreshTokenRepository;

    @Value("${naver.api.client-id}")
    private String clientId;

    @Value("${naver.api.client-secret}")
    private String clientSecret;

    private static final String NAVER_REVERSE_GEOCODING_API_URL = "https://naveropenapi.apigw.ntruss.com/map-reversegeocode/v2/gc?coords={lng},{lat}&output=json";

    @Transactional
    public MemberResDto login(LoginRequest loginReqDto, HttpServletResponse response) {

		// 중간에 연관없는 로직들은 숨기기 처리하였음

        String lng = loginReqDto.getLongitude().toString();
        String lat = loginReqDto.getLatitude().toString();

        // NAVER Reverse Geocoding API 호출
        // 1. RestTemplate 객체 생성
        RestTemplate restTemplate = new RestTemplate();
        
        // 2. header 설정을 위해 HttpHeader 클래스 생성
        HttpHeaders headers = new HttpHeaders();
        
        // 3. API 요청에 따라, ID와 키값을 헤더에 세팅
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("X-NCP-APIGW-API-KEY-ID", clientId);
        headers.set("X-NCP-APIGW-API-KEY", clientSecret);
        
        // 3. HttpEntity 객체에 HttpHeader를 넣어줌
        HttpEntity<String> requestEntity = new HttpEntity<>(headers);
        
        // 4. exchange() 메소드로 api 요청서에 맞게 호출
        ResponseEntity<String> responseEntity = restTemplate.exchange(
                NAVER_REVERSE_GEOCODING_API_URL, HttpMethod.GET, requestEntity, String.class, lng, lat);
                
        // 호출한 후 responseEntity의 Body값을 가져옴
        String responseBody = responseEntity.getBody();
        
        /*
        JSON 객체로 변환
        객체변환 및 데이터추출은 아래 링크를 참고하였음
        https://shlee0882.tistory.com/45
        */
        JSONObject jsonObject = new JSONObject(responseBody);

        // 필요한 데이터 추출
        JSONObject area2 = jsonObject.getJSONArray("results")
                .getJSONObject(0)
                .getJSONObject("region")
                .getJSONObject("area2");
        String cityName = area2.getString("name");

        // 중간에 연관없는 로직들은 숨기기 처리하였음
    }

 

저장까지 잘 진행되는 것이 확인되었다. ㅎㅎㅎ

 

 

 

참조링크

https://blog.naver.com/rackhunson/222402989965

 

[geocoding] 네이버 (NAVER) API 사용방법

네이버 지도 API를 이용해서 geocoding 하는 방법을 알아보자. 1. 네이버 클라우드 플랫폼 가입하기 아...

blog.naver.com

https://wecandev.tistory.com/41

 

[스프링 인 액션] 7장 RestTemplate : REST 서비스 사용하기

7장 REST 서비스 사용하기 💻 실습 : https://github.com/cusbert/spring-in-action-5th 🎯 이 장에서 배우는 내용 RestTemplate 을 사용해서 REST API 사용하기 스프링에서 사용하는 REST API RestTemplate: 스프링 프레임

wecandev.tistory.com

 

댓글