H'academy
  • H'academy
  • Web
    • Back-end
      • Spring Framework
        • Spring 개발환경 구축
          • Project 생성
          • Maven 설정
          • Maven 저장소 위치 설정
          • Apache Tomcat 연동
          • Lombok 설정
        • Spring MVC Project
          • pom.xml
          • web.xml
          • root-context.xml
          • servlet-context.xml
          • DispatcherServlet
        • Controller
          • File Upload / Download
          • RestController(작성중)
        • Spring Test
          • Assert 단정문
          • Spring 환경 연동 테스트
          • MockMvc Test
        • Spring AOP
          • AOP 용어
          • Pointcut Expression
          • Filter
          • Interceptor
          • Filter vs Interceptor
          • Controller Advice(작성중)
        • Spring JDBC
          • DBCP
          • myBatis
            • ResultMap 활용
        • ETC
          • Logging
            • Tomcat Logging 설정
          • Property 관리
          • E-mail
            • Gmail 변경사항
          • Scheduler
          • Websocket
      • Spring Boot
        • STS 다운로드
        • 프로젝트 생성
        • 프로젝트 구조
        • Spring Devtools
        • Spring Controller
          • JSP 연동
            • * JSP 생성불가 문제
            • Spring Boot 3.x
          • Model
          • 요청 파라미터 처리
          • 경로 변수 처리
          • 요청 메소드
          • Redirect
          • Spring Actuator
        • Spring Boot JDBC
          • Database 정보
          • DAO Pattern
          • ORM Framework
            • myBatis
              • Mapper 생성
            • Spring Data JPA
        • Spring AOP
          • AspectJ
          • Filter
          • Interceptor
          • ControllerAdvice
        • REST API
        • Spring WebSocket
        • Send Mail
        • Logging
        • Spring Boot Test
        • Lombok
      • Java EE
        • 개발환경 구성
          • Server와 Client
          • Web Server와 WAS
        • Dynamic Web Project
      • Apache Tomcat
        • Apache Tomcat 구조
        • Tomcat User 생성
        • Tomcat Manager 설정
      • Maven
      • Jenkins
        • Installation
          • Github Webhook 설정
          • Maven 연동
        • Project setting
          • 소스 코드 관리 설정
          • 빌드 유발 설정
          • 빌드 작업 설정
      • OpenAPI(swagger)
        • swagger 2.x (legacy)
        • swagger 3.x (boot)
        • Swagger UI 꾸미기
        • SpringDoc
    • Front-end
      • HTML
        • Heading
        • <A>
        • <IMG>
        • <DIV>
        • <TABLE>
        • <FORM>
          • <INPUT>
          • <SELECT>
          • <TEXTAREA>
          • <FIELDSET>
        • List
      • CSS
        • CSS 적용 방식
          • 크기(size)
            • 픽셀(px)
          • 색상(color)
        • CSS 선택자
          • 스타일 우선순위
        • CSS 주요 속성
          • 크기 속성
            • border
            • margin
            • padding
            • box-sizing
          • 배경 속성
          • 글자 속성
            • font
            • text
          • 배치 속성
            • position
            • display
            • overflow
            • float
            • flexbox
        • CSS Reset
      • JS
        • syntax
          • let, const
          • 구조 분해 할당
          • spread operator
          • Object copy
          • this
          • module
        • jQuery
          • structure
          • function
          • ajax
            • ajax file upload
        • VueJS
          • CDN(Vue3)
            • 기본 구조
            • Vue Devtools
            • jQuery vs VueJS
            • Vue instance
              • data
                • IME issue
              • v-model
              • template
              • computed
              • watch
                • deep watch
                • vs Computed
              • methods
            • Vue directive
              • v-text
              • v-html
              • v-bind
                • v-bind style
                • v-bind class
              • v-on
                • once
                • prevent
              • v-show
              • v-if
              • v-for
          • Vue-cli 3
            • 프로젝트 구조
            • src
              • main.js
              • App.vue
              • HelloWorld.vue
            • Vue Router 4
              • History mode
              • 404 not found
              • Guard
                • beforeEach
            • Vuex
              • 이동 횟수 측정
            • axios
              • interceptor
          • Vue-electron
        • ReactJS
          • CDN(React18)
            • 템플릿 설명
            • JSX
            • render
            • Handling Events
              • onClick
              • onInput
            • Component
              • 클래스 컴포넌트
                • state
                • props
                • event
                  • Mouse
                  • Input
                • lifecycle
              • 함수형 컴포넌트
                • useState
                • useEffect
                • useReducer
                • useMemo
                • props
                • 조건부 렌더링
          • CRA
            • 자원 경로 설정
            • src 절대 경로 설정
            • react-router
            • Context API
            • Electron 설정
        • Webpack
          • NodeJS
          • Git
    • Ubuntu server
      • Jenkins
    • 테스트 도구
      • JMeter
        • Test Plan
        • Test Plan(with login)
        • Plugin 설치
    • WebRTC
  • Base Language
    • Java
      • Java 실행 과정
        • 개발 환경 구축
        • 샘플 코드 작성
        • 컴파일/실행
        • 환경 변수 설정
      • Java 초급
        • Hello world
        • 자료와 정보
        • 변수
          • 정수
            • 정수의 저장 원리
            • 정수형 변수 생성
          • 실수
            • 실수의 저장 원리
            • 실수형 변수 생성
          • 논리
            • 논리형 변수 생성
          • 문자
          • 문자열
            • 문자열 변수 생성
          • 사용자 정의 자료형
        • 연산자
          • 대입 연산
          • 부호 연산
          • 산술 연산
          • 복합 대입 연산
          • 증감 연산
          • 쉬프트 연산
          • 비트 연산
          • 비교 연산
          • 논리 연산
          • 삼항 연산
          • 변환 연산
        • 표준 입출력
          • 표준 출력
          • 표준 오류 출력
          • 표준 입력
            • Scanner 입력
        • 제어문
          • if 구문
            • 단일 조건
            • 두 가지의 조건
            • 여러 가지의 조건
          • switch~case 구문
          • while 구문
          • do~while 구문
          • for 구문
        • 랜덤(Random)
        • 배열
          • 1차원 배열
          • 2차원 배열
          • 다차원 배열
          • Sort
            • 선택 정렬
            • 버블 정렬
            • 삽입 정렬
      • Java 중급
        • 객체 지향 프로그래밍
        • 클래스
        • 인스턴스
        • 필드
        • 메소드
          • 설정(setter) 메소드
          • 반환(getter) 메소드
        • 생성자
        • 접근 제한
          • private
          • package
          • protected
          • public
        • 정적(static)
        • 불변(final)
        • 상수(constant)
        • 상속
          • this와 super의 이해
          • 멤버 변수 설정
          • 멤버 메소드 설정
          • 생성자 설정
        • 추상화
          • 추상 클래스
          • 인터페이스
        • 다형성
        • 중첩 클래스
          • 일반 중첩 클래스
          • static 중첩 클래스
          • 지역 중첩 클래스
          • 익명 중첩 클래스
      • Java API(작성중)
        • java.lang
        • java.util
        • java.text
        • java.time
        • java.io
        • java.net
        • java.sql
        • java.awt
        • javax.swing
      • Java 고급
        • 제네릭(Generic)
        • 열거형(Enum)
        • Annotation Type
          • Retention
          • Target
          • Nested Annotation
        • Java Reflection
          • Intro
          • Class
          • Field
          • Constructor
          • Method
          • Package
      • JDBC
        • 드라이버 로드
        • 연결 생성
          • JDBC Driver 유형
        • JdbcTemplate
      • Java 버전별 변경사항
        • Java 1.8
          • Lambda Expression
          • Stream API
          • java.time 패키지
        • Java 9
        • Java 12
          • switch~case
        • Java 13
          • Text Block
    • Arduino
      • 학습 준비
        • Reference
        • 아두이노 온라인 시뮬레이터
        • 전기의 이해
        • 그라운드(GND)의 이해
      • 개발 환경 구축
        • CH340 보드 설치
        • Editor 글꼴 설정
      • 아두이노 제어
        • 코드의 구성
        • 시리얼 출력
        • 디지털 출력
          • LED 출력
        • PWM 출력
        • 시리얼 입력
        • 디지털 입력
          • PIR 센서
        • 아날로그 입력
          • 온도 센서(LM35DZ)
          • 조도 센서
          • 가스 센서
        • 피에조 부저
        • 서보 모터 제어
          • 시리얼 서보 모터 제어
          • 스위치 서보 모터 제어
        • 온습도 센서(DHT-11)
        • LCD
      • 아두이노 통신
        • 블루투스(Bluetooth)
          • HC-06
            • 온도 센서 활용
          • HM-10
        • 와이파이(Wi-Fi)
          • ESP-01
            • WiFiEsp 라이브러리 추가
            • WiFiEsp 네트워크 스캔
        • 이더넷(Ethernet)
        • ArduinoJson 라이브리 사용
    • Regular Expression
  • Database
    • Oracle
      • 설치
        • SQL Plus
        • SQL Developer
        • DBeaver
        • Docker(Mac OS)
      • SQL
        • 관리자 명령
          • 사용자 관리
          • 권한 관리
          • Encoding 설정
          • 서비스 포트 설정
        • 사용자 명령
          • 테이블 관리
            • 테이블 항목 제약 조건
            • 외래키 제약조건
            • 데이터 유형
          • 시퀀스 관리
          • 데이터 관리
            • 데이터 추가
            • 데이터 조회
              • 오라클 내장 함수
              • 그룹 조회
              • Top N Query
            • 데이터 수정
            • 데이터 삭제
          • 뷰 관리
          • 인덱스 관리
          • 집합 연산
          • 테이블 조인
            • 등가 조인
            • 외부 조인
        • HR 계정
        • 기타 명령
          • 컬럼 간격 조정
      • 내보내기 및 불러오기
        • EXPDP, IMPDP
        • Docker로 실행중인 경우
      • 기타
        • 자동 세션 제거
        • Tablespace 관리
        • Unlock user
  • 면접대비
    • Q&A
      • Java
      • Database
      • Web
      • IT 일반상식
  • ETC
    • Eclipse IDE
      • 설치
      • 화면 설명
      • 환경 설정
      • 프로젝트 생성
      • 소스파일 작성 및 실행
    • Github
      • Github 계정 관리
      • Github 저장소 관리
        • Profile
        • Collaborators
        • Code
        • Issues
        • Pull requests
        • Action
          • Vue 3 Deploy Action
      • Personal Access Token
      • Git ignore 설정
        • Spring 개발용 샘플
      • Github Eclipse 연동
        • Branches
        • Project
        • Team project
          • Dynamic web project
          • Spring Boot Project
          • Branch 생성
          • Pull Request
          • Branch 보호
          • Branch 다시 생성
    • Figma
      • Team
      • Design
      • Component
    • 과정평가형
      • 실기 모의고사 1회
      • 실기 모의고사 2회
      • 실기 모의고사 3회
      • 실기 모의고사 4회
    • VScode
      • Live Server 실행 오류
      • Github 계정 변경
    • Naver ToastUI Editor
      • Editor 만들기
        • Editor options
          • File upload
      • Viewer 만들기
    • 문자 인코딩 방식
    • OBS
      • 녹화 잡음 제거 설정
    • Semantic Version
