실시간으로 검색요청하기
https://developers.naver.com/products/intro/plan/

네이버가 제공하는 여러가지 오픈 API 목록이다.
여기서 쇼핑 API를 사용할 것이다.
https://developers.naver.com/docs/search/shopping/

먼저 ARC로 검색을 해본다.
API를 이용하려면 2가지를 알아야한다.

검색 API이기 때문에 조회 → GET 방식을 이용할 것이다.
xml이냐 JSON이냐 우리는 JSON 출력 포맷을 원하기때문에 요청 URL 부분을 사용한다.

GET방식으로 정보를 무언가 넘길때에는 ? 나 & 두가지를 쓴다.

검색 패키지인 utils 패키지를 만든다.
public class NaverShopSearch {
public String search() {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "qdAYBlCnHECWX8C3c0vs");
headers.add("X-Naver-Client-Secret", "mJqet4jpvB");
String body = "";
HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=adidas", 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();
}
}
RestTemplate rest = new RestTemplate();
The RestTemplate offers templates for common scenarios by HTTP method, in addition to the generalized exchange and execute methods that support of less frequent cases.HTTP 메소드에 의한 평범한 기능 템플릿을 제공해주고, 더 나아가 특별한 케이스를 지원하는 exchange와 execute 메소드를 제공해준다.Spring의 HTTP 통신 템플릿HTTP 요청 후 Json, xml, String 과 같은 응답을 받을 수 있는 템플릿으로 Header, Content-Type등을 설정하여 외부 api 호출Http request를 지원하는 HttpClient를 사용함HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "qdAYBlCnHECWX8C3c0vs");
headers.add("X-Naver-Client-Secret", "mJqet4jpvB");
String body = "";
그리고 header에 각각 넣어주고, body를 만들었다.
HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
HttpEntity<> request에 담는다.즉, 통신 메시지 관련 header와 body의 값들을 하나의 객체로 저장하는 것이 HttpEntity 클래스 객체
HttpEntity를 통해 Http 메시지에 직접 접근하여 body메시지를 파싱한다.
HttpEntity는 body 정보 뿐만아니라 header 정보까지 파싱 가능하다. http message에 직접 접근하기 때문이다.
ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=" + query, HttpMethod.GET, requestEntity, String.class);
ResponseEntity는 사용자의 HttpRequest에 대한 응답 데이터를 포함하는 클래스이다. 따라서 HttpStatus, HttpHeaders, HttpBody를 포함한다.RestTemplate의 exchange 메소드 - HTTP 헤더를 새로 만들 수 있고 어떤 HTTP 메서드도 사용가능하다HttpStatus httpStatus = responseEntity.getStatusCode();
int status = httpStatus.value(); //잘받아온 200이란 숫자가 여기 들어간다
String response = responseEntity.getBody(); //직접보낸 결과화면이 문자열 하나로된것, 서버에서 응답해준 데이터가 저장될 것이다.
System.out.println("Response status: " + status);
System.out.println(response);
API 처리별 리턴 코드가 httpstatus에 들어온다.
httpstatus 에는 “200 OK, 404 NOT FOUND” 등이 있고 200이 httpstatus.value에 들어간다.
필요한 기능
1. 키워드로 상품 검색하고 그 결과를 목록으로 보여주기
2. 관심 상품 등록하기
3. 관심 상품 조회하기
4. 관심 상품에 원하는 가격 등록하고, 그 가격보다 낮은 경우 표시하기

3계층 설계
Controller
Repository
Service
일단 데이터베이스에 저장되어야하기때문에 Timestamped 클래스를 만들자.
@Getter// get 함수를 자동 생성합니다. 정보를 조회할 수 있도록
@MappedSuperclass// createdAt,modifiedAt 상속한 클래스에 멤버 변수가 컬럼이 되도록 합니다.
@EntityListeners(AuditingEntityListener.class)// 변경되었을 때 자동으로 기록합니다. 클래스에 Auditing 기능을 포함시킵니다.
public abstract class Timestamped {//생성하는게 없고 상속이 돼서 다른 데서 사용되게 abstract
@CreatedDate// 최초 생성 시점,Entity가 생성되어 저장될 때 시간이 자동 저장
private LocalDateTime createdAt;
@LastModifiedDate// 마지막 변경 시점,조회한 Entity의 값을 변경할 때 시간이 자동 저장
private LocalDateTime modifiedAt;
}
@EnableJpaAuditing //시간 자동 변경이 가능하도록 main클래스에 어노테이션을 작성해준다.
//데이터베이스에서 누가, 언제하였는지 기록을 잘 남겨놓아야 합니다. 그렇기 때문에 생성일, 수정일 컬럼은 대단히 중요한 데이터 입니다.
//그래서 JPA에서는 Audit이라는 기능을 제공하고 있습니다. Audit은 감시하다, 감사하다라는 뜻으로 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능입니다.

//Spring Boot에선 Entity의 기본적인 CRUD가 가능하도록 JpaRepository Interface를 제공,사용할 Entity Class, Long에는 ID 값이 들어가게 된다.
@RestController와 @Controller의 차이점
@Controller의 역할은 Model 객체를 만들어 데이터를 담고 View를 찾는 것이지만, @RestController는 단순히 객체만을 반환하고 객체 데이터는 JSON 또는 XML 형식으로 HTTP 응답에 담아서 전송한다.
@Controller는 클래스를 Spring MVC 컨트롤러로 표시하는데 사용되며, @RestController는 RESTful 웹 서비스에서 사용되는 특수 컨트롤러이며 @Controller + @ResponseBody와 동일하다.

ARC로 정상 동작하는지 확인해보기
Dto클래스 만들기
Product 클래스 개선
ProductService 개선
//org.json은 java의 json라이브러리이다.
// https://mvnrepository.com/artifact/org.json/json
implementation group: 'org.json', name: 'json', version: '20160810'
//문자열에서 DTO바꾸기 과정 - 검색 결과가 문자열로 나오고 있어서 클래스로 만들어서 DTO를 통해서 전달될 수 있도록 변형 시켜야함
//이거로 JSONObject, JSONArray 클래스를 이용할 수 있다. 의존성 추가가
json을 자바에서 다루려면 jsonobject, jsonarray가 필요하다.
jsonobject - 중괄호로 시작하는 것을 다루기 위한것
jsonarray - json이 배열로 이루어졌을때 배열을 다루는 클래스
JSONObject rjson = new JSONObject(result); //result문자열을 받아서 JSONObject로 만든다. 아이맥으로 입력한 검색 결과가 rjson이라는걸로 만들어짐
JSONArray items = rjson.getJSONArray("items"); //item이라는 키값으로 검색 결과가 들어와있음