Spring Framework

나만의셀렉샵)키워드로 상품 검색하기 - NaverShopSearch 발전시키기

na_o 2021. 7. 27. 00:53
728x90

* 이전에 만들어 둔 NaverShopSearch 클래스를 웹서비스에 이용할 수 있도록 수정

 

- 만들어 둔 NaverShopSearch

package com.sparta.week04.utils;

...

public class NaverShopSearch {
    //Java에서 url에 한글로 입력을 해도 인코딩을 알아서 해줌
    public String search() {
        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=아디다스", 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 static void main(String[] args) {
        NaverShopSearch naverShopSearch = new NaverShopSearch();
        naverShopSearch.search();
    }
}

 

- 검색어를 아무거나 넣어도 되도록 search() 함수 수정

search함수의 매개변수를 생성하고 매개변수에 검색어를 넣으면 됨

url의 쿼리스트링에 "...?query=아디다스" -> "...?query=" + query 매개변수 값이 들어가도록 수정 

package com.sparta.week04.utils;

...

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 static void main(String[] args) {
        NaverShopSearch naverShopSearch = new NaverShopSearch();
        naverShopSearch.search("아이패드 케이스");
    }
}

 

- 실행 결과

'아이다스'가 아닌 '아이패드 케이스'로 검색이 잘 되었음

 

* 위처럼 묶여있는 데이터를 쪼개고 쪼개서 각각의 데이터로 가져온 다음 Java의 List에 담는 함수를 만들 것임

   JSON(이지만 문자열임) -> Java List로 바꿔주는 과정

 

List에는 데이터가 담겨있는 클래스가 담겨있어야 하는데 그 클래스를 만들어줘야 함

/*ItemDto.java*/

package com.sparta.week04.models;

...

@Getter
public class ItemDto {

    private String title;
    private String link;
    private String image;
    private int lprice;
    
    public ItemDto(JSONObject jsonObject) {
    	this.title = jsonObject.getString("title");
        this.link = jsonObject.getString("link");
        this.image = jsonObject.getString("image");
        this.lprice = jsonObject.getInt("lprice");
    }

}
/*NaverShopSearch.java*/

package com.sparta.week04.utils;

...

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;
    }

}

 

- fromJsonToItems 메소드 데이터 확인