Powered by GitBook
On this page
  • Spring Scheduler
  • Spring dependency
  • Spring xml setting
  • namespace 설정
  • Scheduler 등록
  • @Scheduled 옵션
  • cron 표현식
  • cron 표현식 형식
  • 주요 기호 설명
  • cron 표현식 예시
  1. Web
  2. Back-end
  3. Spring Framework
  4. ETC

Scheduler

이 문서에서는 스프링 3.0 이후에서 애노테이션 기반으로 스프링 스케줄러를 이용하는 방법에 대해서 살펴본다.

Spring Scheduler

스케줄러는 정해진 주기마다 작업을 실행하는 도구이다. 따라서 스케줄러를 생성하기 위해서는 반드시 주기와 작업을 설정해야 한다. 다음과 같은 작업들은 모두 스케줄러로 할 수 있는 작업에 해당한다.

  • 음원 차트를 매 정각마다 갱신한다.

  • 실시간 검색어를 10분마다 갱신한다.

  • 매일 아침 6시에 일일 포인트 사용내역을 초기화한다.

스케줄러를 이용할 때 주의할 점은 다음과 같다.

  • 주기가 짧을 수록 성능 저하의 가능성이 높아진다.

  • 스케줄러에서 수행하는 작업이 복잡할수록 성능 저하의 가능성이 높아진다.

  • 스케줄러를 많이 사용할수록 성능 저하의 가능성이 높아진다.

