티스토리 뷰

글쓴이의 환경은 Java 1.8 , MySQL, 이클립스는 20.06 버전을 사용했습니다.

스케쥴러를 먼저 사용하기 위해서

* SchedulerApplication 클래스

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class SchedulerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SchedulerApplication.class, args);
    }

}

 

@EnableScheduling 어노테이션을 사용

Spring boot 어플리케이션에서 스케줄러 기능을 활성하 합니다.

그 후 기능을 담당 할 클래스를 만들어줍니다.

import java.time.LocalDate;
import java.util.*;

@Component
public class schedulerTest {
	
    @Autowired 
    private MemberDAO dao;
    
    //				   초  /분 /시 /일/월/요일
    @Scheduled(cron = "*/3 * * * * *") // 매 3초마다 실행
    public void updateStatuses() {
        System.out.println("스케줄러 작동중 ");
        
        List<MemberVO> allMembers = dao.findAllMembers();
        System.out.println("All Members: " + allMembers);
        	
        LocalDate today = LocalDate.now(); //오늘 날짜 시간을 가져옴
        
     // 조회된 모든 회원에 대해 처리합니다.
        for (MemberVO member : allMembers) {
            processMember(member, today);
        }
    }
    
    private void processMember(MemberVO member, LocalDate today) {
    	// 회원의 마지막 로그인 날짜가 없는 경우 처리하지 않습니다.
        if (member.getLastLogin() == null) {
//            System.out.println("ID: " + member.getId() + " - No last login date available.");
            return;
        }
        
        // 마지막 로그인 날짜를 LocalDateTime으로 변환한 후, LocalDate로 변환합니다.
        LocalDate lastLoginDate = member.getLastLogin().toLocalDateTime().toLocalDate();
        
     // 현재 날짜와 마지막 로그인 날짜 사이의 개월 수를 계산합니다.
        long monthsSinceLastLogin = java.time.temporal.ChronoUnit.MONTHS.between(lastLoginDate, today);
        
        System.out.println("ID: " + member.getId() + ", Last Login: " + lastLoginDate + ", Months Since Last Login: " + monthsSinceLastLogin);
        
     // 마지막 로그인 날짜가 6개월 이상 지난 경우 상태를 업데이트합니다.
        if (monthsSinceLastLogin >= 6) {
            try {
            	// 회원의 상태를 업데이트합니다. (상태 업데이트 쿼리 실행)
                dao.updateStatus(member.getId());
                System.out.println("Updated status for ID: " + member.getId());
            } catch (Exception e) {
//                System.err.println("Failed to update status for ID: " + member.getId() + " due to: " + e.getMessage());
                e.printStackTrace();
            }
        }
    }
}

import는 자신에게 맞는 것으로 사용을 하시면 됩니다.

기능을 하는 클래스에서

자신이 원하는 스타일로 바꿔 사용하셔도 됩니다.

여기서 더 필요한 것은

DAO

public List<MemberVO> findAllMembers() {
	return as.selectList("member.findAllMembers");
}
//-------------------------------------------------------
//상태 업데이트
	public void updateStatus(String id) {
		as.update("member.updateStatus", id);
	}

 

Mapper

<select id="findAllMembers" resultType="memberVO">
		SELECT id,last_login AS
		lastLogin
		FROM member
	</select>
// -----------------------------------------------
    <!-- 회원상태 변경 -->
	<update id="updateStatus" parameterType="String">
		UPDATE member
		SET status = 2
		WHERE id = #{id}
	</update>

 

VO

private Timestamp lastLogin;

 

이렇게 코드를 작성하고

그 후 자신의 코드 흐름에 맞게 코드를 짜시면 동작을 잘 할 것 입니다.

저는 테스트 하려고 매 3초 마다 실행을 하도록 하였는데

자신이 원하는 시간대로 바꾸어 사용 하시면 될 것 같습니다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/06   »
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 26 27
28 29 30
글 보관함