▶ Spring Quarts 설정방법
1. <context:component-scan> 추가 => bean객체 등록시 필요
2. pom.xml에 quartz관련된 의존성 3개 추가
<!-- pom.xml -->
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<!-- quartz Jobs -->
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework-version}</version>
</dependency>
▶ Spring Quarts 작업단위(컴포넌트 3가지)
- Job : 실제로 작업할 작업단위(기능)
- Trigger : Job을 어떤 방식으로 실행시킬지 정의
- Scheduler : 만든 Trigger들을 등록해서 내가 원하는 시간에 작업이 이루어 지도록 스케쥴링하는 컴포넌트
<!-- quartz-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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!--
Job 객체 생성하기(bean객체형태)
-> 메서드 단위로 실행되는 스케쥴러(MethodInvokingJobDeatilFactoryBean)
-->
<context:component-scan base-package="com.kh.spring"></context:component-scan>
<!-- 로그인시 사용자 pwd 변경 스케쥴러 -->
<bean id="job2" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.kh.spring.common.scheduling.ChangePwdScheduler"></property>
<property name="jobDataAsMap">
<map>
<entry key="mService" value-ref="memberServiceImpl"></entry>
</map>
</property>
</bean>
<!-- Trigger
내가 만든 Job을 통해 동작의 실행방법을 정의
(보통 표현식으로 사용함)
-->
<bean id="JobTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="job2"></property>
<property name="cronExpression" value="0 0 1 1/1 * ? *"></property>
</bean>
<!-- Scheduler
위에서 정의한 Trigger를 관리하고 정의해둔 Trigger를 실행시키는 역할을 하는 객체
bean객체로 생성
-->
<bean id="jobScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 현재 생성된 스케쥴러를 통해 작동시킬 트리거 목록 -->
<property name="triggers">
<!-- list태그로 트리거들 추가 -->
<list>
<ref bean="JobTrigger2" />
</list>
</property>
</bean>
</beans>
// ChangePwdScheduler.java
/*
매일 오전 1시에 회원정보를 확인하여
사용자가 비밀번호를 변경한지 3개월이 지났다면
비밀번호를 변경할 수 있도록 DB상태값을 변경해줄 예정
1) DB에 changePwd 칼럼 추가
2) 사용자가 비밀번호변경을 안한지 3개월이 넘었다면 changePwd의 상태값을 변경해줌
3) 사용자가 로그인 시도를 할 때 changePwd값이 바꿔져 있다면 비밀번호 변경페이지로 이동
4) 비밀번호 변경하면 changePwd값은 원래 상태값으로 변경
*/
@Component
public class ChangePwdScheduler extends QuartzJobBean{
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
// jobDataAsMap에서 등록한 bean객체 가져오기
MemberService mService = (MemberService)context.getMergedJobDataMap().get("mService");
mService.updateMemberChangePwd();
}
}
public class MemberServiceImpl implements MemberService{
@Override
public void updateMemberChangePwd() {
memberDao.updateMemberChangePwd();
}
}
<!-- member-mapper.xml -->
<!-- pwd 변경한지 3개월이 경과됐다면 상태값 변경 -->
<update id="updateMemberChangePwd">
UPDATE MEMBER
SET CHANGE_PWD = 'Y'
WHERE SYSDATE > ADD_MONTHS(MODIFY_DATE, 3)
</update>