Spring dependency

스프링에서 스케줄러를 사용하려면 다음 의존성이 필요하다.

  • org.springframework.spring-task

Spring xml setting

스프링에서 스케줄러를 사용하려면 두 가지 방법을 고려할 수 있다.

  • 생성된 bean을 xml 설정에서 task 설정으로 등록하는 방법

  • xml 설정에 활성화 태그만 작성해둔 뒤 annotation으로 등록하는 방법

이 문서에서는 두 번째 방법을 사용한다.

namespace 설정

우선 xml 설정에서 task 관련 설정을 수행할 수 있도록 namespace를 추가해야 한다. 다음 이미지를 참고하여 root-context.xml 에 설정한다.

root-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="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">
	
    <!-- task 관련 annotation 활성화 설정 -->
	<task:annotation-driven/>
		
</beans>

<task:annotation-driven/> 태그를 작성하여 task 관련 annotation을 활성화 처리한다. 이후 우리가 등록하는 task들을 자동으로 스캔하여 찾아준다.

Scheduler 등록

설정을 마쳤다면 스케줄러를 생성하고 등록해본다. 스케줄러는 Service 형태로 생성 및 등록할 것이며 다른 형태여도 무방하다.

ScheduleService.java

public interface ScheduleService {
	void work();
}

ScheduleServiceImpl.java

