๋ชฉ์ฐจ
์ฟผ์ธ ๋?
์ฟผ์ธ ์คํ ํ๋ฆ
์ฟผ์ธ ๊ตฌ์ฑ์์
์ฟผ์ธ ๊ตฌํ ๋ฐฉ๋ฒ - XML์ ์ด์ฉํ Quartz Scheduler๊ตฌํ
cron Expression
์ฟผ์ธ (Quartz)๋?
Job scheduling Library. ํน์ ์๊ฐ, ๋๋ ๋ฐ๋ณต์ ์ผ๋ก ํธ๋ฆฌ๊ฑฐ ๋์ด์ผํ๋ ๋ฐฐ์น์ฑ ์์ ์์ฑ ์ ์ฌ์ฉํ๋ค. ๋๋ ํ์ ์์ ์ฃผ๋ก ํ๋ก๊ทธ๋จ๊ณผ์ ๋ฐ์ดํฐ ์ก์์ ํ๊ฑฐ๋, ์งํ๋ฅผ ๋ํ๋ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ฐํ ๋ ์ฌ์ฉํ์๋ค. ์๋ฅผ ๋ค๋ฉด, ๋งค์ผ ์๋ฒฝ ํน์ ํ ์๊ฐ๋๋ง๋ค ํน์ ์๋น์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์์ด๋ค.
์ฟผ์ธ ์ ๋ํ์ ์ธ ์ฅ์ ์ ์ผ๋ จ์ ์์ ๋ค์ ์คํ ์๊ฐ๋๋ฅผ ์ ์ฐํ๊ฒ ์กฐ์ ํ ์ ์๋ค๋ ์ ์ด๋ค. ํน์ ํ ๋ , ํน์ ํ ์๊ฐ ๋ฟ ์๋๋ผ ์์ผ ๋ฐ ์๊ฐ์ ๊ฐ๊ฒฉ๊น์ง๋ ์ค์ ํ ์ ์๋ค.
์ฟผ์ธ ์คํ ํ๋ฆ
์ฟผ์ธ ์ ์คํ ํ๋ฆ์ ๊ฐ๊ฒฐํ๊ฒ ํํํด๋ณธ ๊ทธ๋ฆผ์ด๋ค.
Scheduler๊ฐ Job์ ์ ํ์ง ์คํ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ ํด์ง ์๊ฐ์ด๋ ์ฃผ๊ธฐ์ Job์ ์คํํ๋ค.
์ฟผ์ธ ๊ตฌ์ฑ ์์
1. Scheduler Factory
- Scheduler ์ธ์คํด์ค ์์ฑ ๋ด๋น ์ธํฐํ์ด์ค. ์ฌ์ฉ๋๋ Trigger๋ฅผ ๋ฑ๋ก์์ผ์ฃผ๋ ์ญํ ์ ๋ด๋นํ๋ฏ๋ก Trigger๋ค์ triggers ์์ฑ์ <list> ํ๊ทธ ํ์๋ก ๋ฑ๋ก์ํจ๋ค.
2. Scheduler
- Scheduler Factory์ ์ํด ์์ฑ๋๋ค. Quartz ์ค์ผ์ฅด๋ฌ์ ๋ฉ์ธ ์ธํฐํ์ด์ค. ์ค์ผ์ค๋ฌ๋ JobDetail๊ณผ Trigger๋ฅผ ๊ด๋ฆฌํ์ฌ, ์์ ์ ์คํํ๋ ์ญํ ์ ํ๋ค.
3. Job
- Scheduler์ ์ํด ์ํ๋ ์ค์ ์์ ์ด ๊ตฌํ๋์ด์๋ ๊ฐ์ฒด. ์ฆ, ์คํํด์ผ ํ ์์ ์ด๋ค. ์๋ฅผ ๋ค์ด ํ ์์คํ ๊ณผ ์ฐ๋์ ํตํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ก์์ ํ๊ฑฐ๋, ์๋ ๋ฉ์ผ๋ง ์ ์ก ๊ธฐ๋ฅ ๊ฐ์ ๋ฐฐ์น์ฑ ์์ ์ ๊ตฌํํ ํด๋์ค๊ฐ ์ด์ ํด๋นํ๋ค. ๊ฐ์ ๊ทธ๋ฃน์๋ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง job์ ์์ฑํ ์ ์๋ค.
4. Trigger
- Job ์ํ์ ์ํ ์กฐ๊ฑด์ ์ ์ํ ๊ฐ์ฒด๋ก, ํน์ ์๊ฐ์ด๋ ํ์, ๋ฐ๋ณต ์ฃผ๊ธฐ๋ฅผ ์ค์ ํ ์ ์๋ค. ๋ํ ์คํ๋ง์์๋ ์ฟผ์ธ ๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก 2๊ฐ์ TriggerBean์ ์ ๊ณตํ๋ค. SimpleTrigger, CronTrigger๋ ๋ ๋ค ํธ๋ฆฌ๊ฑฐ๋ผ๋ ์ ์์๋ ๋์ผํ๋ค. ํ์ง๋ง, ์คํ์กฐ๊ฑด์์ ์ฐจ์ด์ ์ ๋ณด์ธ๋ค. CronTriggerBean์ cron ํํ์ ์ด์ฉํ์ฌ ์์ฑํ๋๋ฐ, ๋ฆฌ๋ ์ค์์๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ผ๊ณ ํ๋ค. (๋ฆฌ๋ ์ค ํฌ๋ก ํญ ์ฐธ๊ณ )
<!-- crontrigger ๋ฐฉ์ -->
<bean id="quartzTestTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail"><ref bean="quartzTestServiceMethod" /></property>
<!-- ๋งค 10๋ถ๋ง๋ค ์คํํ๋ค -->
<property name="cronExpression"><value>0 0,10,20,30,40,50 * * * ?</value></property>
</bean>
<!-- simpleTrigger ๋ฐฉ์ -->
<bean id="quartzTestTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="quartzTestServiceMethod" />
<!-- ์์ํ๊ณ 1๋ถํ์ ์คํํ๋๋ก ์ค์
์๋ฒ ๊ฐ๋ ํ, ์์ํ ์๊ฐ์ ์ค์ ๊ฐ๋ฅํ๋ค. ๋จ์๋ millisecond์ด๋ค. -->
<property name="startDelay" value="60000" />
<!-- ๋งค 24์๊ฐ๋ง๋ค ์คํํ๋ค. ๋ฐ๋ณต ์๊ฐ ์ค์ . ๋จ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก millisecond -->
<property name="repeatInterval" value="864000000" />
</bean>
SimpleTrigger : ํน์ ์๊ฐ๋ ๋ฐ ํ์ ์ ์ |
CronTrigger : ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฐ๋ณต. ์ข ๋ ์ธ๋ถ์ ์ธ ์ผ์ ์ ์ค์ ํ ์ ์๋ค. |
- Trigger์ Job์ ๊ด๊ณ?
- 1 Trigger = 1 Job: ๋ฐ๋์ ํ๋์ Trigger๋ ํ๋์ Job์ ์ง์
- N Trigger = 1 Job: ํ๋์ Job์ ์ฌ๋ฌ ์๊ฐ์์ ์คํ
5. Listenr
- ์กฐ๊ธ ์ดํด๊ฐ ์ด๋ ค์ ๋ ๋ถ๋ถ. ์ฟผ์ธ ๋ฆฌ์ค๋๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ํ๋ ์์ํฌ๋ก๋ถํฐ ์ฝ๋ฐฑ์ ๋ฐ๋ ์๋ฐ ํด๋์ค๋ผ๊ณ ํ๋ค. ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์๋๋ก ํ๋ ์ธํฐํ์ด์ค๋ผ๊ณ ์๊ฐํ๋๊ฒ ๊ฐ์ฅ ๊ฐ๊ฒฐํ ๊ฒ ๊ฐ๋ค.
์ฟผ์ธ ํ๋ ์์ํฌ๋ ์ด๋ ๋ฏ Scheduler, Job, Trigger๋ฅผ ์ํ Listener๋ฅผ ์ ๊ณตํ๋ค. JobListenr๋ Job ์คํ ์ด์ , ์ดํ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์๊ณ , TriggerLIstener๋ Trigger ๋ฐ์์ด๋ ์๋ฃ, ํน์ ๋ถ๋ฐ ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์๋ค.
6. Jobstore
- Job๊ณผ Trigger ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ, ์ ์ฅ์
์ฟผ์ธ ์ ๋ฌธ์ ์ ?
์ฟผ์ธ ์ค์ผ์ค ์คํ์ ๋ํ ํ์คํ ๋ฆฌ ๊ด๋ฆฌ๊ฐ ์ด๋ ต๋ค. ์ค์ผ์ฅด ์คํ์ ๋ํ ํ์คํ ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ถ๋ค๋ฉด, ์๋น์ค ๋จ์ ์คํ๊ณผ ๊ด๋ จํ ๋ก๊ทธ๋ฅผ ๊ตฌํํ ๋ค, ADMIN UI๋ฅผ ์ง์ ๊ฐ๋ฐํ์ฌ ๊ด๋ฆฌํ์ฌ์ผํ๋ค. ์ค์ ๋ก ํ์ฌ ํ์ฌ์์๋ ์ฟผ์ธ ์ค์ผ์ฅด๋ฌ ์คํ์ ๋ํ ์ฑ๊ณต ์ฌ๋ถ๋, ์ก์์ ๋ฐ์ดํฐ ๋ก๊ทธ๋ฅผ ํ์ธํ๊ธฐ ์ํ UI๊ฐ ๋ฐ๋ก ๊ฐ๋ฐ ๋์ด์๋ค.
์ฟผ์ธ ๊ตฌํ ๋ฐฉ๋ฒ : XML์ ์ด์ฉํ Quartz Scheduler ๊ตฌํ
1. Quartz library ํ์ผ ์ถ๊ฐ
์ฟผ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ์ํ์ฌ ํ์ผ ํน์ dependency ์ถ๊ฐ. ์ฟผ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ ํ๋จ์ URL์์ ๋ค์ด๋ก๋ ํ ์ ์๋ค.
(quartz๋ฅผ ์ ์์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํ์ฌ์๋ slf4j-api jar๊ฐ ์์ด์ผํ๋ค๊ณ ํ๋ ์ฐธ๊ณ ํ๋๋ก ํ์!)
* ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ด๋ก๋ URL : http://www.quartz-scheduler.org/downloads/
2. ์คํํ Job class ๊ตฌํ
public class BatchServiceImpl implements BatchService {
public void sendSmsMessageList() throws Exception {
SimpleDateFormat format = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");
Date time = new Date();
String currentTime = format.format(time);
System.out.println(currentTime); //ํ์ฌ์๊ฐ ์ถ๋ ฅ
}
}
3. Quartz.xml ํ์ผ ๊ตฌํ
<bean id="quartzTestServiceMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- Job ๊ตฌํํ class ๊ฐ์ฒด์ bean ์ด๋ฆ์ ์ค์ ํ๋ค -->
<property name="targetObject"><ref bean="batchService" /></property>
<!-- ํด๋น class์์ ์คํํ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ๋์ด์ง ๋ฉ์๋๋ฅผ ์
ํ
ํ๋ค. -->
<property name="targetMethod"><value>sendSmsMessageList</value></property>
<!-- ๋์ ์คํ ๋ฐฉ์ง ์ต์
๋ค์์ Job์ ๋์์ ๋ฐ์์ํค๋ ค๋ฉด true๋ก ์ค์ ํ๊ณ , ์์ฐจ์ ์ผ๋ก ๋ฐ์์ํค๋ ค๋ฉด false๋ก ์ค์ ํ๋ค
(ํ๋จ์์ ์ด์ ๊ด๋ จํ ํ
์คํธ ์์ ) -->
<property name="concurrent"><value>false</value></property>
</bean>
<!-- Trigger์ค์ . cronTrigger๋ฅผ ์ฌ์ฉํ์์ผ๋ฉฐ, 30์ด๋ง๋ค ์คํ๋๋๋ก ์ค์ ํจ -->
<bean id="quartzTestTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail"><ref bean="quartzTestServiceMethod" /></property>
<property name="cronExpression"><value>0/30 * * * * ?</value></property>
</bean>
<!-- ์ค์ผ์ฅด๋ฌ ์ค์ . ์์์ ์ค์ ํ ํธ๋ฆฌ๊ฑฐ์ bean id๋ฅผ ref bean์ ์์ฑ -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="quartzTestTrigger"/>
</list>
</property>
</bean>
4. ๊ตฌ๋
์ค์ ์๋ฒ๋ฅผ ์คํ์์ผ๋ณด๋ฉด, console์ 30์ด๋ง๋ค current Time์ด ์ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Cron Expression
Cron ํํ์ ๊ธฐ๋ณธ๊ตฌ์กฐ๋ 6~7์๋ฆฌ๋ก ๊ตฌ์ฑ๋์ด์๋ค.
* * * * * * *
์ด ๋ถ ์ ์ผ ์ ์์ผ ๋ ๋(์๋ต๊ฐ๋ฅ)
ํํ์์ ๋ฒ์
์ด(Seconds) | 0~59 |
๋ถ(Minutes) | 0~59 |
์๊ฐ(Hours) | 0~23 |
๋ฌ์ ๋ ์ง(Day-of-month) | 1~31 |
๋ฌ(Month) | 1~12 / JAN~DEC |
์ฃผ์ ๋ ์ง(Day-of-week) | 1~7 / SUN~SAT |
ํํ์์ ์์
0 0 10 * * * | ๋งค์ผ 12์ ์คํ |
0 15 09 * * * | ๋งค์ผ 09์ 15๋ถ์ ์คํ |
0 * 14 * * * | ๋งค์ผ 14์์ 0๋ถ~59๋ถ๊น์ง ๋งค๋ถ ์คํ |
0 0/5 14 * * * | ๋งค์ผ 14์์ ์์ํด์ 5๋ถ ๊ฐ๊ฒฉ์ผ๋ก ์คํ |
0 0/5 14, 18 * * * | ๋งค์ผ 14์, 18์์ ์์ํด์ 5๋ถ ๊ฐ๊ฒฉ์ผ๋ก ์คํ |
0 0-5 14 * * * | ๋งค์ผ 14์์ 0,1,2,3,4,5๋ถ์ ์คํ |
0 0 20 ? * MON-FRI | ์์์ผ~๊ธ์์ผ 20์ 0๋ถ 0์ด์ ์คํ |
* /1 * * * * | ๋งค 1๋ถ๋ง๋ค ์คํ |
* ./10 * * * * | ๋งค 10๋ถ๋ง๋ค ์คํ |
0/30 * * * * ? |
๋งค 30์ด๋ง๋ค ์คํ |
0 0,10,20,30,40,50 * * * ? | ๋งค 10๋ถ๋ง๋ค ์คํ |
0 0,20,40 * * * ? | ๋งค 20๋ถ๋ง๋ค ์คํ |
0 0 1 * * ? | ๋งค์ผ 1ํ 01์ ์คํ |
0 30 1 * * ? | ๋งค์ผ 1ํ 1์ 30๋ถ ์คํ |
References
https://jaeuk2274.tistory.com/48
https://hmjkor.tistory.com/286
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ljpark6&logNo=221883162795