Spring Scheduler

Ahn yi·2022년 11월 23일

spring

목록 보기
10/11

Spring Scheduler

일정 주기로 특정한 작업을 수행하는 것을 의미한다.

Spring Scheduler 사용 이유

대략 1,600만건의 도서 데이터를 정보나루에서 수집한 후에, 각각의 상세 데이터를 OPEN API를 활용하여 수집하기 위해 ISBN을 활용하게 되는 작업을 하게 되었다.

Spring Scheduler 사용 방법

  • Spring Boot starter에 기본적으로 제공되어 따로 의존성 주입이 필요하지 않으며 @EnableScheduling 어노테이션을 추가한다.

  • Scheduler로 사용할 method에 @Scheduled 어노테이션을 추가한다.

    • 규칙
      • method의 return type은 void여야 한다.
      • method는 파라미터가 없어야 한다.
  • 사용자가 적은 새벽 시간을 이용하기 위해 cron을 활용하여 새벽시간을 지정하였다.

내가 생각한 문제점 및 구현 방법

  1. 가지고 있는 데이터의 ISBN을 가지고 정보나루 데이터를 수집해야 했다. 그리고 대략 1건당 1초의 시간이 소요되었다. 그렇기에 가지고 있는 ISBN을 중복되지 않게 조회하는 로직이 필요하다.

    • 기존의 데이터에서 GROUP BY를 활용하여 ISBN을 중복되지 않게 내림차순으로 정렬하여 List를 조회한 후에, 해당 데이터의 상세 데이터를 OPEN API를 활용하여 수집하였다.
  2. 하루간의 작업이 끝난 후에, 마지막 ISBN을 조회하여 그 다음부터 OPEN API를 활용하여 데이터를 수집해야 한다.

    • 처음 시작인 경우와 아닌 경우로 나누어서 처음일 경우 기존 데이터의 내림차순으로 정렬된 ISBN을 List로 조회하여 수집할 수 있다.
    	isbnList = bookTaskRepository.findTopByOrderByIsbnDesc();
    • 기존에 상세데이터를 수집한 경우에는 이미 내림차순으로 정렬되어 데이터가 삽입되었으므로, 상세 데이터의 마지막 ISBN을 조회하여 그보다 작은 ISBN List를 조회하여 상세 데이터를 수집하였다.
    	deatilMinIsbn = bookDetailTaskRepository.findTop1ByOrderByIsbnAsc().getIsbn();
    	isbnList = bookTaskRepository.findTopByIsbnLessThanOrderByIsbnDesc(deatilMinIsbn);
  3. 데이터의 무결성이 훼손된 경우가 많아 올바른 데이터를 수집해야 한다.

    • 상세 데이터의 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);
    • 최적화를 위해 in절을 활용하여 데이터 삭제를 진행하였다.
      @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에 대해서 새로운 공부가 필요하다고 느낀다.

profile
소통을 잘하고싶은 백엔드 개발자

0개의 댓글