본문 바로가기

SpringBoot/스파르타 웹개발의 봄 spring

[스파르타 웹개발의 봄 spring] 04.08 키워드로 상품 검색하기 - NaverShopSearch 발전시키기

728x90
반응형

##

NaverShopSearch 클래스를, 웹서비스에 이용할 수 있도록 발전시켜 보겠습니다.

1. 검색어를 요구에 따라 바꿀 수 있어야 합니다.

1) 검색어 바꾸기

- 문자열로 받아서 query주소에 넣기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public String search(String query) { // 검색어 받아서
        // ARC에서 가져온 네이버 api GET 코드
        RestTemplate rest = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Naver-Client-Id""Y2PMCJtP_nbIC3jX1Xv6"); // 네이버에서 발급받은 id
        headers.add("X-Naver-Client-Secret""qRV0POeqMQ"); // 네이버에서 발급받은 secret
        String body = "";
 
        HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
        // 밑의 코드에서 호출 url 변수에 검색어나 여러 변수 설정 가능
        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;
    }
cs

2. 검색 결과를 문자열에서 DTO로 바꿔야 합니다.

1)org.json 패키지 설치하기 : JSON을 자바에서 다루기 위해, JSONObject, JSONArray 클래스가 필요

-사이트https://mvnrepository.com/ 접속-> json 검색-> json in java -> 사용자 많은 버전 선택-> gradle 탭 선택 -> 인인텔리제이 build.gradle 파일dependencies에 복붙-> dependencies 실행->gradle 새로고침

 

2)ItemDto 생성하기

: JSONObject 의 정보의 매개체

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.sparta_spring.sparta_spring_week04.models;
 
import lombok.Getter;
import org.hibernate.cache.spi.support.AbstractReadWriteAccess;
import org.json.JSONObject;
 
 
@Getter
public class ItemDto { // 네이버 검색 결과 상품의 정보의 매개체
    private String title;
    private String image;
    private int lprice;
    private String link;
 
    // 다른 DTO는 같은 Product 객체를 전달한 거여서 @RequiredArgConstruct 가자동 완성했지만
    // ItemDto JSONOject 를 받는 거여서 생성자 따로 생성
    public ItemDto(JSONObject itemJson){
        this.title = itemJson.getString("title");
        this.image = itemJson.getString("image");
        this.lprice = itemJson.getInt("lprece");
        this.link = itemJson.getString("link");
    }
}
 
cs

3)fromJSONtoItems 메소드 만들기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 검색된 상품들 JSON객체에서 -> ItemDto리스트로 반환 메서드
    public List<ItemDto> fromJSONtoItems(String result) {
        JSONObject rjson = new JSONObject(result); // 네이버 검색 결과 문자열 -> json객체로 변환
        System.out.println(rjson); // 검색된json 객체 확인
        JSONArray items = rjson.getJSONArray("items"); // 검색된 json객체에서 키값이 items인 json 리스트 추출
 
        // 받아온 items 를 List에다가 저장
        List<ItemDto> itemDtoList = new ArrayList<>();
        for (int i = 0; i < items.length(); i++) {
            JSONObject itemJson = items.getJSONObject(i); // i번째 인덱스의 json객체를 가져와라
            //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);//
 
            // ItemDto 객체로 변환해 ArrayList 에 저장장
            ItemDto itemDto = new ItemDto(itemJson);
            itemDtoList.add(itemDto);
        }
        return itemDtoList;
    }
cs

 

 

## NaverShopSearch  클래스 결과물

- 네이버 api로 검색->검색결과 문자열로 반환

-> 문자열 -> JSONObject로 변환 

-> JSONObject 에서 item들을 담은 리스트를 JSONArray형태로 추출

-> JSONArray의 각각의 JSONObject를 추출해 ItemDto 클래스로 정보를 저장해 List<itemDto> 의 리스트로 변환

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package com.sparta_spring.sparta_spring_week04.utils;
 
import com.sparta_spring.sparta_spring_week04.models.ItemDto;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
 
import java.util.ArrayList;
import java.util.List;
 
public class NaverShopSearch {
    public String search(String query) { // 검색어 받아서
        // ARC에서 가져온 네이버 api GET 코드
        RestTemplate rest = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.add("X-Naver-Client-Id""Y2PMCJtP_nbIC3jX1Xv6"); // 네이버에서 발급받은 id
        headers.add("X-Naver-Client-Secret""qRV0POeqMQ"); // 네이버에서 발급받은 secret
        String body = "";
 
        HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
        // 밑의 코드에서 호출 url 변수에 검색어나 여러 변수 설정 가능
        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;
    }
 
    // 검색된 상품들 JSON객체에서 -> ItemDto리스트로 반환 메서드
    public List<ItemDto> fromJSONtoItems(String result) {
        JSONObject rjson = new JSONObject(result); // 네이버 검색 결과 문자열 -> json객체로 변환
        System.out.println(rjson); // 검색된json 객체 확인
        JSONArray items = rjson.getJSONArray("items"); // 검색된 json객체에서 키값이 items인 json 리스트 추출
 
        // 받아온 items 를 List에다가 저장
        List<ItemDto> itemDtoList = new ArrayList<>();
        for (int i = 0; i < items.length(); i++) {
            JSONObject itemJson = items.getJSONObject(i); // i번째 인덱스의 json객체를 가져와라
            //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);//
 
            // ItemDto 객체로 변환해 ArrayList 에 저장장
            ItemDto itemDto = new ItemDto(itemJson);
            itemDtoList.add(itemDto);
        }
        return itemDtoList;
    }
    // 메인함수 실행해서 응답확인
//    public static void main(String[] args) {
//        NaverShopSearch naverShopSearch = new NaverShopSearch();
//        String result = naverShopSearch.search("아이맥");
//            JSONObject rjson = new JSONObject(result); // 네이버 검색 결과 문자열 -> json객체로 변환
//            System.out.println(rjson); // 검색된json 객체 확인
//            JSONArray items = rjson.getJSONArray("items"); // 검색된 json객체에서 키값이 items인 json 리스트 추출
//            // 받아온 items 를 List에다가 저장
//            List<ItemDto> itemDtoList = new ArrayList<>();
//
//            for(int i=0;i<items.length();i++){
//                JSONObject itemJson = items.getJSONObject(i); // i번째 인덱스의 json객체를 가져와라
//                //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);//
//
//                // ItemDto 객체로 변환해 ArrayList 에 저장장
//                ItemDto itemDto = new ItemDto(itemJson);
//                itemDtoList.add(itemDto);
//        }
//
//    }
    }
cs
반응형