신입 ITier로 크고 작은 프로젝트를 경험하면서 개발의 중요성을 많이 느낄 수 있었다.
주위의 수많은 초급 모델러, DBA들이 '개발까지 배워야 하느냐? 풀스택이 되려고?'라고 많은 질문을 하지만
무수한 IT기술들의 목적은 결과물 구현이고, 구현을 위해서는 개발이 필수이기 때문에
IT기술의 전반적인 구성을 알고자 개발 Base를 쌓고자한다.
개발자가 아닌 ITier뿐만 아니라, 개발을 배우고자 하는 학생들에게 도움이 되고자
개발초짜의 구현기를 적고자 한다.
진행 중인 프로젝트에서 그래프와 표를 이용하여 회원 수, 판매 금액, 활성도 등의
프로젝트 동향을 파악하자는 니즈가 생겼다.
동향을 파악하고자 필요한 기능을 고려해보니,
특정 주기마다 동작 실행이 필요하였고 해당 기능을 가지는 Scheduler를 이용하여 구현하고자 하였다.
현 프로젝트의 개발환경은 Spring으로 되어있어서, Scheduler는 Spring에서 많이 사용하는 JAVA Quartz로 구현하였다.
Spring에서 Quartz를 구현하려면 pom.xml에 아래와 같이 추가해줘야 한다.
ㆍspring-Core.jar: 스프링 코어
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.16.RELEASE</version>
<scope>compile</scope>
</dependency>
ㆍspring-context-support.jar: Quartz 지원
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
ㆍquartz.jar: quartz 코어 (http://www.quartz-scheduler.org/downloads)
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.6</version>
</dependency>
개발에 앞서 JAVA Quartz를 알아보았다.
JAVA Quartz의 구조는
ㆍQuartz 어플리케이션을 위한 런타임 환경을 관리하는 책임을 지니고,
Schedule을 동작시키는 Scheduler와
ㆍ진행 동작인 Job 그리고
ㆍ실행 시기를 담당하는 Trigger로 구성되어 있다.
Quartz를 구현할 시 중요한 것은 배치잡을 담당할 Quartz.xml와
Quartz의 동작 시 기능을 담당할 Job class이다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<!-- Scheduler -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="누적JobTrigger"/>
<ref bean="일간JobTrigger"/>
<ref bean="주간JobTrigger"/>
<ref bean="월간JobTrigger"/>
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">3</prop>
<prop key="org.quartz.threadPool.threadPriority">4</prop>
<prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
</props>
</property>
</bean>
<!-- Job -->
<bean id="일간Job" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="***.***.***.일간기능Job"/>
<property name="jobDataAsMap">
<map>
<entry key="일간기능Service" value-ref="일간기능Service" />
</map>
</property>
</bean>
<!-- Trigger -->
<bean id="일간JobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="일간Job"/>
<property name="cronExpression" value="0 0 0 * * ?" />
</bean>
...
</beans>
Quartz.xml은 Quartz의 구조와 같이
ㆍScheduler
ㆍJob
ㆍTrigger로 구성되어있다.
Quartz의 실행 주기 지정은 Trigger에서 관리하며, Cron표현식으로 조정한다.
ㆍ 문자열의 좌측부터 우측까지 초/ 분/ 시/ 일/ 월/ 요일 (/ 년) *optional
순서 |
필드 명 |
사용 가능한 값 |
---|---|---|
1 |
초 |
0~59 , - * / |
2 |
분 |
0~59 , - * / |
3 |
시 |
0~23 , - * / |
4 |
일 |
1~31 , - * ? / L W |
5 |
월 |
1~12 or JAN-DEC , - * / |
6 |
요일 |
1-7 or SUN-SAT , - * ? / L # |
7 |
년도(Optional) |
1970~2099 , - * / |
ㆍ 특수문자 의미
기호 |
의미 |
---|---|
* |
모든 수를 의미 |
? |
해당 항목을 사용하지 않음 |
- |
기간을 설정 |
, |
특정 시간을 지정 |
/ |
시작시간과 반복 간격 설정 |
L |
마지막 기간에 동작(일, 요일에서만 사용) |
W |
가장 가까운 평일 동작(일에서만 사용) |
LW |
L과 W의 조합 |
# |
몇 번째 주와 요일 설정(요일에서만 사용) |
public class 일간기능Job extends QuartzJobBean {
private 일간기능Service 일간기능Service;
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
일간기능Service.insertInput(input);
}
public void set일간기능Service(일간기능Service 일간기능Service) {
this.일간기능Service = 일간기능Service;
}
}
Job class에서는
ㆍextends QuartzJobBean
ㆍexecuteInternal
ㆍservice class를 참조한다면, 꼭 set***Service 선언해 주어야 한다.
작성자는 누적, 일간, 주간, 월간 통계를 구현하기 위하여
Quartz.xml에서 각각의 Job과 Trigger을 선언하여 4개 주기의 추이를 파악할 수 있었고,
현재 각 주기별 회원, 판매, 활성도 등의 데이터를 수집하고 있다.
이러한 데이터를 효율적으로 운용하기위해 표와 그래프로 시각화 하여 사용을 하고 있다.
그래프를 그리는 기술은 추후 api 적용 구현기의 예시로 다뤄보고자 한다.
Quartz를 처음 사용하는 것이라 숙지하는데 많은 시행착오와 시간이 소모되었지만,
구글링을 통해 구현하며 접할 수 있었던 수많은 정보 중에
개발에 도움이 되었던 정보들만 모아 구현기를 적어보았다.
Quartz.xml의 Scheduler, Job, 그리고 Trigger의 각각의 역할을 맞게 구현하고,
각 Schedule의 기능에 맞게 job class를 선언한다면 쉽게 구현할 수 있을 것이라 생각한다.
잘 보고 갑니다
잘 보고 갑니다.
잘 보고 갑니다.