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";
}
}