Spring

[SpringBoot] NaverOpen API 사용

codi-3 2024. 8. 29. 15:58

🔑 API 키 발급

네이버 API를 사용할려면 Client-Id 와 Client-Secret 키를 받아야 한다. 키를 받으려면 먼저 Naver Developers에 들어가 로그인을 한뒤, 애플리케이션 등록을 클릭해주면된다.

 

애플리케이션 등록 창에서는 본인의 에플리케이션 이름 (프로젝트 명) 을 적어준뒤 사용할 API 와 서비스 환경을 지정해주면된다. SpringBoot 에서는 서비스환경에 Web환경을 설정한뒤 배포를 하지않은 LocalHost에서 활용을할 예정이라 URL에 본인의 LocalHost를 등록해주면된다.

등록을 마치고나면 Naver Open Api 를 사용할수있는 Clinet-Id 와 Client-Secret 값들을 받아 올수있다. 이값들은 Naver Open API 서버와 통신을 할떄 http request 중  Header 부분의 알맞는 키 이름과 키값을 등록해주워 원하는 데이터를 받아올수있다.

 


🚀 Naver Open Api 활용 코드

 

@Slf4j(topic = "NAVER API") // 로그를 출력하기 위한 Lombok 애너테이션, "NAVER API"라는 토픽을 사용
@Service // Spring의 서비스 클래스임을 나타내는 애너테이션, 비즈니스 로직을 처리하는 클래스임을 의미
public class NaverApiService {

    // RestTemplate 인스턴스, HTTP 요청을 보내기 위해 사용
    private final RestTemplate restTemplate;

    // 애플리케이션의 properties 파일에서 clientId 값을 주입받음
    @Value("${social.naver.params.clientId}")
    private String clientId;

    // 애플리케이션의 properties 파일에서 clientSecret 값을 주입받음
    @Value("${social.naver.params.clientSecret}")
    private String clientSecret;

    // RestTemplateBuilder를 이용해 RestTemplate을 초기화하는 생성자
    public NaverApiService(RestTemplateBuilder builder) {
        this.restTemplate = builder.build();
    }

    // Naver API를 통해 아이템을 검색하는 메서드
    public List<ItemDto> searchItems(String query) {
        // 요청할 URL을 만들기 위한 URI 구성
        URI uri = UriComponentsBuilder
                .fromUriString("https://openapi.naver.com") // 기본 URL 설정
                .path("/v1/search/shop.json") // 특정 API 엔드포인트 지정
                .queryParam("display", 15) // 검색 결과로 15개의 아이템을 표시하도록 설정
                .queryParam("query", query) // 검색 쿼리 파라미터 추가
                .encode() // URI 인코딩
                .build() // URI 생성
                .toUri();
        log.info("uri = " + uri); // 생성된 URI를 로그로 출력

        // GET 요청을 만들기 위한 RequestEntity 생성
        RequestEntity<Void> requestEntity = RequestEntity
                .get(uri) // HTTP GET 메서드 설정
                .header("X-Naver-Client-Id", clientId) // 요청 헤더에 Client ID 추가
                .header("X-Naver-Client-Secret", clientSecret) // 요청 헤더에 Client Secret 추가
                .build(); // RequestEntity 빌드

        // Naver API에 요청을 보내고, 응답을 ResponseEntity로 받음
        ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);

        // 응답 상태 코드를 로그로 출력
        log.info("NAVER API Status Code : " + responseEntity.getStatusCode());

        // 응답 바디(JSON 문자열)를 ItemDto 리스트로 변환하여 반환
        return fromJSONtoItems(responseEntity.getBody());
    }

    // JSON 응답을 ItemDto 객체의 리스트로 변환하는 메서드
    public List<ItemDto> fromJSONtoItems(String responseEntity) {
        JSONObject jsonObject = new JSONObject(responseEntity); // JSON 응답을 JSONObject로 변환
        JSONArray items  = jsonObject.getJSONArray("items"); // "items" 배열을 추출
        List<ItemDto> itemDtoList = new ArrayList<>(); // ItemDto 객체 리스트 초기화

        // JSONArray의 각 아이템을 ItemDto 객체로 변환하여 리스트에 추가
        for (Object item : items) {
            ItemDto itemDto = new ItemDto((JSONObject) item);
            itemDtoList.add(itemDto);
        }

        // 변환된 ItemDto 리스트 반환
        return itemDtoList;
    }
}

 

  • NaverApiService 클래스는 Naver의 쇼핑 검색 API와 통신하여 검색 결과를 받아오고, 이를 ItemDto 객체 리스트로 변환한다.
  • RestTemplate을 사용하여 HTTP 요청을 보내며, **clientId**와 **clientSecret**은 properties 파일에서 주입된다.
  • searchItems 메서드는 검색 쿼리를 받아 Naver API에 요청을 보내고, JSON 응답을 받아 ItemDto 리스트로 변환해 반환한다.