Spring
[Spring] 나만의 셀렉샵 프로젝트 - 네이버 쇼핑 API 이용(API, Spring MVC, JPA)
jelliclesu
2024. 7. 29. 21:28
프로젝트 설계하기
필요 기능
- 키워드로 상품 검색하고 그 결과를 목록으로 보여주기
- 관심 상품 등록하기
- 관심 상품 조회하기
- 관심 상품에 원하는 가격 등록하고, 그 가격보다 낮은 경우 표시하기
API 이용 신청하기
네이버 API: 네이버 서비스를 코드로 이용할 수 있는 서비스
- https://developers.naver.com/docs/serviceapi/search/shopping/shopping.md 이동
- "오픈 API 이용 신청" 버튼 클릭 후 네이버 로그인 진행
- 애플리케이션 이름 - springboot / 비로그인 오픈 API 서비스 환경 - WEB 선택 후 http://localhost 입력
- Client ID, Client Secret 생성된 것 확인
API 사용해보기(ARC 이용)
네이버 쇼핑 API 설명 문서: https://developers.naver.com/docs/serviceapi/search/shopping/shopping.md
- <API 기본 정보> 에서 출력포맷이 JSON인 요청 URL을 복사 후 ARC의 URL에 붙여넣기(https://openapi.naver.com/v1/search/shop.json)
- header를 생성하여 Client ID 와 Client Secret 입력 (X-Naver-Client-Id: Client ID / X-Naver-Client-Secret: Client Secret)
- 주소 제일 마지막에 요청 변수를 활용하여 요청 추가 입력 후 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);
프로젝트 생성하기
- src > main > java > com.sparta.week04 에 utils 패키지 생성
- NaverShopSearch.java 파일 생성
public class NaverShopSearch { public String search() { } public static void main(String[] args) { NaverShopSearch naverShopSearch = new NaverShopSearch(); naverShopSearch.search(); }
- 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
요구 조건
- 검색어를 요구에 따라 변경
➡️ search 함수 변경 - public String search(String query) / naverShopSearch.search("검색어"); - 검색 결과를 문자열에서 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; } }
- ItemDto.java 파일 생성
키워드로 상품 검색 - 네이버 API와 서비스 연결
요구 조건
- 사용자가 검색어를 입력하면, 컨트롤러가 전달받음
- 전달받은 검색어로 네이버 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); } }
- 키워드로 상품 검색하고 그 결과를 목록으로 보여주는 기능 / GET 방식 API 요청