개발은 아름다워

[ biblecash ] 스케쥴러 코드 변경 본문

프로젝트

[ biblecash ] 스케쥴러 코드 변경

do_it_zero 2025. 2. 3. 17:57
@Slf4j
@Service
@RequiredArgsConstructor
public class RangeScheduler {

    private final RangeRepository rangeRepository;
    private final ContentRepository contentRepository;
    private final int EVERY_READ_CHAPTER = 5;

    //@Scheduled(cron = "0 0 0 * * MON-FRI") // 평일(월~금) 자정에 실행됨
    @Scheduled(fixedRate = 1000) // 10초마다 실행
    public void updateFiveChapter(){

        // 가장 최근 등록된 range를 가져온다
        Range recentRage = rangeRepository.findMaxIdxRange();

        // 등록된 범위가 없을 경우 바로 최초 등록
        if(recentRage == null){
            Range range = Range.create( 1, 0, LocalDate.now());
            rangeRepository.save(range);
        } else {
            // 최근 등록된
            int recentBook = recentRage.getBook();
            int recentEndChapter = recentRage.getEndChapter();

            log.info("recentBook : {},recentEndChapter : {}",recentBook,recentEndChapter);
            List<Map<String, Integer>> results = contentRepository.findNextChapters(recentBook, recentEndChapter);
            for (Map<String, Integer> chapter : results) {
                Integer book = chapter.get("book");
                Integer chapterNumber = chapter.get("chapter");

                System.out.println("Book: " + book + ", Chapter: " + chapterNumber);
            }

            Map<String,Integer> lastResult = results.get(results.size() - 1);
            int book = lastResult.get("book");
            int chapter = lastResult.get("chapter");
            log.info("book: {},chapter:{}",book,chapter);
            Range range = Range.create(book, chapter, LocalDate.now());
            rangeRepository.save(range);

        }
        
    }
    
}

 

public interface RangeRepository extends JpaRepository<Range,Long> {
    
    Optional<Range> findByUpdatedAt(LocalDate dateTime);

    @Query(value = "SELECT * FROM range ORDER BY idx DESC LIMIT 1", nativeQuery = true)
    Range findMaxIdxRange();

}

 

@Repository
public interface ContentRepository extends JpaRepository<Content,Long> {
    List<Content> findByIdxBetween(int startIdx, int endIdx);

    @Query(value = "SELECT COUNT(DISTINCT chapter) " +
            "FROM content " +
            "WHERE book = :book",
            nativeQuery = true)
    int countUniqueChaptersByBook(@Param("book") int book);

    @Query(value = "SELECT DISTINCT book, chapter " +
            "FROM content " +
            "WHERE (book > :recentBook) OR (book = :recentBook AND chapter > :recentEndChapter) " +
            "ORDER BY book, chapter " +
            "LIMIT 5", nativeQuery = true)
    List<Map<String,Integer>> findNextChapters(@Param("recentBook") int recentBook,
                                               @Param("recentEndChapter") int recentEndChapter);

}