쉽게 쉽게

[Spring] 스케줄러 구현 본문

개발공부/Spring

[Spring] 스케줄러 구현

곱마2 2024. 6. 30. 19:41
반응형

▤ 목차

    1. 스케줄러 설정

    스케줄러는 일정주기마다 반복할 작업이 있을 경우에 사용하면 편리하다.

    스케줄러를 구현하기 위해서는 몇 가지 설정이 필요하다.

    xml에 설정을 추가해야 하는데 보통 dispatcher-servlet.xml에 추가하면 된다.

    (xml 설정을 다루는 파일은 각기 다를 수 있다.)

     

    1. Namespaces에서 task 추가

    Namespaces 중 task를 추가해주면 된다.

    추가가 성공하면 아래와 같은 설정이 추가되며 <task:> 태그를 사용할 수 있게 된다.

    2. 스케줄러에 사용될 애노테이션 활성화

    annotation-driven 설정 추가하여  @Schedule과 @Async 애노테이션을 활성화 시키면 된다.

    단 스레드 풀의 크기나 다른 고급 설정을 제어하고 싶다면

    <task:scheduler>를 추가하여 스케줄러를 명시적으로 정의해야한다.

    <!-- annotation-driven으로 @Schedule과 @Async 애노테이션을 활성화 시키면 된다. -->
    <!-- 기본 설정만으로도 충분하다면 이렇게 설정  -->
        <task:annotation-driven/>
        
    <!-- 고급설정을 하고 싶다면 사용되는 스케줄러를 지정해야함   -->
    <!-- 스케줄러 빈 정의 -->
        <task:scheduler id="scheduler" pool-size="10"/>
    <!-- @Scheduled 어노테이션 활성화 및 스케줄러 지정 -->
        <task:annotation-driven scheduler="scheduler"/>

    3. 스케줄러 component 경로 설정

    @Component 어노테이션의 경우 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 어노테이션이다.

    스케줄러를 Bean으로 등록하여 사용해야 하기에 필요한 설정이다.

    component-scan의 경우는 이미 구현되어 있는 경우가 많아서 기존에 세팅되어 있는 경로를 활용하거나 (스케줄러를 세팅된 하위 경로에 구현) 스케줄러용 component-scan를 추가로 구현하는게 좋다.  

    <context:component-scan base-package="스케줄러 클래스 경로" use-default-filters="false">
    	<context:include-filter type="annotation" expression="org.springframework.stereotype.Component" />
    </context:component-scan>

    2. 스케줄러 구현

    스케줄러를 구현하는 방법은 2가지가 있다.

    1. dispatcher-servlet.xml(설정파일)에서 <task:scheduled-tasks>를 이용해 bean을 등록하여 cron을 설정
    2. 직접 @Scheduled 어노테이션을 추가하여 cron을 설정

    1. <task:scheduled-tasks> 사용

    설정 파일에 미리 스케줄을 설정하는 방법이다.

    <task:scheduled-tasks>
        <!-- 10초에 1번씩 -->    
        <task:scheduled ref="schedule" method="test" cron="0/10 * * * * ?"/>
    </task:scheduled-tasks>

    ref는 @Component, @Controller, @Service, @Repository 등 stereoType으로 등록된 빈 이름을 작성
    ref에는 반드시 클래스 이름을 camelcase 명명법으로 작성해야 한다.

    method는 스케줄러로 실행할 메서드명을 입력

    @Component
    public class Schedule {
    	public void test() {
        	System.out.println("10초에 1번씩 console 찍기");
    	}
    }

     

    2. @Scheduled 사용

    @Scheduled를 사용해서 스케줄을 구현하는 방법이다.

    @Component
    public class Schedule {
    	@Scheduled(cron="0/10 * * * * *")
    	public void test() {
        	System.out.println("10초에 1번씩 console 찍기");
    	}
    
    }

    3. Cron 표현식

    cron 표현식

      • * : 모든 값을 의미
      • ? : 특정한 값이 없음
      • - : 범위를 뜻함
      • , : 특별한 값일 때만 동작
      • / : 시작시간 / 단위
      • L : 일에서 사용하면 마지막 일, 요일에서는 마지막 요일(토요일)
      • W : 가장 가까운 평일
      • # : 몇째주의 무슨 요일을 표현

     예제

     

    만약 Support for specifying both a day-of-week AND a day-of-month parameter is not implemented. 

    라는 오류가 발생했다면

    일자를 나타내는 4번째 필드와 요일을 나타내는 6번째 필드는 동시에 값을 지정할 수 없기때문에 나타나는 오류다.

    해결을 위해서는 아래와 같이 마지막 요일 값을 ? 로 변경하면 된다. 

    @Scheduled(cron="0 0 5 * * *")  → ERROR 발생
    @Scheduled(cron="0 0 5 * * ?")  → 수정완료

    https://wooncloud.tistory.com/75

     

    [Spring] 스케줄러 Cron 사용하기

    스프링 프로젝트를 개발하면서 시스템이 커지고 DB 또는 다양한 서비스를 위해 어떤 모듈들을 주기적으로 실행해야 할 때가 옵니다. 그럴 때 사용하는 것이 스케줄러입니다. 스프링에서 스케줄

    wooncloud.tistory.com

    https://highlighter9.tistory.com/33

     

    스프링 스케쥴러 (@Scheduled) 설정 및 사용하기

    일정 시간/주기마다 호출되어야하는 작업이 필요할때 스프링 스케쥴러를 사용하면 간편하게 구현할 수 있다. 스케쥴러를 사용하기 위해서는 간단한 설정이 필요하다. 설정은 어노테이션을 추

    highlighter9.tistory.com

    https://zamezzz.tistory.com/197

     

    [Cron] 크론(cron) 표현식 정리

    ■ Cron (크론) cron이란? 유닉스 계열의 잡 스케줄러 ● Cron 표현식 - 필드 Cron 스케줄러의 정규 표현식입니다. 7개의 각 필드로 구성되어 있으며, 각 필드의 내용은 아래와 같습니다. 자세한 설명은

    zamezzz.tistory.com

    https://galid1.tistory.com/494

     

    Spring - @Bean 어노테이션과 @Component 어노테이션(DI) - 2

    @Component, @Bean 프로그램이 거대해 짐에 따라 XML을 이용하여 IOC Container를 설정하는 것이 점점 어려워졌고 때문에 Annotation(@)이란 것이 등장했다(이하 어노테이션). 어노테이션은 코드에 메타데이

    galid1.tistory.com

    잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다.

     

     

     

    반응형