본문 바로가기
🍃SpringFrameworks/SpringBoot

[SpringBoot] NaverAPI - RestaurantProject

by inbeom 2023. 8. 20.
728x90

Naver 지역 API정보

검색 > 지역 - Search API

내 애플리케이션 (Id, Secret)

애플리케이션 - NAVER Developers


 

NaverAPI 연동하기!

  • application.properties 파일을 yaml파일로 변경하여 사용 (가독성이 좋아 최근 많이 사용)
naver:
	url:
		search:
			local: <https://openapi.naver.com/v1/search/blog.json>
			image: <https://openapi.naver.com/v1/search/image>
	client:
		id: ?????????? <- 애플리케이션 id
		secret: ??????? <- 애플리케이션 Secret

 

💡 API-Client

@Component
public class NaverClient {

	@Value("${[naver.client.id](<http://naver.client.id/>)}") // application.yaml파일의 값을 가져옴.
	private String naverClientId;

	@Value("${naver.client.secret}")
	private String naverClientSecret;

	@Value("${naver.url.search.local}")
	private String naverLocalSearchUrl;

	@Value("${naver.url.search.image}")
	private String naverImageSearchUrl;

	// 장소 검색
	public SearchLocalRes searchLocal(SearchLocalReq searchLocalReq) {
		// API로 요청 보낼 Uri만들기
		var uri = UriComponentsBuilder.fromUriString(naverLocalSearchUrl)
			.queryParams(searchLocalReq.toMultivalueMap())
			.build()
			.encode()
			.toUri();
		// 헤더 세팅
		var headers = new HttpHeaders();
		headers.set("X-Naver-Client-Id", naverClientId);
		headers.set("X-Naver-Client-Secret", naverClientSecret);
		headers.setContentType(MediaType.APPLICATION_JSON);
		// 헤더를 담음
		var httpEntity = new HttpEntity<>(headers);
		// 응답받을 타입(res)지정
		var responseType = new ParameterizedTypeReference(){};
		// api 값 받아와 responseEntity에 저장
		var responseEntity = new RestTemplate().exchange(
			uri,
			HttpMethod.GET,
			httpEntity,
			responseType
		);
		return responseEntity.getBody();
	}

	// 이미지 검색
	public SearchImageRes searchImage(SearchImageReq searchImageReq) {
		// API로 요청 보낼 Uri만들기
    var uri = UriComponentsBuilder.fromUriString(naverImageSearchUrl)
            .queryParams(searchImageReq.toMultivalueMap())
            .build()
            .encode()
            .toUri();
    // 헤더 세팅
    var headers = new HttpHeaders();
    headers.set("X-Naver-Client-Id", naverClientId);
    headers.set("X-Naver-Client-Secret", naverClientSecret);
    headers.setContentType(MediaType.APPLICATION_JSON);
    // 헤더를 담음
    var httpEntity = new HttpEntity<>(headers);
    // 응답받을 타입(res)지정
    var responseType = new ParameterizedTypeReference(){};
    // api 값 받아와 responseEntity에 저장
    var responseEntity = new RestTemplate().exchange(
            uri,
            HttpMethod.GET,
            httpEntity,
            responseType
    );
    return responseEntity.getBody();
	}
}

 

💡 Service

@Service
@RequiredArgsConstructor
public class WishListService {

	private final NaverClient naverClient;

	public WishListDto search(String query){

		// 지역검색
		var searchLocalReq = new SearchLocalReq();
		searchLocalReq.setQuery(query);

		var searchLocalRes = naverClient.searchLocal(searchLocalReq); // searchLocal() 호출하여 searchLocalRes응답 받음

		if(searchLocalRes.getTotal() > 0){ // 지역 검색 결과가 있다면 실행
			var localItem = searchLocalRes.getItems().stream().findFirst().get();

			var imageQuery = localItem.getTitle().replaceAll("<[^>]*>",""); // 괄호 제거 정규식
			var searchImageReq = new SearchImageReq();
			searchImageReq.setQuery(imageQuery);

			// 이미지 검색
			var searchImageRes = naverClient.searchImage(searchImageReq); // searchImage() 호출하여 searchImageRes응답 받음
	
			if(searchImageRes.getTotal() > 0){ // 이미지 검색 결과가 있다면 실행
				var imageItem = searchImageRes.getItems().stream().findFirst().get();
	
				// 결과를 리턴
				var result = new WishListDto();
				result.setTitle(localItem.getTitle());
				result.setCategory(localItem.getCategory());
				result.setAddress(localItem.getAddress());
				result.setRoadAddress(localItem.getRoadAddress());
				result.setHomePageLink(localItem.getLink());
				result.setImageLink(imageItem.getLink());

				return result;
			}
		}
		return new WishListDto(); // 검색결과가 없으면 빈값 리턴
	}
}

 

💡 Controller

@Slf4j
@RestController
@RequestMapping("/api/restaurant")
@RequiredArgsConstructor
public class ApiController {

	private final WishListService wishListService;

	@GetMapping("/search")
	public WishListDto search(@RequestParam String query) {
		return wishListService.search(query);
	}

}
728x90