본문 바로가기

나만의 select shop 만들기

키워드로 상품 검색하기 - NaverShopSearch 발전시키기

전에 만들어 둔 NaverShopSearch  클래스를 웹서비스에 사용할  있도록 수정해보자.

 

utils > NaverShopSearch.java

public class NaverShopSearch {
    public String search() {
        RestTemplate rest = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Naver-Client-Id", "mGmaVv5HUsl9XXf407tz");
        headers.add("X-Naver-Client-Secret", "3mo1i3q5LN");
        String body = "";

        HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
        ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=cartier", HttpMethod.GET, requestEntity, String.class);
        HttpStatus httpStatus = responseEntity.getStatusCode();
        int status = httpStatus.value();
        String response = responseEntity.getBody();
        System.out.println("Response status: " + status);
        System.out.println(response);

        return response;
    }

    public static void main(String[] args) {
        NaverShopSearch naverShopSearch = new NaverShopSearch();
        naverShopSearch.search();
    }
}

 

  • 검색어 바꾸기

우선 검색어를 요구에 따라 바꿀 수 있어야 한다.

public class NaverShopSearch {
    public String search(String query) {
        RestTemplate rest = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Naver-Client-Id", "mGmaVv5HUsl9XXf407tz");
        headers.add("X-Naver-Client-Secret", "3mo1i3q5LN");
        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();
        String response = responseEntity.getBody();
        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= 뒤에 따라오는 부분에 들어가 검색어가 되고 그에 따라 나온 검색 결과가 리턴된다. 

 

 

  검색 결과를 문자열에서 DTO로 바꾸기

      - org.json 패키지 설치하기       ㄴ hongyuchan.tistory.com/30          <-링크

 

1. 문자열 정보를 JSONObject로 바꾸기

 

utils > NaverShopSearch.java

 

    public static void main(String[] args) {
        NaverShopSearch naverShopSearch = new NaverShopSearch();
        String result = naverShopSearch.search("아이맥");
        JSONObject rjson = new JSONObject(result);
        System.out.println(rjson); // 출력확인
    }
    작성 후 메인메서드 실행시

items라는 키값을 보면 []대괄호로 list 배열이고 JSONObject는 {} 중괄호로 시작하고 있다.

그럼 이걸 Json형태에 맞게끔 배열로 꺼내줘야 하는데 이때 사용하는 것이 JSONArray다.

 

      2.

JSONObject에서 items 배열을 JSONArray 로 꺼내고 for 문 돌기

    public static void main(String[] args) {
        NaverShopSearch naverShopSearch = new NaverShopSearch();
        String result = naverShopSearch.search("아이맥");
        JSONObject rjson = new JSONObject(result);
        JSONArray items = rjson.getJSONArray("items");
        for (int i=0; i<items.length(); i++){
            JSONObject itemJson = items.getJSONObject(i);
            System.out.println(itemJson);
        }
    }

 

출력해보면 이런식으로 JSONArray의 각JSONObject들이 나열된다.

이제 우측으로 넘겨보면 나오는 우리에게 필요한 데이터(image, lprice등) 를 꺼내오면 된다.

 

utils > NaverShopSearch.java

    public static void main(String[] args) {
        NaverShopSearch naverShopSearch = new NaverShopSearch();
        String result = naverShopSearch.search("아이맥");
        JSONObject rjson = new JSONObject(result);
        JSONArray items = rjson.getJSONArray("items");
        for (int i=0; i<items.length(); i++){
            JSONObject itemJson = items.getJSONObject(i);
            System.out.println(itemJson);
            String title = itemJson.getString("title");
            String image = itemJson.getString("image");
            int lprice = itemJson.getInt("lprice");
            String link = itemJson.getString("link");
            System.out.println(lprice);
        }
    }

이렇게 get으로 원하는 데이터만 뽑아지는 것을 확인했으면 이 데이터를 옮겨줄 Dto를 만들어준다.

 

models > ItemDto.java

@Getter
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");
    }
}

 

Dto가 확인됐으면 다시 메인메서드로 돌아가서 Dto로 데이터를 실어나른다.

(ItemDto는 하나의 json이니까 ArrayList로 목록을 만들어 보내준다.)

utils > NaverShopSearch.java

    public static void main(String[] args) {
        NaverShopSearch naverShopSearch = new NaverShopSearch();
        String result = naverShopSearch.search("아이맥");
         /*
        JSONObject rjson = new JSONObject(result);
        JSONArray items = rjson.getJSONArray("items");

        List<ItemDto> itemDtoList = new ArrayList<>();
        //ItemDto 의 목록을 가져와야 하니 리스트를 만들어준다..

        for (int i=0; i<items.length(); i++){
            JSONObject itemJson = items.getJSONObject(i);
            ItemDto itemDto = new ItemDto(itemJson);
            itemDtoList.add(itemDto);
        }
        */

        return itemDtoList;
    }

위와같이 만들면 (블록해제시) 클라이언트에서 바로 사용가능하다.

다만 블록지정 되어있는 부분은 지속적으로 재사용 하기 위에 메서드로 따로 빼주는게 좋다. 

 

그럼 이렇게 

utils > NaverShopSearch.java 가 완성된다.

public class NaverShopSearch {
    public String search(String query) {
        RestTemplate rest = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Naver-Client-Id", "mGmaVv5HUsl9XXf407tz");
        headers.add("X-Naver-Client-Secret", "3mo1i3q5LN");
        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();
        String response = responseEntity.getBody();
        System.out.println("Response status: " + status);
        System.out.println(response);

        return response;
    }

    public List<ItemDto> fromJSONtoItems(String result){
        JSONObject rjson = new JSONObject(result);
        JSONArray items = rjson.getJSONArray("items");

        List<ItemDto> itemDtoList = new ArrayList<>();
        //ItemDto 의 목록을 가져와야 하니 리스트를 만들어준다.

        for (int i=0; i<items.length(); i++){
            JSONObject itemJson = items.getJSONObject(i);
            ItemDto itemDto = new ItemDto(itemJson);
            itemDtoList.add(itemDto);
        }
        return itemDtoList;
    }
	
    /*
    public static void main(String[] args) {
        NaverShopSearch naverShopSearch = new NaverShopSearch();
        String result = naverShopSearch.search("아이맥");
    }//이제 메인메서드는 필요없으니 지워준다.
    */
}

이제 controller에서 두가지를 하면되는데 첫번쨰로 search메서드 호출하여 문자열로 받고 

그걸 다시 fromJSONtoItems 메서드에 intput을 줘서 결과를 받은 다음에 그걸 돌려주면 클라이언트에서 자유롭게

정보를 받아볼 수있다.

 

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ쿠ㅜㅜㅜ어렵다 다음은 서비스와