주제

 

네이버 API를 연동하여 localhost에서 원하는 음식을 파는 지역의 정보를 출력해보자.

 

 

Naver API 선택 및 이해

 

1. 먼저 아래 링크로 접속하여 사용하고자 하는 네이버 API를 선택한다.

 

지역 - Search API

지역 NAVER Developers - 검색 API 지역 검색 개발가이드 검색 > 지역 네이버 지역 서비스에 등록된 각 지역별 업체 및 상호 검색 결과를 출력해주는 REST API입니다. 비로그인 오픈 API이므로 GET으로 호출

developers.naver.com

 

내 경우에는 지역 API를 선택했다.

 

2. API 생성을 신청한다.

어플리케이션 이름은 마음대로 적고, 사용 API의 경우 기본적으로 본인이 선택한 항목이 지정되어있을테니 굳이 건들일 필요는 없다.

비로그인 오픈 API 서비스 환경의 경우 위와 같이 WEB설정을 클릭하고 URL은 로컬호스트를 적어준다.

 

3. 그렇게해서 생성된 Client ID와 Client Secret을 Spring Boot 내부에서 사용하면 된다.

 

 

Spring Boot 실행

 

1. Spring Boot로 프로젝트를 만든다. 사용하게될 폴더 디렉터리는 아래와 같다.

 

여기서 실제로 코드를 작성하는 클래스는 ServerApiController 뿐이다.

 

2. 다음은 ServerApiController 코드의 내부이다.

@Slf4j
@RestController
@RequestMapping("/api/server")
public class ServerApiController {

    /*
    * https://openapi.naver.com/v1/search/local.json?
    * query=\x63\x68\x69\x63\x6b\x65\x6e
    * &display=10
    * &start=1
    * &sort=random
    * */

    @GetMapping("/naver")
    public String naver(){

        String query = "모츠나베";
        ByteBuffer buffer = StandardCharsets.UTF_8.encode(query);
        String encode = StandardCharsets.UTF_8.decode(buffer).toString();

        URI uri = UriComponentsBuilder
                .fromUriString("https://openapi.naver.com")
                .path("/v1/search/local.json")
                .queryParam("query",encode)
                .queryParam("display",10)
                .queryParam("start",1)
                .queryParam("sort","random")
                .encode()
                .build()
                .toUri();

        RestTemplate restTemplate = new RestTemplate();

        // 아래는 헤더를 넣기 위함
        RequestEntity<Void> req = RequestEntity
                .get(uri)
                .header("X-Naver-Client-Id", "PSzb2MSWCkRSTX3nMKXs")
                .header("X-Naver-Client-Secret","비밀번호")
                .build();

        ResponseEntity<String> result = restTemplate.exchange(req, String.class);
        return result.getBody();
    }
}

전체 코드는 이러하고, 나는 서울시에서 모츠나베를 파는 가게 정보를 출력할것이다.

부분적으로 코드를 설명하면 다음과 같다.

 

@Slf4j
@RestController
@RequestMapping("/api/server")
public class ServerApiController {

    /*
    * https://openapi.naver.com/v1/search/local.json?
    * query=\x63\x68\x69\x63\x6b\x65\x6e
    * &display=10
    * &start=1
    * &sort=random
    * */

    @GetMapping("/naver")
    public String naver(){

        String query = "모츠나베"; // 음식 이름은 UTF-8로 인코딩
        ByteBuffer buffer = StandardCharsets.UTF_8.encode(query);
        String encode = StandardCharsets.UTF_8.decode(buffer).toString();

        URI uri = UriComponentsBuilder
                .fromUriString("https://openapi.naver.com")
                .path("/v1/search/local.json")
                .queryParam("query",encode)
                .queryParam("display",10)
                .queryParam("start",1)
                .queryParam("sort","random")
                .encode()
                .build()
                .toUri();

 

(1) 먼저 주석처리된 부분은 쿼리파라미터로 넘겨주는 데이터를 부분부분 쪼갠것이다.

쿼리파라미터로 넘겨주는 값들은 지역 API에 대한 설명에 언급된 요청변수들이다.

이때 query에 대한 값은 UTF-8로 인코딩하여 URI로 변환해야한다.

 

        RestTemplate restTemplate = new RestTemplate();

        // 아래는 헤더를 넣기 위함
        RequestEntity<Void> req = RequestEntity
                .get(uri)
                .header("X-Naver-Client-Id", "PSzb2MSWCkRSTX3nMKXs")
                .header("X-Naver-Client-Secret","비밀번호")
                .build();

        ResponseEntity<String> result = restTemplate.exchange(req, String.class);
        return result.getBody();
    }
}

(2) 쿼리 파라미터 다음으로는 헤더값을 저장해줘야한다.

위와같이 본인이 신청한 API의 client ID와 Secret 번호를 적어주면 된다. (비밀번호는 비공개를 위해 한글로 표시함)

 

3. 서버를 켜서 http://localhost:본인의 포트번호/api/server/naver로 들어간다.

가독성이 떨어지지만 모츠나베 가게에 대한 정보들이 출력된다. 출력된 Json을 정리해서 보면 아래와 같다.

 

추가로 에러헨들링, 콘솔 출력 등 부가적인 기능들을 원한다면 네이버 API의 사용설명서에 적힌 언어별 샘플코드를 참고하면 된다.