1. 키워드로 상품 검색하기
- 검색어를 요구에 따라 바꿀 수 있어야 합니다.
- 검색 결과를 문자열에서 DTO로 바꿔야 합니다.
검색어 바꾸기
- search 메소드 바꾸기: 검색어 바꾸기 위해서 매개변수 변경
package com.sparta.week04.utils;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
public class NaverShopSearch {
public String search(String query) {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "FFBgnQz1WGHs4zhkgJAK");
headers.add("X-Naver-Client-Secret", "c4RRV0_1jJ");
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("아이맥");
}
}
검색 결과를 문자열에서 DTO로 바꾸기
- org.json 패키지 설치하기
- JSONObject, JSONArray 클래스가 필요
- https://mvnrepository.com/
- json 검색 -> JSON In Java -> 가장 많이 사용하는 20160810 버전 선택 -> Gradle 탭 -> 복사
- build.gradle -> dependencies에 복사 내용 추가 -> dependencies Run -> 우측 Gradle 버튼 -> 새로고침
- JSONObject, JSONArray 사용하기
package com.sparta.week04.utils;
import com.fasterxml.jackson.databind.util.JSONPObject;
import netscape.javascript.JSObject;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
public class NaverShopSearch {
public String search(String query) {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "FFBgnQz1WGHs4zhkgJAK");
headers.add("X-Naver-Client-Secret", "c4RRV0_1jJ");
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();
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);
String title = itemJson.getString("title");
String image = itemJson.getString("image");
String link = itemJson.getString("link");
int lprice = itemJson.getInt("lprice");
}
}
}
- ItemDto 클래스 만들기
- models 패키지 (src > main > java > com.sparta.week04 > models)
1) 멤버 변수 선언 (제목, 링크, 이미지, 최저가)
2) getter 메소드 자동 생성: 각각을 꺼낼 수 있도록 설정
3) 생성자를 통해 사용하므로 Setter 없음
package com.sparta.week04.models;
import lombok.Getter;
import org.json.JSONObject;
@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로 바꾸기
- main 지움: 클라이언트에서 사용
- NaverShopSearch 컴포넌트 등록
package com.sparta.week04.utils;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.sparta.week04.models.ItemDto;
import netscape.javascript.JSObject;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;
@Component
public class NaverShopSearch {
public String search(String query) {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "FFBgnQz1WGHs4zhkgJAK");
headers.add("X-Naver-Client-Secret", "c4RRV0_1jJ");
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<>();
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("아이맥");
naverShopSearch.fromJSONtoItems(result);
}
}
- SearchRequestController 만들기
1) 클라이언트 쿼리문을 통해 JSON으로 응답
package com.sparta.week04.controller;
import com.sparta.week04.models.ItemDto;
import com.sparta.week04.utils.NaverShopSearch;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RequiredArgsConstructor
@RestController
public class SearchRequestController {
private final NaverShopSearch naverShopSearch;
@GetMapping("/api/search")
public List<ItemDto> getItems(@RequestParam String query) {
String resultString = naverShopSearch.search(query);
return naverShopSearch.fromJSONtoItems(resultString);
}
}