일정 주기로 특정한 작업을 수행하는 것을 의미한다.
대략 1,600만건의 도서 데이터를 정보나루에서 수집한 후에, 각각의 상세 데이터를 OPEN API를 활용하여 수집하기 위해 ISBN을 활용하게 되는 작업을 하게 되었다.
Spring Boot starter에 기본적으로 제공되어 따로 의존성 주입이 필요하지 않으며 @EnableScheduling 어노테이션을 추가한다.
Scheduler로 사용할 method에 @Scheduled 어노테이션을 추가한다.
사용자가 적은 새벽 시간을 이용하기 위해 cron을 활용하여 새벽시간을 지정하였다.
가지고 있는 데이터의 ISBN을 가지고 정보나루 데이터를 수집해야 했다. 그리고 대략 1건당 1초의 시간이 소요되었다. 그렇기에 가지고 있는 ISBN을 중복되지 않게 조회하는 로직이 필요하다.
하루간의 작업이 끝난 후에, 마지막 ISBN을 조회하여 그 다음부터 OPEN API를 활용하여 데이터를 수집해야 한다.
isbnList = bookTaskRepository.findTopByOrderByIsbnDesc();
deatilMinIsbn = bookDetailTaskRepository.findTop1ByOrderByIsbnAsc().getIsbn();
isbnList = bookTaskRepository.findTopByIsbnLessThanOrderByIsbnDesc(deatilMinIsbn);
데이터의 무결성이 훼손된 경우가 많아 올바른 데이터를 수집해야 한다.
상세 데이터의 description과 thumbnail을 수집하기 위함이었는데, 데이터가 NULL 인 경우가 종종 발생하였다.
데이터에 에러가 있는 경우에는 error 태그를 활용하여 수집 자체를 하지 않았으며, 그렇지 않은 경우에는 thumbnail 혹은 description의 데이터가 하나만 존재하는 경우이므로, 우선적으로 데이터를 삽입 하고 추후 다른 Spring Scheduler method를 활용하여 수집한 데이터가 NULL인 경우에도 삭제하는 작업을 수행하였다.
마지막 혹은 마지막에서 여러개의 데이터가 잘못됐을 경우, 모두 삭제를 할 경우에는 중복되게 OPEN API를 활용해야 하므로 상세 데이터의 마지막 데이터는 NULL일 경우에도 삭제하지 않았다.
@Query("SELECT b.isbn FROM BookDetails b WHERE (b.description IS NULL or b.thumbnail IS NULL) AND b.isbn > :minimumIsbn")
List<Long> findIsbnExceptMinimun(Long minimumIsbn);
@Query("delete from BookDetails b where b.isbn in :isbnList")
void deleteAllByIsbnIn(List<Long> isbnList);
목표를 이루었던 Spring Scheduler를 활용하게 되었다. OPEN API를 주기적으로 활용하는 방법에 대해 처음으로 생각해보고 구현 해내는 과정이 되었었다. Spring Scheduler를 활용 한다면 다른 무수한 기능을 구현할 수 있을 것이라고 생각한다. Spring Scheduler를 활용하면서 Spring batch에 대해 인지하게 되었는데 제대로 된 이해가 되지 않는다. Spring Scheduler도 그렇지만 Spring batch에 대해서 새로운 공부가 필요하다고 느낀다.