SPRING Scheduler 사용하기

조승현·2022년 9월 16일
0

스프링에서 스케쥴러 사용하여 비활성화 구현하기

Application.java 에 @EnableScheduling 추가

package com.gd.web0830;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.gd.web0830.commons.TargetInterceptor;

@SpringBootApplication
@EnableScheduling
public class Web0830Application implements WebMvcConfigurer {

	public static void main(String[] args) {
		SpringApplication.run(Web0830Application.class, args);
	}
	
}

Mapper

package com.gd.web0830.mapper;

import org.apache.ibatis.annotations.Mapper;

import com.gd.web0830.vo.Employee;

@Mapper // -> 클래스 구현(구현체)
public interface IEmployeeMapper {
	// 로그인
	Employee selectEmployeeByLogin(Employee employee);
	// lastlogin수정
	int updateEmployeeLastlogin(String employeeId);
	// active수정 - Y
	int updateEmployeeActiveY(Employee employee);
	// active수정 - N - 스프링 스케쥴러가 자동으로 실행
	int updateEmployeeActiveN();
}

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gd.web0830.mapper.IEmployeeMapper">
	<select id="selectEmployeeByLogin" parameterType="com.gd.web0830.vo.Employee" resultType="com.gd.web0830.vo.Employee">
		SELECT
			employee_id employeeId,
			employee_name employeeName,
			active
		FROM employee
		WHERE employee_id = #{employeeId} AND employee_pass = PASSWORD(#{employeePass})
	</select>
	<!-- active값이 N이면 session에 로그인정보를 설정하지 않고 휴면계정해지(아이디/패스워드 입력) 페이지로 포워드 -->
	<!-- selectEmployeeByLogin 반환값에서 active값이 Y이면 호출 -->
	<update id="updateEmployeeLastlogin" parameterType="string">
		UPDATE employee
		SET last_login = NOW()
		WHERE employee_id = #{employeeId}
	</update>
	
	<!-- 휴면계정해지 쿼리 -->
	<update id="updateEmployeeActiveY" parameterType="com.gd.web0830.vo.Employee">
		UPDATE employee
		SET active = 'Y'
		WHERE employee_id = #{employeeId} AND employee_pass = PASSWORD(#{employeePass})
	</update>	
	<!-- 마지막 로그인이 90일 이후면 휴면계정처리 쿼리 : 스프링 스케쥴러 설정으로 호출 -->
	<update id="updateEmployeeActiveN">
		UPDATE employee
		SET active = 'N'
		WHERE DATEDIFF(NOW(), last_login) > 90 and active = 'Y'
	</update>	
</mapper>

Service

package com.gd.web0830.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.gd.web0830.commons.TeamColor;
import com.gd.web0830.mapper.IEmployeeMapper;
import com.gd.web0830.vo.Employee;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
@Transactional
public class EmployeeService {
	@Autowired IEmployeeMapper employeeMapper;
	
	// 로그인
	public Employee getEmployeeByLogin(Employee employee) {
		log.debug(TeamColor.BACK_CYAN + this.getClass() + " getEmployeeByLogin()");
		Employee resultEmployee = employeeMapper.selectEmployeeByLogin(employee);
		
		log.debug(TeamColor.BACK_CYAN + this.getClass() + " " + resultEmployee);
		
		// 현재 사용가능한 사용자이면 
		if(resultEmployee != null && resultEmployee.getActive().equals("Y")) {
			// 마지막로그인 날짜를 오늘로 변경해주세요
			employeeMapper.updateEmployeeLastlogin(employee.getEmployeeId());
		}
		
		return resultEmployee;
	}
	
	// active수정 - N - 스프링 스케쥴러가 자동으로 실행
	public int modifyEmployeeActiveN() {
		log.debug(TeamColor.BACK_CYAN + this.getClass() + " modifyEmployeeActiveN()");
		return employeeMapper.updateEmployeeActiveN();
	}
	
	// active수정 - Y
	public int modifyEmployeeActiveY(Employee employee) {
		log.debug(TeamColor.BACK_CYAN + this.getClass() + " modifyEmployeeActiveY()");		
		return employeeMapper.updateEmployeeActiveY(employee);
	}
}

Scheduler.java

package com.gd.web0830.commons;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.gd.web0830.service.EmployeeService;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class EmployeeScheduler {
	@Autowired EmployeeService employeeService;
	
	@Scheduled(cron = "0 0 16 * * *")
	public void modifyEmpoyeeActiveN() {
		int row = employeeService.modifyEmployeeActiveN();
		log.debug(TeamColor.BACK_RED + row + "개의 계정이 비활성화 되었습니다.");
	}
}

Controller

package com.gd.web0830.controller;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.gd.web0830.commons.TeamColor;
import com.gd.web0830.service.EmployeeService;
import com.gd.web0830.vo.Employee;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
public class EmployeeController {
	@Autowired EmployeeService employeeService;
	// 로그인
	@GetMapping("/login")
	public String login() {
		// 디버깅
		log.debug(TeamColor.BACK_CYAN + this.getClass() + " @GetMapping(\"/login\")");
		return "login";
	}
	
	// 로그인 액션
	@PostMapping("/login")
	public String login(HttpSession session, Employee employee) {
		// 디버깅
		log.debug(TeamColor.BACK_CYAN + this.getClass() + " @PostMapping(\"/login\")");
		Employee resultEmployee = employeeService.getEmployeeByLogin(employee);
		
		// resultEmployee == null
		if(resultEmployee == null) {
			return "redirect:/login";
		}
		
		// 휴면계정
		if(resultEmployee.getActive().equals("N")) {
			return "activeYPage"; // activeYPage.jsp 아이디와 비밀번호를 입력하면 휴면계정을 활성화 -> mapper.updateEmployeeActiveY()
		}
		
		session.setAttribute("login", resultEmployee);
		
		return "redirect:/";
	}
	
	// 휴면계정 활성화
	@GetMapping("/activeYPage")
	public String activeYPage() {
		// 디버깅
		log.debug(TeamColor.BACK_CYAN + this.getClass() + " @GetMapping(\"/activeYPage\")");
		
		return "activeYPage";
	}
	
	// 휴면계정 활성화 액션
	@PostMapping("/activeYPage")
	public String activeYPage(Employee employee) {
		// 디버깅
		log.debug(TeamColor.BACK_CYAN + this.getClass() + " @PostMapping(\"/activeYPage\")");
		
		int row = employeeService.modifyEmployeeActiveY(employee);
		
		if(row == 1) {
			// 디버깅
			log.debug(TeamColor.BACK_CYAN + this.getClass() + "modifyEmployeeActiveY() 성공");
		}
		
		return "redirect:/login";
	}
}
profile
소통을 좋아하는 개발자입니다

0개의 댓글