Spring

[Spring] 나만의 셀렉샵 프로젝트 - 네이버 쇼핑 API 이용(API, Spring MVC, JPA)

jelliclesu 2024. 7. 29. 21:28

프로젝트 설계하기

필요 기능

  • 키워드로 상품 검색하고 그 결과를 목록으로 보여주기
  • 관심 상품 등록하기
  • 관심 상품 조회하기
  • 관심 상품에 원하는 가격 등록하고, 그 가격보다 낮은 경우 표시하기

 

API 이용 신청하기

네이버 API: 네이버 서비스를 코드로 이용할 수 있는 서비스

  1. https://developers.naver.com/docs/serviceapi/search/shopping/shopping.md 이동
  2. "오픈 API 이용 신청" 버튼 클릭 후 네이버 로그인 진행
  3. 애플리케이션 이름  - springboot / 비로그인 오픈 API 서비스 환경 - WEB 선택 후 http://localhost 입력
  4. Client ID, Client Secret 생성된 것 확인

 

API 사용해보기(ARC 이용)

네이버 쇼핑 API 설명 문서: https://developers.naver.com/docs/serviceapi/search/shopping/shopping.md

  1. <API 기본 정보> 에서 출력포맷이 JSON인 요청 URL을 복사 후 ARC의 URL에 붙여넣기(https://openapi.naver.com/v1/search/shop.json)
  2. header를 생성하여 Client ID 와 Client Secret 입력 (X-Naver-Client-Id: Client ID / X-Naver-Client-Secret: Client Secret)
  3. 주소 제일 마지막에 요청 변수를 활용하여 요청 추가 입력 후 SEND
    ‼️GET 요청에서 필요한 정보를 같이 보내는 방법: ?& 사용

✔️ 자바 코드 확인(ARC 이용) - CODE SNIPPETS 탭 > JAVA 탭> Spring 탭 클릭하면 JAVA 코드 생성됨

RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "발급받은 Client ID");
headers.add("X-Naver-Client-Secret", "발급받은 Client Secret");
String body = "";

HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=iphone", 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);

 

프로젝트 생성하기

  1. src > main > java > com.sparta.week04 에 utils 패키지 생성
  2. NaverShopSearch.java 파일 생성
    public class NaverShopSearch {
    
        public String search() {
        
        }
    
        public static void main(String[] args) {
            NaverShopSearch naverShopSearch = new NaverShopSearch();
            naverShopSearch.search();
        }
  3. search 함수 안에 ARC에서 복사한 코드 붙여넣기
    public class NaverShopSearch {
    
        public String search() {
            RestTemplate rest = new RestTemplate();
            HttpHeaders headers = new HttpHeaders();
            headers.add("X-Naver-Client-Id", "발급받은 Client ID");
            headers.add("X-Naver-Client-Secret", "발급받은 Client Secret");
            String body = "";
    
            HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
            ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=iphone", HttpMethod.GET, requestEntity, String.class);
            HttpStatus 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();
        }

 

키워드로 상품 검색 - NaverShopSearch

요구 조건

  1. 검색어를 요구에 따라 변경
    ➡️ search 함수 변경 - public String search(String query) / naverShopSearch.search("검색어");
  2. 검색 결과를 문자열에서 DTO로 변경
    ‼️JSON을 자바에서 다루기 위해서 JSONObject, JSONArray 클래스 필요
      ➡️ https://mvnrepository.com 에서 JSON In Java 설치 후 Gradle 내용을 build.gradle 안 dependencies 안에 붙여넣기
    • ItemDto.java 파일 생성
      @Getter
      public class ItemDto {
          private String title;
          private String link;
          private String image;
          private int lprice;
      
          public ItemDto(JSONObject itemJson) {
              // JSONObject 에서 String, int 데이터 뽑기
              this.title = itemJson.getString("title");
              this.link = itemJson.getString("link");
              this.image = itemJson.getString("image");
              this.lprice = itemJson.getInt("lprice");
          }
      }
    • fromJSONtoItems 메소드 생성
      public class NaverShopSearch {
      
          public String search(String query) {
              // 중략
          }
      
          public List<ItemDto> fromJSONtoItems(String result) {
              // 문자열 정보를 JSONObject로 바꾸기
              JSONObject rjson = new JSONObject(result);
              // JSONObject에서 items 배열 꺼내기
              JSONArray items = rjson.getJSONArray("items");
              List<ItemDto> ret = new ArrayList<>();
              // JSONArray로 for 문 돌기
              for (int i = 0; i < items.length(); i++) {
                  JSONObject itemJson = items.getJSONObject(i);
                  System.out.println(itemJson);
                  ItemDto itemDto = new ItemDto(itemJson);
                  ret.add(itemDto);
              }
              return ret;
          }
      }

 

키워드로 상품 검색 - 네이버 API와 서비스 연결

 

요구 조건

  1. 사용자가 검색어를 입력하면, 컨트롤러가 전달받음
  2. 전달받은 검색어로 네이버 API에 요청, 그 결과를 사용자에게 응답

‼️ Controller 에서 NaverShopSearch 를 사용할 수 있어야 함!

>> 스프링이 자동으로 필요한 클래스를 필요한 곳에 생성하려면, 사용자가 요구하면 자동으로 생성할 클래스 목록을 확인할 수 있어야 함!

➡️ 목록에 등록하는 간단한 방법이 "컴포넌트 등록"

 

  • NaverShopSearch 컴포넌트 등록
    @Component  // 이제부터, @RequiredArgsConstructor 와 함께 사용할 경우 스프링이 자동으로 생성
    public class NaverShopSearch {
    	// 중략
        
        
        ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=" + query, HttpMethod.GET, requestEntity, String.class);
    
    }

 

  • SerachRequestController.java 파일 생성
    • 키워드로 상품 검색하고 그 결과를 목록으로 보여주는 기능 / GET 방식 API 요청
      @RequiredArgsConstructor    // final 로 선언된 클래스 자동 생성
      @RestController // JSON으로 응답함을 선언
      public class SearchRequestController {
      
          private final NaverShopSearch naverShopSearch;
      
          @GetMapping("/api/search")
          public List<ItemDto> getItems(@RequestParam String query) { // ? 사용하려면 @RequestParam 필수
              String resultString = naverShopSearch.search(query);
              return naverShopSearch.fromJSONtoItems(resultString);
          }
      }