본문 바로가기
Spring

[스프링부트] 8. Scheduler

by moca7 2024. 11. 6.

 

 

 

ㅁ 스프링 프로젝트에서 스케줄러 클래스를 가져와서 복붙한다

 

 

 

 

- 스케줄러 클래스 복붙해와서 package 선언부를 바꾸고 import를 다시한다.

 

 

 

 

 

ㅁ BoardScheduler

 

 
package com.br.boot.scheduler;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.br.boot.service.BoardService;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RequiredArgsConstructor // final 필드에 대한 매개변수 생성자가 만들어지고, 매개변수 생성자 주입에 의해서 생성된 객체가 boardService에 대입된다.
@Component
public class BoardScheduler {
 
  private final BoardService boardService;
 
 

  @Scheduled(cron="0 10 11 * * *") // 매일 오전 11시 10분마다 로그 출력 (로그쓰게 @Slf4j)
  public void esecute1() { // 반환형은 void, 메소드명은 마음대로
   
    log.debug("매일 오전 11시 10분마다 실행됨");
  }
 
 
  @Scheduled(cron="0 0/1 * * * *") // 1분마다 실행
  public void execute2() {
    log.debug("1분마다 매번 실행됨");
  }
 
 
  @Scheduled(cron="0 0 0/1 * * *") // 1분마다 실행
  public void execute3() {
    log.debug("1시간 마다 매번 실행됨");
  }
 
 
 
  // 통계 정보를 위해 매일 밤 12시에 현재 게시글의 총 갯수를 로그로 기록을 남기는 스케줄러가 필요하다고 가정한다.
  @Scheduled(cron="0 0 0 * * *") // 매일 밤 12시마다 실행
  public void execute4() {
    log.debug("현재 게시글의 총 갯수: {}", boardService.selectBoardListCount());
  }
  // 지금은 개발서버고 나중에 실서버에 배포하면 실서버는 24시간 계속 돌아간다.
 
 
  // 일요일 새벽 1시마다 현재 status가 N인 댓글을 완벽히 delete하는 스케줄러가 필요하다고 가정한다.
  //@Scheduled(cron="0 0 1 * * SUN")
  @Scheduled(cron="30 0/1 * * * *")
  public void execute5() {
    int result = boardService.deleteReplyCompletely();
    log.debug("현재 완전 삭제된 댓글 갯수: {}", result);
  }
 
}
 

 

 

- 스케줄러도 빈등록을 해야한다.

- 이미 이 클래스는 빈등록이 되어있다. 클래스 위에 @Component가 이미 있다.

 

 

 

 

ㅁ (스프링) 스프링에서는 servlet-context.xml에 task 하나를 등록했었다.

 

 
<?xml version="1.0" encoding="UTF-8"?>

  <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
 
  <!-- Enables the Spring MVC @Controller programming model -->
  <annotation-driven />

  <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
  <resources mapping="/resources/**" location="/resources/" />
  <resources mapping="/upload/**" location="file:///upload/" />

  <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
  <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
  </beans:bean>
 
  <context:component-scan base-package="com.br.spring" />
 
 
  <!-- webSocket 관련 등록 구문 -->
  <beans:bean class="com.br.spring.handler.ChatEchoHandler" id="chatEchoHandler" />
  <websocket:handlers>
    <websocket:mapping handler="chatEchoHandler" path="/chat" />
    <websocket:handshake-interceptors>
      <beans:bean class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor" />
    </websocket:handshake-interceptors>
    <websocket:sockjs />
  </websocket:handlers>
 
 
  <!-- interceptor 관련 등록 구문 -->
  <interceptors>
    <interceptor>
      <mapping path="/member/myinfo.do" />
      <mapping path="/board/regist.do" />
           
      <beans:bean class="com.br.spring.interceptor.LoginCheckInterceptor" id="LoginCheckInterceptor"/>
    </interceptor>
   
   
    <!--
    <interceptor>
   
    </interceptor>
    -->
  </interceptors>
 
 
  <!-- Scheduler -->
  <task:annotation-driven />
 
</beans:beans>
 

 

 

 

 

 

ㅁ BootApplication

 

 

 

 

- 우리가 만든거 아님.

이게 부트 프로젝트를 구동시켜주는 클래스다. 

 

 

 

 

 

- 위에 있는 @SpringBootApplication을 ctrl을 누르고 클릭해서 타고 가봤다. 

 

 

 

 

 
package com.br.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling // servlet-context.xml의 <task:annotation-driven /> 대체
@SpringBootApplication
public class BootApplication {

  public static void main(String[] args) {
    SpringApplication.run(BootApplication.class, args);
  }

}
 

 

 

- 클래스 위에 @EnableScheduling 어노테이션을 붙인다.

스프링 프로젝트에서의 servlet-context.xml에 작성한 <task:annotation-driven /> 구문을 대체하는 어노테이션이다.

 

 

 

 

 

 

ㅁ 저장

 

- 스케줄러가 동작된다.