본문 바로가기

JAVA/- Spring

[Spring boot] Spring boot 에서 외부 Api(네이버 쇼핑Api) 사용해보기

프로잭트를 진행하다가 네이버 쇼핑 Api를 사용해야 하는 일이 생겼습니다.

그러면 프로젝트 안에서 네이버 서버에다가 Restful 하게 api 요청을 해야합니다. 

 

https://developers.naver.com/apps/#/list

여기가셔서 

Application 등록을 합니다.

 

다음에 애플리케이션 이름을 원하시는걸 넣으면 됩니다. 저는(Won_test)라고 넣었습니다.

사용 API를 잘 보셔야 하는데 저는 쇼핑 api를 사용할 꺼라 데이터랩(쇼핑인사이트)를 넣고 해봤습니다. 근데 자꾸 인증오류라고 떴습니다.

 

잘 찾아보니

검색 api라는 곳이 따로 있었습니다. 잘 확인하시길 바랍니다.

다음은 비로그인 오픈 api 서비스 환경을 설정합니다.

WEB 설정으로 한다음 http://localhost를 박아줍니다.

 

그리고 왼쪽 카테고리에 있는 내 애플리케이션에 애플리케이션 정보에 가줍시다.

Clinet ID와 Client Sercret 을 header에 박고 요청을 합니다.

 

일단 Postman으로 테스트 해보겠습니다.(Postman 다운받는곳)

X-Naver-Client-Id : 자신의 클라이언트Id

X-Naver-Client-Secret : 자신의 클라이언트 Secret 번호

2개를 넣어줍니다.

다음은 Params을 넣어줍니다. 이건 주소창에 넣어줘도 되지만 Post맨 창에서 넣어주겠습니다.

search 하고 싶은 문자열을 넣어줍니다. 

 

응답이 왔습니다

Json 형태로 왔습니다. items 배열안에 상품에 대한 정보들이 있습니다!

 

 

Java 코드로 요청하는 것을 개발해봅시다

@Data
@Builder
public class NaverRequestVariableDto {

    String query;
    Integer display;
    Integer start;
    String sort;

}

요청을 보낼 Dto 입니다.

NaverRequestVariableDto naverRequestVariableDto = NaverRequestVariableDto.builder()
        .query(third)
        .display(9)
        .start(1)
        .sort("sim")
        .build();

//네이버 쇼핑 물품 보내는 부분
List<NaverProductDto> naverProductDtos = naverProductService.naverShopSearchAPI(naverRequestVariableDto);
model.addAttribute("naverProductList", naverProductDtos);

Controller 단에서 Dto를 만들어서 service 단에 보냅니다. 

반환 받은 List 객체는 model을 통해 view 단으로 넘어가게 됩니다.

 

 

 

Java 코드로 응답받는 것을 개발해봅시다

service 단에서 응답을 받아서 원하는 데이터만 뽑아 내려고 합니다.

@Slf4j
@Service
public class NaverProductService {

    public List<NaverProductDto> naverShopSearchAPI(NaverRequestVariableDto naverVariable) {
        //참고 url: https://ssong915.tistory.com/36
        String url = "https://openapi.naver.com/";

        URI uri = UriComponentsBuilder.fromHttpUrl(url)
                .path("v1/search/shop.json")
                .queryParam("query", naverVariable.getQuery())
                .queryParam("display", naverVariable.getDisplay())
                .queryParam("start", naverVariable.getStart())
                .queryParam("sort", naverVariable.getSort())
                .encode()
                .build()
                .toUri();
        log.info("uri : {}", uri);
        RestTemplate restTemplate = new RestTemplate();

        RequestEntity<Void> req = RequestEntity
                .get(uri)
                .header("X-Naver-Client-Id", "ssssssssssssssssssw")
                .header("X-Naver-Client-Secret", "dddddddddd")
                .build();

        ResponseEntity<String> result = restTemplate.exchange(req, String.class);
        List<NaverProductDto> naverProductDtos = fromJSONtoNaverProduct(result.getBody());

        log.info("result ={}", naverProductDtos);
        return naverProductDtos;

    }
    private List<NaverProductDto> fromJSONtoNaverProduct(String result) {
        // 문자열 정보를 JSONObject로 바꾸기
        JSONObject rjson = new JSONObject(result);
        // JSONObject에서 items 배열 꺼내기
        // JSON 배열이기 때문에 보통 배열이랑 다르게 활용해야한다.
        JSONArray naverProducts = rjson.getJSONArray("items");
        List<NaverProductDto> naverProductDtoList = new ArrayList<>();
        for (int i = 0; i < naverProducts.length(); i++) {
            JSONObject naverProductsJson = (JSONObject) naverProducts.get(i);
            NaverProductDto itemDto = new NaverProductDto(naverProductsJson);
            naverProductDtoList.add(itemDto);
        }
        return naverProductDtoList;
    }

}

전체 코드 입니다.

 

@Getter
public class NaverProductDto {

    private String title;
    private String link;
    private String image;
    private Integer lprice;

    public NaverProductDto(JSONObject itemJson) {
        this.title = itemJson.getString("title");
        this.link = itemJson.getString("link");
        this.image = itemJson.getString("image");
        this.lprice = itemJson.getInt("lprice");
    }
}

응답으로 받은 Json을 객체로 처리해주는 Dto 입니다.

 

[Service 로직 흐름]

  • UriComponentsBuilder는 여러 개의 파라미터들을 연결하여 URL로 만들어 주는 기능을 가지고 있습니다. 
    • queryParam() 매서드로 필요한 파라미터들을 추가할 수 있습니다.
  • url을 구성했으니 이제 RestTamplate으로 요청을 보냅니다.
  • 여기서는 기존 url에 RequestEntity에다가 header를 추가해서 RequestEntity 자체를 exchange()에다가 보냅니다. 반환 타입은 String이 됩니다.
    • ResponseEntity<원하는 클래스 타입> resultMap = restTemplate.exchange(uri.toString(), HttpMethod.GET, entity, 원하는클래스타입.class);
      형태로 사용할 수 있습니다.
  • 받아온 json은 String으로 받았습니다. JSONObject로 바꾼다음에 items배열을 꺼내고 NaverProductDto에 넣습니다.
  • 그리고 List 형태로 반환이 됩니다.
728x90