Spring(기초)-4주차-4

Jonguk Kim·2021년 11월 19일
0

Spring

목록 보기
11/16

1. 키워드로 상품 검색하기

  • 검색어를 요구에 따라 바꿀 수 있어야 합니다.
  • 검색 결과를 문자열에서 DTO로 바꿔야 합니다.

검색어 바꾸기

  1. search 메소드 바꾸기: 검색어 바꾸기 위해서 매개변수 변경
package com.sparta.week04.utils;

import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;

public class NaverShopSearch {
    public String search(String query) {	// 1. 매개변수 변경
        //////////여기에 자바코드 복사//////////
        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("아이맥"); // 1. 매개변수 변경 
    }
}

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

  1. org.json 패키지 설치하기
    • JSONObject, JSONArray 클래스가 필요
  2. https://mvnrepository.com/
  3. json 검색 -> JSON In Java -> 가장 많이 사용하는 20160810 버전 선택 -> Gradle 탭 -> 복사
  4. build.gradle -> dependencies에 복사 내용 추가 -> dependencies Run -> 우측 Gradle 버튼 -> 새로고침
  5. 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("아이맥");
        //////////5. JSON 사용하기//////////
        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");
            ///////////////////////////////////

        }
    }
}
  1. 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	// 2) getter 메소드 자동 생성
public class ItemDto {
    private String title;
    private String link;
    private String image;
    private int lprice;
	
    // 3) 생성자를 통해 사용
    public ItemDto(JSONObject itemJson){
        this.title = itemJson.getString("title");
        this.link = itemJson.getString("link");
        this.image = itemJson.getString("image");
        this.lprice = itemJson.getInt("lprice");
    }
}
  1. 검색결과를 문자열에서 Dto로 바꾸기
  2. main 지움: 클라이언트에서 사용
  3. 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 // 9. 이제부터, @RequiredArgsConstructor 와 함께 사용할 경우 스프링이 자동으로 생성합니다.
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);    // 7. ItemDto Json 생성
            itemDtoList.add(itemDto);
        }

        return itemDtoList;
    }
    // 8. 지움
    public static void main(String[] args) {
        NaverShopSearch naverShopSearch = new NaverShopSearch();
        String result = naverShopSearch.search("아이맥");
        naverShopSearch.fromJSONtoItems(result);

    }
    //
}
  1. 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 // final 로 선언된 클래스를 자동으로 생성합니다.
@RestController // JSON으로 응답함을 선언합니다.
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);
    }
}
profile
개발일지

0개의 댓글