ㅁ 스프링 프로젝트에서 스케줄러 클래스를 가져와서 복붙한다
- 스케줄러 클래스 복붙해와서 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"?>
xsi:schemaLocation="http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.3.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 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 /> 구문을 대체하는 어노테이션이다.
ㅁ 저장
- 스케줄러가 동작된다.
'Spring' 카테고리의 다른 글
[스프링부트] 10. 트랜잭션 처리 (0) | 2024.11.06 |
---|---|
[스프링부트] 9. 웹소켓 (2) | 2024.11.06 |
[스프링부트] 7. Interceptor (0) | 2024.11.06 |
[스프링부트] 6. 파일업로드 처리 (0) | 2024.11.06 |
[스프링부트] 4.마이바티스 라이브러리 추가(연동) (0) | 2024.11.06 |