본문 바로가기
Web Development/Spring Legacy

[Spring / Legacy] Spring 스케줄러 사용하기 - 1탄. Spring Scheduler

by 감자맹고우 2022. 3. 18.
728x90
반응형

Spring Scheduler, Spring Quartz에 대한 정보는 많다.

하지만 대부분 Boot 환경에 대한 정보이고, Legacy 환경에서 구축된 정보는 거의 없다.

그래서 그에 대한 정보를 공유하고자 한다.

 

일단 기본적인 환경은 다음과 같다.

별다른 이유 없이 진행 중인 프로젝트 환경이 이래서 그대로 사용했는데,

구글링했을 때 Java 8 버전, slf4j가 필요하다고 했으니 필요에 따라 참고하면 될 것 같다.

 

- Java : 1.8
- Spring Fremawork version : 3.1.1
- slf4j : 1.6.6

 

Spring Batch와 별개로 Scheduler와 Quartz에 대한 설명도 구글링 검색 시 잘 나와있다.

매우 간략하게 설명하자면, Scheduler가 Quartz보다 적용하기 간단하다.

하지만 Quartz는 설정이 복잡한 반면, 클러스터링과 같은 특별한 기능을 제공하기 때문에 세부적인 컨트롤을 위해서는 Quartz를 적용해야한다.

 

그러나 세상 일이 원하는대로 되는 것이 없다고, 하다보니 2가지 방법 모두 사용해보게 되었다...

이 글에서는 간단한 Scheduler만을 사용하고 Quartz에 대해서는 아래 글에서 다루어보겠다.

 

▼ Spring Scheduler - 2탄. Spring Quartz 적용하기

 

[Spring / Legacy] Spring 스케줄러 사용하기 - 2탄. Spring Quartz

이번에는 1탄의 Spring Scheduler 사용에 이어서 Spring Quartz 사용에 대해 알아보고자 한다. Spring Scheduler와 Quartz 별개이므로 Quartz를 바로 사용하고자 한다면 다시 참고할 필요는 없다. ▼ 아래는 1탄의.

devlifetestcase.tistory.com

 

 

반응형

 

[ 적용 방법 ]

 

어쨌든 Scheduler 적용을 시작해보겠다.

Scheduler는 설정이 정말 간단하다.

따로 의존성도 추가해 줄 필요가 없다.

Spring 4.0부터는 따로 추가를 해주어야 한다고 하니 참고해야겠다.

 

 

1. xml 파일 설정

 

일단 가장 처음은, root-context.xml이나 servlet-context.xml에 일부 설정을 추가해야 한다.

<context:component-scan base-package="" />

위의 코드처럼 base-package를 scan하는 코드가 있는 곳에 적용하면 되는 것으로 보인다.

보통 base-package를 프로젝트의 가장 윗단으로 해둘텐데 그대로 두면 된다.

글쓴이의 경우 servlet-context.xml에 아래의 코드를 추가하였다.

 

/** servlet-context.xml **/
<beans:beans {생략}
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="
    	{생략}
		http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd"
	>

 

xml 파일 상단 beans에 보면 spring mvc부터 여러가지 내용이 있을텐데, 해당 위치에 각각 위의 task 관련 설정을 추가하면 된다.

이후, 해당 xml파일 내에 task 설정을 작성해준다.

 

/** servlet-context.xml **/
<!-- 스케줄러 -->
<task:scheduler id="jobScheduler" pool-size="10" />
<task:annotation-driven scheduler="jobScheduler" />

scheduler id는 임의로 설정해서 annotation-driven에 맞춰주면 되고, pool-size는 스레드 풀 사이즈로 필요에 맞게 설정해주면 된다.

 

이렇게 하면 설정이 벌써 끝났다.

 

 

2. Scheduler Class 파일 작성

 

@Component
public class Scheduler {
	
    //Scheduling 기능을 적용하기 위해 작성한 service나 dao 등을 불러와서 작성
    
    @Autowired
    private TestDao testDao;
	
    //1시간마다 INSERT
    @Scheduled(cron = "0 0 0/1 1/1 * ?")
    public void autoInsert() {
        testDao.addTest();
    }
    
}

 

Class 파일 작성 시에도 어려운 부분이 없다.

이미 xml 설정을 통해 @Scheduled 어노테이션을 사용할 수 있게 되었기 때문에 사용만 해주면 된다.

 

우선은 @Component 어노테이션을 Scheduler로 사용할 해당 클래스에 설정해주고,

스케줄링 기능을 사용할 메소드에 @Scheduled 어노테이션을 작성해준다.

단, Scheduled 어노테이션에 시간 설정을 해주어야 한다. 여러 방법이 있지만, 여기서는 크론식으로 설정해주었다.

 

크론식은 어려워보이지만 편리하게도 자동으로 변환해주는 사이트가 있다.

아래의 사이트에서 원하는 시간으로 설정하고 Generate 버튼을 누르면 Result로 크론식을 제공해준다.

 

▼ 크론식 변환 사이트 1

 

CronMaker

 

www.cronmaker.com

 

▼ 크론식 변환 사이트 2

 

Free Online Cron Expression Generator and Describer - FreeFormatter.com

 

www.freeformatter.com

 

 

 

< 사용 예 : 사이트 1 (Cronmaker) 이용 예제 >

 

위의 Cron format이 변환된 크론식이다.

즉, 1분마다 => 0 0/1 * 1/1 * ? * 로 크론식을 나타낼 수 있다.

 

하지만, 여기서 중요한 부분이 있다.

코드에서 크론식의 7번째 자리 * 은 생략하고 ?까지만 복사해서 사용해야한다.

크론 표현식에서 7번째 자리는 연도인데, 해당 자리에 *을 사용하지 않는 것인지 정확하게 테스트해보진 않았지만 일정 시간마다 작동은 6번째 자리까지만 사용하면 정상 동작하는 것을 볼 수 있다.

 

예제코드의 autoInsert 메소드처럼, 이제 상황에 맞게 스케줄러를 사용하면 된다!

 

🤞 도움이 되셨기를 바랍니다. 한 번의 클릭과 댓글은 어딘가의 누군가에게 진실로 큰 힘이 됩니다. 🐱‍🏍

 

728x90
반응형

댓글