AuthTokenCleanupJob.java
역할
- 폐기된(refreshToken revoked) 토큰을 주기적으로 DB에서 물리 삭제
- DB 용량 증가 방지 및 인덱스 성능 유지
- 배치 실행 여부/주기/보관 기간 환경 설정 가능
1. 구조
@Component
public class AuthTokenCleanupJob {
private final AuthRepository authRepository;
// application.yml 또는 properties에서
// 토큰 정리 기능 활성화 여부를 설정
// 기본값 true
@Value("${app.token-cleanup.enabled:true}")
private boolean enabled;
// revoked 토큰을 몇 일 보관 후 삭제할지 설정
// 기본 1일
@Value("${app.token-cleanup.days:1}")
private int days;
public AuthTokenCleanupJob(AuthRepository authRepository) {
this.authRepository = authRepository;
}
// 매일 새벽 3시 실행
// @Scheduled(cron = "0 0 3 * * ?")
// 10분
// fixedDelay는 "이전 작업이 끝난 후" 지정 시간 뒤에 다시 실행
// 지금 설정은 600000ms = 10분마다 실행
// 절대 시간 기준이 아니라 작업 완료 기준임
@Scheduled(fixedDelay = 600000)
@Transactional
public void cleanupRevokedTokens() {
// enabled=false면 배치 아예 실행 안함
// 로컬/개발 환경에서 끄기 좋음
if (!enabled) return;
// 현재 시간 기준으로 days 만큼 이전 시점 계산
// 예: days=1이면 하루 전
LocalDateTime cutoff = LocalDateTime.now().minusDays(days);
// revokedAt이 존재하고
// cutoff 이전에 폐기된 토큰을 물리 삭제
// DB 용량 증가 방지 + 인덱스 성능 유지 목적
authRepository.deleteRevokedBefore(cutoff);
}
}
2. 동작 설명
- enabled: 배치 활성화 여부 (
true/false)
- days: 폐기된 토큰 보관 기간 (기본 1일)
- 예: days=1 → 하루 전 revoked 토큰 삭제
- @Scheduled(fixedDelay = 600000)
- 이전 작업 완료 후 10분 뒤 실행
- cron 대신 fixedDelay 사용 → 작업 중첩 방지
- cleanupRevokedTokens()
- DB에서
revokedAt이 존재하고, cutoff 이전 토큰 삭제
authRepository.deleteRevokedBefore(cutoff) 호출
3. 포인트
- 보안/성능 관리
- 로그아웃된 토큰이 DB에 계속 남아 있으면 인덱스 성능 저하 및 DB 용량 증가
- 배치를 통해 정리 → 효율적 운영
- 환경 기반 유연성
enabled, days 값을 환경설정에서 쉽게 조정 가능
- 트랜잭션 처리
- 삭제 작업 시
@Transactional → 안전하게 DB 반영
- 스케줄링 전략
- fixedDelay 사용 → 이전 작업 종료 후 지연 시간 기반 재실행, 중첩 방지