Naver API 연동

배지원·2024년 8월 1일

이번 미니 Shop 프로젝트를 진행하다보니 제품들의 많은 데이터들이 필요하게 되었는데 이를 위해
Naver API연동을 통해 네이버에서 제공하고 있는 상품들의 정보와 사진 가격등 리스트를 호출하여 출력하는 방법을 구현하기로 했다.

1. 네이버 Developers에서 API 애플리케이션 등록

https://developers.naver.com/main/ 에 접속 후 애플리케이션 등록 메뉴를 눌러 본인이 사용하고자 하는 용도를 설정하여 생성해 준다.

이를 통해 Client ID 와 Client Secret 값을 받을 수 있고 이를 통해 네이버 API를 사용할 수 있게 된다.


2. 데이터 Parsing 및 Mapping

  • 네이버에서 제공해주는 데이터는 양식이 정해져 있으므로 해당 데이터를 파싱해올때는 해당 양식에 맞게 맞춰서 받아와야 한다. 따라서 이를 위해 Dto를 만들어 데이터를 받아 올 수 있도록 하였다.

(1) Dto

@Getter
@NoArgsConstructor
public class ItemDto {
    private String title;
    private String link;
    private String image;
    private int lprice;

    public ItemDto(JSONObject itemJson) {
        this.title = itemJson.getString("title");
        this.link = itemJson.getString("link");
        this.image = itemJson.getString("image");
        this.lprice = itemJson.getInt("lprice");
    }
}
  • 네이버에서 제공해주는 값 title, link, image, lprice 순서대로 구성하여 Dto를 생성해주었다.

(2) Controller

@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class NaverApiController {

    private final NaverApiService naverApiService;

    @GetMapping("/search")
    public List<ItemDto> searchItems(@RequestParam String query)  {
        return naverApiService.searchItems(query);
    }
}

(3) Service

@Slf4j(topic = "NAVER API")
@Service
public class NaverApiService {

    private final RestTemplate restTemplate;

    public NaverApiService(RestTemplateBuilder builder) {
        this.restTemplate = builder.build();
    }

    public List<ItemDto> searchItems(String query) {
        // 요청 URL 만들기
        URI uri = UriComponentsBuilder
                .fromUriString("https://openapi.naver.com")
                .path("/v1/search/shop.json")
                .queryParam("display", 15)
                .queryParam("query", query)
                .encode()
                .build()
                .toUri();
        log.info("uri = " + uri);

        RequestEntity<Void> requestEntity = RequestEntity
                .get(uri)
                .header("X-Naver-Client-Id", "{Client-Id}")
                .header("X-Naver-Client-Secret", "{Client-Secret}")
                .build();

        ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);

        log.info("NAVER API Status Code : " + responseEntity.getStatusCode());

        return fromJSONtoItems(responseEntity.getBody());
    }

    public List<ItemDto> fromJSONtoItems(String responseEntity) {
        JSONObject jsonObject = new JSONObject(responseEntity);
        JSONArray items  = jsonObject.getJSONArray("items");
        List<ItemDto> itemDtoList = new ArrayList<>();

        for (Object item : items) {
            ItemDto itemDto = new ItemDto((JSONObject) item);
            itemDtoList.add(itemDto);
        }

        return itemDtoList;
    }
}
  • 네이버의 요청 URL를 만들어서 본인이 원하는 데이터를 받아 올 수 있다.
    나는 /search/shop을 통해 상품에 관련된 제품들의 데이터 값을 받아 왔다.
  • 이때 header부분에 이전에 네이버에서 제공해준 ID와 Secret값을 넣어야지 API 통신이 가능해진다.

profile
Web Developer

0개의 댓글