인:향 - 네이버 향수 검색 api 구현

김준석·2023년 11월 28일
0

향수 추천 서비스

목록 보기
17/21
post-thumbnail

추천 향수 제공 뿐만 아니라 포털사이트의 여러 게시글을 통해 향수에 대한 정보를 더 얻기 쉽게 하기 위해서 구현을 하였습니다.

네이버 검색 API


네이버 검색 API는 비로그인 방식이기 때문에 Header만 설정해주면 돼서 구현이 쉽습니다.

친절하게 설명이 나와있으니 보고 따라서 애플리케이션을 등록하면 됩니다. 저는 현재 서버를 닫은 상태라 웹 서비스 url을 localhost로 설정하였습니다.


요청 URL에 따라 JSON으로 응답받을 지 XML으로 응답 받을지 선택할 수 있습니다. 저는 JSON을 선택하였습니다.

  • query : UTF-8로 인코딩해서 전달해야 합니다. String의 getBytes()를 사용하였습니다.
  • display : 검색 결과 갯수입니다. 주로 쓰는 기능이 아니다보니 10개로 표시하기로 결정하였습니다.
  • sort : 정확도순 날짜 순으로 정렬할 수 있습니다. 정확도가 더 중요하다고 생각되어 정확도로 sort하였습니다.


친절하게 예시가 나와있습니다!!

구현

@Service
public class SearchService {

    @Value("${naver.clientId}")
    private String clientId;
    @Value("${naver.apiKey}")
    private String secretKey;

    public HttpEntity<HttpHeaders> generateRequestEntity() {
        HttpHeaders httpHeaders = new HttpHeaders();

        httpHeaders.add(Search.CLIENT_ID.getValue(), clientId);
        httpHeaders.add(Search.API_KEY.getValue(), secretKey);

        return new HttpEntity<>(httpHeaders);
    }

    public String generateQueryMessage(String perfumeName) {
        final String query = new String(perfumeName.getBytes(StandardCharsets.UTF_8));
        return Search.API_URL.getValue() + query + Search.DISPLAY.getValue() + Search.SORT.getValue();
    }
}

clientId와 secretKey는 공개되면 안되니 반드시 감춰주시면 됩니다..! Header만 설정하면 돼서 HttpEntity에 Header를 담아주었습니다.
향수 이름으로 검색할 것이기 때문에 쿼리 메세지 생성에 perfumeName을 담아주었습니다.

@RestController
@RequestMapping("/perfume")
public class SearchController {

    private final SearchService searchService;

    public SearchController(SearchService searchService) {
        this.searchService = searchService;
    }
    
    @GetMapping("/search")
    public ResponseEntity<String> searchPerfumeInformation(@RequestParam("perfumeName") String perfumeName) {

        return new RestTemplate()
                .exchange(searchService.generateQueryMessage(perfumeName), HttpMethod.GET,
                        searchService.generateRequestEntity(), String.class);
    }
}

카카오 로그인때 했던 방식과 똑같이 RestTemplate을 활용하여 요청을 보냈습니다.

응답 결과

굳굳!

profile
기록하면서 성장하기!

0개의 댓글