728x90
반응형
Naver 지역 API정보
내 애플리케이션 (Id, Secret)
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
반응형
'🍃SpringFramework > SpringBoot' 카테고리의 다른 글
[SpringBoot] @Annotation 정리 (0) | 2023.08.20 |
---|---|
[SpringBoot] 주요 개념 정리 (0) | 2023.08.20 |
[SpringBoot] 07. Server to Server (0) | 2023.08.20 |
[SpringBoot] 06. Spring 기능 활용 (0) | 2023.08.20 |
[SpringBoot] 05. Spring 핵심 (0) | 2023.08.20 |