Post

[Java] ์ฟผ์ธ (Quartz)

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

ํ˜„์žฌ RPA ๊ฐœ๋ฐœ์ž๋กœ ์ผํ•˜๋ฉฐ ๋กœ๋ด‡๋“ค์—๊ฒŒ ์—…๋ฌด๋ฅผ ์Šค์ผ€์ค„๋งํ•  ๋•Œ ํ•„์ˆ˜์ ์œผ๋กœ ์“ฐ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ Quartz๋‹ค. ๊ทธ๋™์•ˆ RPA ์†”๋ฃจ์…˜์˜ ํ’€์Šคํƒ ๊ฐœ๋ฐœ๋งŒ ํ•˜๋ฉด์„œ ์Šค์ผ€์ค„๋ง ์ปค์Šคํ…€์„ ๊นŠ๊ฒŒ ํŒŒ์ง€ ๋ชปํ–ˆ๋Š”๋ฐ, ์ด์ œ ๋”ฅ๋‹ค์ด๋ธŒํ•ด๋ณด๊ณ  ์‹ถ์–ด ์ •๋ฆฌํ•œ๋‹ค.

Quartz๋ž€? ์˜คํ”ˆ ์†Œ์Šค์˜ ์ž๋ฐ” ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง ํ”„๋ ˆ์ž„์›Œํฌ. ๋ฐ˜๋ณต์ ์ด๊ณ  ์˜ˆ์•ฝ๋œ ์ž‘์—…์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๋‹ค์–‘ํ•œ ์„ค์ • ์˜ต์…˜์œผ๋กœ ํญ๋„“์€ ์Šค์ผ€์ค„๋ง ์š”๊ตฌ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•œ๋‹ค.


1. ๊ธฐ๋ณธ ๊ฐœ๋… โ€” Job ยท Trigger ยท Scheduler

Quartz๋Š” ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์š”์†Œ๋กœ ๋™์ž‘ํ•œ๋‹ค. ๋ฌด์—‡์„(Job), ์–ธ์ œ(Trigger), ๋ˆ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋‚˜(Scheduler)๋กœ ๋‚˜๋‰œ๋‹ค.

์š”์†Œ์—ญํ• 
Job์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์‹ค์ œ ์ž‘์—…์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค (๋ฌด์—‡์„)
TriggerJob์ด ์–ธ์ œ ์‹คํ–‰๋ ์ง€ ์ •์˜ (ํŠน์ • ์‹œ๊ฐ„ยท์ฃผ๊ธฐยท์ด๋ฒคํŠธ)
SchedulerJob๊ณผ Trigger๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‹คํ–‰ ์‹œ์ ์„ ์ œ์–ดํ•˜๋Š” ํ•ต์‹ฌ
1
2
3
Scheduler (๊ด€๋ฆฌยท์‹คํ–‰)
   โ”œโ”€ Job      "๋ฌด์—‡์„ ์‹คํ–‰ํ• ๊นŒ?"  (MyJob.execute)
   โ””โ”€ Trigger  "์–ธ์ œ ์‹คํ–‰ํ• ๊นŒ?"    (5์ดˆ๋งˆ๋‹ค, ๋งค์ผ 09์‹œ ๋“ฑ)

2. ์‚ฌ์šฉ๋ฒ•

โ‘  ์˜์กด์„ฑ ์ถ”๊ฐ€

1
2
3
4
5
6
<!-- Maven -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>

โ‘ก Job ํด๋ž˜์Šค ์ž‘์„ฑ

์‹คํ–‰ํ•  ์ž‘์—…์„ Job ์ธํ„ฐํŽ˜์ด์Šค์˜ execute()์— ๊ตฌํ˜„ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•  ์ž‘์—… ๋‚ด์šฉ
        System.out.println("Quartz Job ์‹คํ–‰: " + System.currentTimeMillis());
    }
}

โ‘ข TriggerยทScheduler ์„ค์ •

Trigger๋กœ ์‹คํ–‰ ์กฐ๊ฑด์„ ์ •ํ•˜๊ณ , Scheduler๋ฅผ ์‹œ์ž‘ํ•ด Job์„ ๋“ฑ๋กํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzExample {
    public static void main(String[] args) throws SchedulerException {
        // JobDetail ์ƒ์„ฑ
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                .withIdentity("myJob", "group1")
                .build();

        // Trigger ์ƒ์„ฑ - 5์ดˆ๋งˆ๋‹ค ์‹คํ–‰
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger", "group1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(5)
                        .repeatForever())
                .build();

        // Scheduler ์ƒ์„ฑ ๋ฐ ์‹œ์ž‘
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
    }
}

์œ„ ์˜ˆ์‹œ๋Š” MyJob์„ 5์ดˆ๋งˆ๋‹ค ์‹คํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•œ ๊ฒƒ์ด๋‹ค.


๐Ÿ“Œ ์ฃผ์˜์‚ฌํ•ญ ๋ฐ ํŒ

ํ•ญ๋ชฉ๋‚ด์šฉ
์„ธ๋ฐ€ํ•œ ์„ค์ •์„ค์ • ์˜ต์…˜์ด ๋งค์šฐ ๋‹ค์–‘ โ†’ ๊ณต์‹ ๋ฌธ์„œ ์ฐธ๊ณ  ๊ถŒ์žฅ
์˜ˆ์™ธ ์ฒ˜๋ฆฌJob์—์„œ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ํ•ด๋‹น Job์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ค‘๋‹จ๋จ โ†’ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฃผ์˜
ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ์ž‘์—…์„ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ

๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
Quartz ์Šค์ผ€์ค„๋ง
โ”œโ”€ Job        ๋ฌด์—‡์„ ์‹คํ–‰ํ• ์ง€ (execute ๊ตฌํ˜„)
โ”œโ”€ Trigger    ์–ธ์ œ ์‹คํ–‰ํ• ์ง€ (์ฃผ๊ธฐยท์‹œ๊ฐ„ยท์ด๋ฒคํŠธ)
โ”œโ”€ Scheduler  Job+Trigger ๊ด€๋ฆฌ ๋ฐ ์‹คํ–‰ ์‹œ์  ์ œ์–ด
โ””โ”€ ํŠน์ง•       ์„ธ๋ฐ€ํ•œ ์„ค์ • ยท ์˜ˆ์™ธ ์‹œ ์ค‘๋‹จ ยท ํด๋Ÿฌ์Šคํ„ฐ ๋ถ„์‚ฐ
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
Quartz์ž๋ฐ” ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง ํ”„๋ ˆ์ž„์›Œํฌ
Job / Trigger / Scheduler๋ฌด์—‡์„ / ์–ธ์ œ / ๋ˆ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋‚˜

Quartz๋Š” โ€œ๋ฌด์—‡์„(Job) ์–ธ์ œ(Trigger) ์‹คํ–‰ํ• ์ง€โ€๋ฅผ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋‹ค. ์ด ์‚ผ๊ฐ ๊ตฌ์กฐ๋งŒ ์ดํ•ดํ•˜๋ฉด, ๋ณต์žกํ•œ ๋ฐ˜๋ณต ์ž‘์—…๋„ ์ฒด๊ณ„์ ์œผ๋กœ ์˜ˆ์•ฝยท๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.