이전 포스팅에서는 WebClient를 사용하여 1번째 페이지에 해당하는 데이터를 조회하고 DB에 저장하는 과정을 수행했다. 이번에는 모든 데이터를 저장하기 위해 전체 페이지 수를 계산하고 반복문을 통해 모든 데이터를 조회하려고 한다.
1. 응답 데이터에서 필요한 값 파싱하기
String pharmacyInfo = webClient.get()
.uri(uriBuilder -> uriBuilder
.path(PHARMACY_ENDPOINT)
.queryParam("serviceKey", PHARMACY_API_KEY)
.queryParam("_type", "json")
.build())
.retrieve()
.bodyToMono(String.class)
.block();
JSONParser parser = new JSONParser();
JSONObject jsonObject = (JSONObject) parser.parse(pharmacyInfo);
JSONObject response = (JSONObject) jsonObject.get("response");
JSONObject body = (JSONObject) response.get("body");
int totalCount = ((Long) body.get("totalCount")).intValue();
int numOfRows = ((Long) body.get("numOfRows")).intValue();
int totalPage = (int) Math.ceil(totalCount / numOfRows);
이전과 같이 WebClient를 통해 첫 번째 페이지의 데이터를 조회한다.
이후 응답 데이터에 존재하는 totalCount와 numOfRows 값을 파싱하여 전체 페이지 수(totalPage)를 구한다.
2. 반복문을 통해 모든 데이터 조회 후 저장
for (int i = 1; i <= totalPage; i++) {
int pageNo = i;
PharmacyItems pharmacyItems = webClient.get()
.uri(uriBuilder -> uriBuilder
.path(PHARMACY_ENDPOINT)
.queryParam("serviceKey", PHARMACY_API_KEY)
.queryParam("_type", "json")
.queryParam("pageNo", pageNo)
.build())
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(PharmacyItems.class)
.retry(3)
.block();
try {
pharmacyItems.getPharmacyItems().forEach(item -> {
Pharmacy pharmacy = item.toEntity();
pharmacyRepository.save(pharmacy);
});
} catch (DataIntegrityViolationException e) {
}
log.info("pageNo: {} :: hospitalItems: {}", i, pharmacyItems);
}
totalPage만큼 for문을 반복하고 i를 페이지 넘버로 지정하여 데이터를 조회한다.
조회한 데이터를 엔티티로 변환하고 DB에 저장한다.
'Framework > Spring' 카테고리의 다른 글
[SpringBoot] 다중 DB 구성하기 (0) | 2024.05.11 |
---|---|
[SpringBoot] @Async로 비동기 처리하기 (0) | 2024.04.18 |
[SpringBoot] 외부 API 호출하기(1) (2) | 2024.04.18 |
[SpringBoot] MockMvc로 Multipart() 테스트 코드 작성하기 (1) | 2024.02.15 |
이전 포스팅에서는 WebClient를 사용하여 1번째 페이지에 해당하는 데이터를 조회하고 DB에 저장하는 과정을 수행했다. 이번에는 모든 데이터를 저장하기 위해 전체 페이지 수를 계산하고 반복문을 통해 모든 데이터를 조회하려고 한다.
1. 응답 데이터에서 필요한 값 파싱하기
String pharmacyInfo = webClient.get()
.uri(uriBuilder -> uriBuilder
.path(PHARMACY_ENDPOINT)
.queryParam("serviceKey", PHARMACY_API_KEY)
.queryParam("_type", "json")
.build())
.retrieve()
.bodyToMono(String.class)
.block();
JSONParser parser = new JSONParser();
JSONObject jsonObject = (JSONObject) parser.parse(pharmacyInfo);
JSONObject response = (JSONObject) jsonObject.get("response");
JSONObject body = (JSONObject) response.get("body");
int totalCount = ((Long) body.get("totalCount")).intValue();
int numOfRows = ((Long) body.get("numOfRows")).intValue();
int totalPage = (int) Math.ceil(totalCount / numOfRows);
이전과 같이 WebClient를 통해 첫 번째 페이지의 데이터를 조회한다.
이후 응답 데이터에 존재하는 totalCount와 numOfRows 값을 파싱하여 전체 페이지 수(totalPage)를 구한다.
2. 반복문을 통해 모든 데이터 조회 후 저장
for (int i = 1; i <= totalPage; i++) {
int pageNo = i;
PharmacyItems pharmacyItems = webClient.get()
.uri(uriBuilder -> uriBuilder
.path(PHARMACY_ENDPOINT)
.queryParam("serviceKey", PHARMACY_API_KEY)
.queryParam("_type", "json")
.queryParam("pageNo", pageNo)
.build())
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(PharmacyItems.class)
.retry(3)
.block();
try {
pharmacyItems.getPharmacyItems().forEach(item -> {
Pharmacy pharmacy = item.toEntity();
pharmacyRepository.save(pharmacy);
});
} catch (DataIntegrityViolationException e) {
}
log.info("pageNo: {} :: hospitalItems: {}", i, pharmacyItems);
}
totalPage만큼 for문을 반복하고 i를 페이지 넘버로 지정하여 데이터를 조회한다.
조회한 데이터를 엔티티로 변환하고 DB에 저장한다.
'Framework > Spring' 카테고리의 다른 글
[SpringBoot] 다중 DB 구성하기 (0) | 2024.05.11 |
---|---|
[SpringBoot] @Async로 비동기 처리하기 (0) | 2024.04.18 |
[SpringBoot] 외부 API 호출하기(1) (2) | 2024.04.18 |
[SpringBoot] MockMvc로 Multipart() 테스트 코드 작성하기 (1) | 2024.02.15 |