Spring Framework

나만의셀렉샵) 키워드로 상품 검색하기 - 네이버 API와 서비스 연결하기

na_o 2021. 7. 28. 00:34
728x90

요구조건 살펴보기)

  1. 사용자가 검색어를 입력하면, 컨트롤러가 그것을 전달받습니다.
  2. 전달받은 검색어로 네이버 API에 요청하고, 그 결과를 사용자에게 응답합니다.

NaverShopSearch를 컴포넌트로 등록을 해야 함

컴포넌트 등록:

스프링한테 필요할 때 알아서 쓰라는 권한을 주는 것

final 변수 선언 & @RequiredArgsConstructor 어노테이션 등록

 

스프링이 권한 판단을 요구할 때가 있음(자동으로 생성할 수 있는건지 아닌지)

 

사용자가 요구하면 자동으로 생성 가능한 클래스 목록이 있어야

스프링이 자동으로

필요한 클래스를 필요한 곳에 생성한다

 

- 컴포넌트 :

사용자가 요구하면 자동으로 생성 가능한 클래스 목록

 

 

- NaverShopSearch 컴포넌트 등록

이전에 만들어 둔 NaverShopSearch 클래스에 @Component 어노테이션만 등록하면 됨

/*NaverShopSearch.java*/

package com.sparta.week04.utils;

...

/* 딱 이거만 추가했음 */
@Component //컴포넌트 등록
public class NaverShopSearch {
    //Java에서 url에 한글로 입력을 해도 인코딩을 알아서 해줌
    public String search(String query) {
        RestTemplate rest = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        //네이버 API가 정의한대로 헤더를 넘겨줌
        headers.add("X-Naver-Client-Id", "Fzj17ucnTdxEPXlsLH8O");
        headers.add("X-Naver-Client-Secret", "Tpspa8UeG_");
        String body = ""; //응답받은 결과물이 들어갈 변수

        HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
        ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=" + query, HttpMethod.GET, requestEntity, String.class);
        HttpStatus httpStatus = responseEntity.getStatusCode();
        int status = httpStatus.value(); //200이나 404 이런게 들어감
        String response = responseEntity.getBody(); //Request에 대한 Response가 문자열로 들어감
        System.out.println("Response status: " + status);
        System.out.println(response);

        return response;
    }

    public List<ItemDto> fromJSONtoItems(String result) {
        JSONObject resultJson = new JSONObject(result);
        System.out.println("resultJson :\n" + resultJson); //출력 결과 중 [] : json 배열(JSONArray 클래스)
        JSONArray items = resultJson.getJSONArray("items"); //매개변수는 key:value 중 key값
        List<ItemDto> itemDtoList = new ArrayList(); //클래스를 담을 List 선언
        for (int i=0; i<items.length(); i++) { //JSONArray 클래스에서는 size()가 아닌 length()
            JSONObject itemJson = items.getJSONObject(i); //= (JSONObject) items.get(i)
            System.out.println("itemJson :\n" + itemJson);
            ItemDto itemDto = new ItemDto(itemJson);
            itemDtoList.add(itemDto);
        }
        return itemDtoList;
    }

}

 

- SearchRequestController 만들기

키워드로 상품을 검색하고 그 결과를 목록으로 보여주기

/*SearchRequestController.java*/

package com.sparta.week04.controller;

...

//이 어노테이션을 넣음으로써 컴포넌트로 등록하는 것
@RequiredArgsConstructor // final 로 선언된 클래스를 자동으로 생성합니다. 컴포넌트로 등록되어있어야 가능한 기능
@RestController // JSON으로 응답함을 선언합니다.
public class SearchRequestController {

    private final NaverShopSearch naverShopSearch;

    @GetMapping("/api/search")
    //@RequestParam: 요청 시 파라미터 중에 query라는 게 있으면 넣어주라는 뜻
    public List<ItemDto> search(@RequestParam String query) {
        String result = naverShopSearch.search(query); //리턴 String
        List<ItemDto> itemDtoList = naverShopSearch.fromJSONtoItems(result);
        return itemDtoList;
    }
}

 

- 실행 결과

데이터 출력이 자주 잘 되고 있음!