@Service
@Slf4j
public class ScheduleServiceImpl implements ScheduleService{
    @Override
    @Scheduled(fixedRate = 1000)
    public void work() {
        log.info("work 메소드 실행");
        log.info("현재시각 = {}", LocalDateTime.now());
    }
}

서버를 이용하여 현재 프로젝트를 실행해보면 1초 간격으로 현재시각이 출력되는 것을 확인할 수 있다. <task:annotation-driven/> 설정을 해두었기 때문에 @Scheduled 애노테이션을 찾아서 자동으로 시작 시 옵션에 맞게 구동되도록 해주는 것이다.

@Scheduled 옵션

  • cron : unix 계열에서 사용하는 cron과 같은 표현식 형태로 주기를 설정

  • fixedDelay : 작업 종료와 재시작 사이의 간격을 밀리초(ms) 단위로 설정

  • fixedRate : 작업 시작과 시작 사이의 간격을 밀리초(ms) 단위로 설정

  • initialDelay : 작업의 최초 시작 전의 대기 간격을 밀리초(ms) 단위로 설정

  • zone : cron 표현식을 적용시킬 타임 지역을 설정

cron 표현식

cron 표현식의 사용 형태에 대해 살펴본다.

cron 표현식 형식

@Schedule("초설정  분설정  시간설정  날짜설정  월설정  요일설정")

또는

