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 리스트로 변환해 반환한다.