[스파르타코딩클럽] 웹개발의 봄, Spring 4주차

MOON·2021년 9월 6일
0
post-thumbnail

웹개발의 봄, Spring 4주차

💡기대하는 것

웹개발의 봄, Spring 강의를 통해 웹의 기본 구조를 배우고 간단한 서비스를 구현
네이버 검색 API를 통해서 셀렉샵 구현

📝배운것

  • Controller, Service, Repository 반복 연습
  • 자바를 이용해 네이버 API 연동
  • JSONObject 를 통해 json을 핸들링
  • 스프링 스케줄러 사용
  • 나만의 셀렉샵 구현
    http://spring.spartacodingclub.kr/


✏️기본기

스프링의 핵심, 3계층 숙달, API handling

기본기란 익히면 익힐수록 흘러가는 것이 아니라 누적되고, 다른 기술을 익히기 쉽도록 도와주는 것입니다.

3계층 숙달

스프링, 개발의 핵심은 분업과 느슨한 결합 3계층은 분업과 느슨한 결합의 대표적인 예시이자, 스프링이 돌아가게 만드는 척추역할을 한다. 역할과 구현을 분리해서 개발하는 객체지향의 목표와 부합한다.

스프링의 진짜 핵심
스프링은 자바 언어 기반의 프레임워크
자바 언어의 가장 큰 특징 : '객체 지향 언어'

스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크

API handling

세상에는 다양한 API가 있다. API를 잘 다루면 나만의 서비스를 더 많이, 더 빠르게 만들 수 있고 개발자로서 성장할 수 있다.
또한, 앞에서 말씀드린 느슨한 결합의 대표적인 예시가 바로 API 우리가 이용할 네이버 검색 API의 내부 로직이 어떻게 되든 상관없이, 우리는 정해진 약속대로 요구하면 정해진 결과를 받을 수 있다.

3계층 역할 리마인드

  • Controller 는 제일 바깥 쪽에서 요청을 받고, 응답을 되돌려주는 역할을 합니다.
  • Service 는 중간에서 구체적인 작업 순서를 결정하고요.
  • Repository 는 DB와 직접 소통함으로써 자료를 생성하고, 조회하고, 변경하고, 삭제합니다.
  • 그리고 각 레이어 간에는 절대 Entity를 직접 사용하지 않고, DTO 라는 택배상자를 만들어 사용합니다.

✏️네이버 API 사용

네이버 API 목록

ARC를 통해 자바 코드 얻기

자바코드로 실행

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사용

JSONObject를 이용한 문자열 핸들링

검색어 넣을 수 있는 파라미터 생성

NaverShopSearch.java

public String search(String query) {...

org.json 라이브러리 추가 -> Build.gradle

https://mvnrepository.com/artifact/org.json/json

문자열 정보를 JSONObject로 바꾸기

JSONObject rjson = new JSONObject(result);

JSONObject에서 items 배열 꺼내기

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);
        }

fromJSONtoItems 메소드 구현

@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 어노테이션 붙여주자

✏️나만의 셀렉샵 구현

요구사항 확인

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

API 설계

기능METHODURLRETURN
키워드로 상품 검색하고 결과목록으로 보여주기GET/api/search?query=검색어List<ItemDto>
관심 상품 등록하기POST/api/productsProduct
관심 상품 조회하기GET/api/productsList<Product>
관심 상품에 관심 가격 등록하고, 그 가격보다 낮은 경우 표시하기PUT/api/products/{id}id

3계층 구현

  • Controller

    • ProductRestController: 관심 상품 관련 컨트롤러
    • SearchRequestController: 검색 관련 컨트롤러
  • Service

    • ProductService: 관심 상품 가격 변경
  • Repository

    여기서 DB에 저장되는 녀석은 Product 뿐이라는 점!

    • Product: 관심 상품 테이블
    • ProductRepository: 관심 상품 조회, 저장
    • ProductRequestDto: 관심 상품 등록하기
    • ProductMypriceRequestDto: 관심 가격 변경하기
    • ItemDto: 검색 결과 주고받기

✏️마무리

계속 반복해서 만들어보기

0개의 댓글