@Schedule("초설정  분설정  시간설정  날짜설정  월설정  요일설정  연도설정")

일반적으로 연도를 설정할 일은 거의 없다.

주요 기호 설명

cron 표현식에서 사용하는 주요 기호들은 다음과 같다.

  • *

    • 전체(All)을 의미

  • ?

    • 아무때나(Any)를 의미

    • 일, 요일 자리에만 사용 가능

    • 일이나 요일에 패턴이 지정될 경우 반대쪽은 ? 로 설정한

  • ,

    • 값을 여러 개 지정할 때 사용

    • 11, 15, 20으로 설정하면 3개가 설정

  • -

    • 범위 지정 기호

    • 10-20 은 10부터 20까지 범위를 설정

  • /

    • 주기 설정

    • */3 은 해당 항목을 3번마다 실행하도록 설정

  • L

    • 마지막 날

  • W

    • 가장 가까운 영업일(월-금)

  • #

    • 주차 지정

    • 3#2는 2주차 3(수요일)을 의미

cron 표현식 예시

@Schedule(cron="") 안에 사용할 수 있는 표현식과 그에 대한 해석은 다음과 같다.

  • * * * * * *

    • *초 *분 *시 *일 *월 *요일

    • 매 초 간격으로 실행

  • */1 * * * * *

    • 1초마다 *분 *시 *일 *월 *요일

    • 매 1초 간격으로 실행

  • */2 * * * * *

    • 2초마다 *분 *시 *일 *월 *요일

    • 매 2초 간격으로 실행

  • 10,20 * * * * *

    • 10,20초 *분 *시 *일 *월 *요일

    • 매분 10초와 20초에 한 번씩 실행

  • 10-20 * * * * *

    • 10~20초 *분 *시 *일 *월 *요일

    • 매분 10초부터 20초 사이에 1초 간격으로 실행

  • 0 * * * * *

    • 0초 *분 *시 *일 *월 *요일

    • 매분 0초에 실행(1분마다)

  • 0 */1 * * * *

    • 0초 1분마다 *시 *일 *월 *요일

    • 1분마다 0초에 실행

  • 0 */5 * * * *

    • 0초 5분마다 *시 *일 *월 *요일

    • 5분마다 0초에 실행

  • 0 0 * * * *

    • 0초 0분 *시 *일 *월 *요일

    • 매 시 정각에 실행

  • 0 0 */2 * * *

    • 0초 0분 2시간마다 *일 *월 *요일

    • 매 2시간마다 정각에 실행

  • 0 0 6 * * *

    • 0초 0분 6시 *일 *월 *요일

    • 매일 아침 6시 정각에 실행

  • 0 0 6 * * W

    • 0초 0분 6시 *일 *월 수요일

    • 매주 수요일 아침 6시 정각에 실행

  • 0 0 6 L * ?

    • 0초 0분 6시 마지막날 *월 요일무관

    • 매월 마지막날 아침 6시 정각에 실행

  • 0 0 6 ? * 4L

    • 0초 0분 6시 아무날 매월 마지막수요일

    • 매월 마지막 수요일 아침 6시 정각에 실행

  • 0 0 6 ? * 4#3

    • 0초 0분 6시 아무날 매월 3번째수요일

    • 매월 3주차 수요일 아침 6시 정각에 실행

PreviousGmail 변경사항NextWebsocket

Last updated 2 years ago

@Scheduled에는 다음과 같은 옵션을 사용할 수 있다.

fixedDelayString : 작업 종료와 재시작 사이의 간격을 규격에 맞게 설정

fixedRateString : 작업 시작과 시작 사이의 간격을 규격에 맞게 설정

initialDelayString : 작업의 최초 시작 전의 대기 간격을 규격에 맞게 설정

API
java.time.Duration
java.time.Duration
java.time.Duration
좌측 하단의 Namespaces 탭 선택
task namespace를 선택하여 활성화
namespace 활성화 확인