일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 백준
- 카카오
- 솝트 후기
- 페이지네이션
- Java
- 합격후기
- nodejs
- 사물인식
- 절차지향
- 면접전형
- MongoDB
- 멋사
- CRUD
- objectdetection
- 서류전형
- 파이썬 #백준 #BFS
- spring-boot
- 프로그래머스
- Python
- jQuery
- AWS
- 파이썬
- EC2
- jwt
- 멋쟁이사자처럼
- 솝트
- 피로그래밍
- S3
- yolov5
- 인공지능
- Today
- Total
찔끔찔끔씩😎
[웹개발의 봄, Spring] 4주차 (1) - 네이버 쇼핑 API 이용하기 본문
기본기의 중요성
개발의 핵심으로는 분업과 느슨한 결합이 있다.
분업하여 각자가 맡은 바에 책임을 다하면 기능은 온전히 작동외며, 느슨한 결합으로 유연성과 확장성을 가질 수 있다.
1. 3계층 숙달 (Controller, Service, Repository)
3계층은 이를 대표하는 예시로 스프링이 잘 돌아가게 해주는 척추라고 할 수 있다.
2. API handling
또 다른 예로 API가 있다. 세상에 이미 많이 존재하는 API들을 잘 다루면 서비스를 더 많이, 더 빠르게 만들 수 있다.
내가 API의 내부 로직이 어떻게 짜여졌는지 모르는 상황에서도, 공식 문서에 나온 정해진 약속대로 요구를 하면 정해진 결과를 받을 수 있다. 따라서 API의 내부 로직이 아닌, 사용할 줄 아는 것이 중요하다.
위 두가지에 집중하여 <나만의 셀렉샵>을 만들어 보도록할 것!
요구 기능은 아래와 같다.
- 상품명에 따른 검색
- 관심 상품 등록 & 조회
- 관심 상품에 대한 최저가 등록하기
아래 주소에서 결과물을 미리 확인할 수 있다.
http://spring.spartacodingclub.kr/
네이버 쇼핑 API 이용하기
🔎 API 이용 신청하기
네이버 API: 네이버 서비스를 코드로 이용할 수 있는 서비스
- https://developers.naver.com/docs/search/shopping/에 접속한다.
- "오픈 API 이용 신청" 버튼을 클릭한다.
- 다음과 같이 입력한 뒤 "등록하기".
- 애플리케이션 이름 - springboot
- 비로그인 오픈 API 서비스 환경 - WEB 선택 후 http://localhost 입력
4. Client ID, Client Secret 이 생성된 것을 확인한다.
🔎 API 이용 사용해보기
네이버 쇼핑 검색 API에 대한 설명은 https://developers.naver.com/docs/search/shopping/에 나와있다.
JSON 형식으로 데이터를 받고싶다면, https://openapi.naver.com/v1/search/shop.json에 GET 방식으로 요청을 보내면 된다.
요청 변수를 활용하여 원하는 문자열이나 출력형태 등을 담아 요청을 보낸다.
결과는 JSON 형태로 전달되어 출력된다.
요청을 보낼 때는 발급받은 Client ID와 Client Secret 정보를 함께 넘겨줘야 한다.
검색 성공!
🔎 자바코드로 API 이용하기
ARC에서 요청 Method, URL, Header(Client ID, Client Secret 포함) 정보를 입력하면 해당 요청의 스프링 코드를 확인할 수 있다.
🔎 Naver Shop Search
위에서 받은 코드를 사용하여 프로젝트를 만들어 보자.
- 프로젝트에 utils 패키지를 만든다.
- utils 패키지 안에 NaverShopSearch 클래스를 생성한다.
- public으로 search 함수를 만들고 위 코드를 붙여넣는다.
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 = 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();
}
}
🔎 Item DTO
검색 결과를 문자열이 아닌, ItemDto로 받고 싶다.
ItemDto는 검색 결과로 오는 상품들에 대한 데이터를 물고 다니는 객체이다. ItemDto 클래스는 다음과 같다.
@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");
}
}
NaverShopSearch를 통해서 받아온 response를 ItemDto로 바꾸기 위해선 다음 과정이 필요하다.
- 문자열 정보를 JSONObject로 바꾸기
- JSONObject에서 items 배열 꺼내기
- items 배열이 담긴 JSONArray의 원소를 하나씩 JSONObject로 받기
- 받은 JSONObject로 ItemDto 생성 하기
JSONObject와 JSONArray를 처리하기 위해 https://mvnrepository.com/에서 JSON In Java 라이브러리를 gradle의 dependencies에 추가해야 한다.
그 다음, NaverShopSearch에 fromJSONtoItems 함수를 추가한다.
public List<ItemDto> fromJSONtoItems(String result){
// 문자열 정보를 JSONObject로 바꾸기
JSONObject rjson = new JSONObject(result);
System.out.println(rjson);
// JSONObject에서 items 배열 꺼내기
// JSON 배열이기 때문에 보통 배열이랑 다르게 활용해야한다.
JSONArray items = rjson.getJSONArray("items");
List<ItemDto> itemDtoList = new ArrayList<>();
for (int i=0; i<items.length(); i++) {
JSONObject itemJson = (JSONObject) items.get(i);
ItemDto itemDto = new ItemDto(itemJson);
itemDtoList.add(itemDto);
// // item 중에서 필요한 항목만 꺼내기
// String title = itemJson.getString("title");
// String image = itemJson.getString("image");
// String link = itemJson.getString("link");
// int lprice = itemJson.getInt("lprice");
}
return itemDtoList;
🔎 Search Request Controller
남은 점이 더 있다! 🤔
NaverShopSearch를 사용하기 위해 매우 중요한 작업이 남았다. 프로젝트 요구 조건은 다음과 같다.
- 사용자가 검색어를 입력하면 컨트롤러가 그것을 전달 받는다.
- 전달받은 검색어로 네이버 API에 요청하고, 그 결과를 사용자에게 응답한다.
따라서 Controller가 NaverShopSearch를 사용할 수 있어야 한다. 사용자가 요청을 하면 NaverShopSearch 클래스를 자동으로 만들어 주면 정말 정말 좋을 텐데... 이게 스프링에서는 가능하다..! 스프링이 자동으로 필요한 클래스를 필요한 곳에 생성하도록 하려면 "목록"에 해당 클래스를 넣어주면 된다. 그 목록에 등록하는 간단한 방법이 바로 컴포넌트 등록이다.
NaverShopSearch 컴포넌트로 등록
- 컴포넌트: 스프링에게 필요할 때 갖다써라 권한을 주는 것
- 앞에서 만들어준 NaverShopSearch에 @Component를 선언해주면 끝!
클래스 앞에 @Component를 붙여주기만 하면 된다.
@Component // @RequiredArgsConstructor 와 함께 사용할 경우 스프링이 자동으로 생성
public class NaverShopSearch {
그렇다면 이제 남은 것은 사용자의 요청을 받을 Controller를 만드는 것이다.
검색 함수를 다 만들었기 때문에 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);
}
}
이로써 <나만의 셀렉샵>의 첫번째 요구 기능을 완성했다!!
상품명에 따른 검색- 관심 상품 등록, 조회
- 관심 상품에 대한 최저가 등록, 조회
'Server > Spring' 카테고리의 다른 글
[웹개발의 봄, Spring] 4주차 (3) - <나만의 셀렉샵> 클라이언트 (0) | 2022.04.11 |
---|---|
[웹개발의 봄, Spring] 4주차 (2) - <나만의 셀렉샵> 서버 (0) | 2022.04.11 |
[Spring] spring jpa localtime between (0) | 2022.03.22 |
[웹개발의 봄, Spring] 3주차 (3) - 타임라인 서비스 클라이언트 완성하기 (0) | 2022.03.22 |
[웹개발의 봄, Spring] 3주차 (2) - javascript, jQuery 기초 (0) | 2022.03.19 |