배치와 스케줄러의 차이

dev-jjun·2023년 8월 13일
1

Server

목록 보기
17/33

'엄빠도 어렸다' 서버 개발을 하며, 매일 특정시간에 특정 조건을 만족할 때마다 푸시알림을 보내는 스케줄링 작업을 구현해야 했다.

푸시알림 기능을 구현하기에 앞서 Spring Batch, Spring Scheduler 등의 라이브러리를 이용할 수 있다는 것을 알고 각각에 대한 공부 후 더 효율적이고 적합한 것을 선택하고자 하였다.

배치(Batch)

사용자와의 상호작용 없이 여러 개의 작업을 미리 정해진 순서에 따라 중단 없이 처리하는 것

*배치 = 일괄처리

→ Spring Batch

특징 ✓이 조건들을 만족해야 ‘배치’인 것이다!

  1. 대용량 데이터 - 대량의 데이터를 가져오고, 전달하고, 계산하는 등의 처리 가능
  2. 견고성 - 잘못된 데이터를 충돌/중단 없이 처리
  3. 성능 - 지정한 시간 내에 처리 완료 및 동시에 실행되는 다른 프로그램에 방해 X
  4. 자동화 - 사용자의 개입 없이 실행
  5. 신뢰성 - 잘못된 부분의 추적 가능 (로깅, 알림 등)
💡 결론

Spring Batch는 스케줄러가 아니므로, 고려 대상이 아니었다!

배치 작업을 관리하지만, 이 작업(Job)을 구동하거나 실행시키는 기능은 지원하지 않는다. 스프링에서 배치 작업을 실행시키려면 Quartz, Scheduler, Jenkins 등 전용 스케줄러를 사용해야 한다.

스케줄링 작업의 효율적인 관리를 위해서 Spring Batch를 사용할 수 있다!

참고 - https://gimmesome.tistory.com/204

스케줄러(Scheduler)

일정한 시간 간격 또는 시각에 특정 로직을 돌리기 위해 사용하는 것

→ Spring Scheduler, Quartz

🌱 Spring Scheduler

특징

  1. 추가적인 의존성 불필요 - 스프링 프레임워크의 기본 기능
  2. 사용이 쉬움 - @Component + @Scheduled
  3. 1개의 Thread Pool 사용 - 하나의 스케줄이 끝나야 다음 스케줄 실행 가능

@Scheduled 규칙

  1. Application 클래스에 @EnabledScheduling 추가

  2. 실제 스케줄링 작업할 클래스가 스프링 빈에 등록된 클래스여야 함

    Scheduler에 등록할 클래스는 IoC 컨테이너에 등록되어 있어야 한다. → @Service로 등록해줌

  3. 스케줄러 메소드는 void 타입으로 지정 & 매개변수 사용 X

+) 비동기 방식으로 실행시키고 싶다면, @EnableAsync 어노테이션을 이용할 수 있다

@Scheduled 설정 옵션

  1. fixedDay - 이전 작업이 종료된 후 설정 시간만큼 기다린 후에 시작 (ms)

    ex. @Scheduled(fixedDelay = 1000)

  2. fixedRate - 이전 작업이 종료되지 않아도 설정된 시간마다 시작 (ms)

    ex. @Scheduled(fixedRate = 1000)

  3. initialDelay - 작업 시작 시, 설정된 시간만큼 기다린 후 시작 (ms)

    ex. @Scheduled(fixedRate = 1000, initialDelay = 2000)

  4. cron 표현식 - 원하는 시간대를 설정하여 작업 실행

    ex. @Scheduled(cron = "* * * * * *")

    → 6자리 설정만 허용하며, 연도 설정을 할 수 있다.

    • 초(0-59), 분(0-59), 시간(0-23), 일(1-31), 월(1-12), 요일(1-7, 1:일, 7:토)
    기호의미
    *모든 값을 의미
    ?해당 항목을 사용하지 않음
    -기간 설정
    ,여러 값을 지정해 나열 시 사용
    /시작과 반복간격을 지정
    • 사용 예시
      모든 요일 8 AM에 실행 :  0 0 8 * * *
      모든 요일 4 PM에 실행: 0 0 16 * * *
      모든 요일 9AM, 9PM에 실행: 0 0 9,21 * * *
      모든 요일 8AM,9AM,10AM, 11AM에  실행: 0 0 8-11 * * *
      모든 요일 21PM,22PM,23PM, 0AM에 실행: 0 0 21-00 * * *
      모든 요일 6:30 AM, 9:30PM에 실행: 0 30 6,21 * * *
      모든 시간 0초 0분에 실행: 0 0 * * * *
      모든 시간 15초에 실행: 15 * * * * *
      모든 요일 0시 15초에 실행: 15 0 0 * * *
      매년 8월 25일 9AM에 실행: 0 0 9 25 8 *
      매달 7일 9시 30AM에 실행: 0 30 9 7 * *
      매년 2월 14일 9AM이 화요일, 일요일이면 실행: 0 0 9 14 2 SUN, TUE
      모든 요일 모든 시간 30분에 실행: 0 30 0-23 * * *
      
      매분 0초마다 실행: 0 * * * * ?
      매분 0초, 1초, 2초, 3초에 실행: 0-3 * * * * ?
      매분 0초, 3초, 6초에 실행: 0, 3, 6, * * * * ?
      0초에 시작해 3초마다 실행: 0/3 * * * * ?
  5. zone - 시간대 설정 (디폴트: 로컬 시간대)

    ex. @Scheduled(cron = "* * * * * *", zone = "Asia/Seoul")

참고 자료

Spring Batch - Scheduler 등록

[Spring] Batch와 Scheduler의 차이 [Spring Scheduler 사용방법]

profile
서버 개발자를 꿈꾸며 성장하는 쭌입니다 😽

0개의 댓글