웹개발의 봄, Spring 강의를 통해 웹의 기본 구조를 배우고 간단한 서비스를 구현
네이버 검색 API를 통해서 셀렉샵 구현
http://spring.spartacodingclub.kr/
스프링의 핵심, 3계층 숙달, API handling
기본기란 익히면 익힐수록 흘러가는 것이 아니라 누적되고, 다른 기술을 익히기 쉽도록 도와주는 것입니다.
스프링, 개발의 핵심은 분업과 느슨한 결합 3계층은 분업과 느슨한 결합의 대표적인 예시이자, 스프링이 돌아가게 만드는 척추역할을 한다. 역할과 구현을 분리해서 개발하는 객체지향의 목표와 부합한다.
스프링의 진짜 핵심
스프링은 자바 언어 기반의 프레임워크
자바 언어의 가장 큰 특징 : '객체 지향 언어'스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
세상에는 다양한 API가 있다. API를 잘 다루면 나만의 서비스를 더 많이, 더 빠르게 만들 수 있고 개발자로서 성장할 수 있다.
또한, 앞에서 말씀드린 느슨한 결합의 대표적인 예시가 바로 API 우리가 이용할 네이버 검색 API의 내부 로직이 어떻게 되든 상관없이, 우리는 정해진 약속대로 요구하면 정해진 결과를 받을 수 있다.
public class NaverShopSearch {
public String search() {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "8Fr7ih9omHfHYfK4p6d7");
headers.add("X-Naver-Client-Secret", "ibTu_4BcWc");
String body = "";
HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?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();
}
}
결과
{
"lastBuildDate": "Tue, 07 Sep 2021 08:35:29 +0900",
"total": 4882053,
"start": 1,
"display": 10,
"items": [
{
"title": "<b>아디다스</b> 우먼 클래식 윈드브레이커 GN2780",
"link": "https://search.shopping.naver.com/gate.nhn?id=26663369942",
"image": "https://shopping-phinf.pstatic.net/main_2666336/26663369942.20210423111903.jpg",
"lprice": "52000",
"hprice": "",
"mallName": "네이버",
"productId": "26663369942",
"productType": "1",
"brand": "아디다스",
"maker": "아디다스",
"category1": "패션의류",
"category2": "여성의류",
"category3": "재킷",
"category4": ""
},
{
"title": "<b>아디다스</b> 알파바운스 BB슬라이드 BA8775",
"link": "https://search.shopping.naver.com/gate.nhn?id=24457175865",
"image": "https://shopping-phinf.pstatic.net/main_2445717/24457175865.20201014195220.jpg",
"lprice": "15790",
"hprice": "",
"mallName": "네이버",
"productId": "24457175865",
"productType": "1",
"brand": "아디다스",
"maker": "아디다스",
"category1": "패션잡화",
"category2": "남성신발",
"category3": "슬리퍼",
"category4": ""
}
]
}
JSONObject를 이용한 문자열 핸들링
NaverShopSearch.java
public String search(String query) {...
https://mvnrepository.com/artifact/org.json/json
JSONObject rjson = new JSONObject(result);
JSONArray items = rjson.getJSONArray("items");
// for문 돌면서 ItemDto에 넣을 itemJson 뽑기
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);
}
@Component
public class NaverShopSearch {
public String search(String query) {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "zdqMoIkFaK8uKvC2oNY2");
headers.add("X-Naver-Client-Secret", "LiZfsgtuD5");
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> ret = new ArrayList<>();
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;
}
Bean에 등록해주기 위해서 @Component 어노테이션 붙여주자
기능 | METHOD | URL | RETURN |
---|---|---|---|
키워드로 상품 검색하고 결과목록으로 보여주기 | GET | /api/search?query=검색어 | List<ItemDto> |
관심 상품 등록하기 | POST | /api/products | Product |
관심 상품 조회하기 | GET | /api/products | List<Product> |
관심 상품에 관심 가격 등록하고, 그 가격보다 낮은 경우 표시하기 | PUT | /api/products/{id} | id |
Controller
Service
Repository
여기서 DB에 저장되는 녀석은 Product 뿐이라는 점!
계속 반복해서 만들어보기