발송하고 인증되지 않은 이메일을 삭제하기 위해 스프링 스케쥴러를 사용했다.
@SpringBootApplication
@EnableJpaAuditing
@EnableScheduling
class DailywriteApplication
fun main(args: Array<String>) {
runApplication<DailywriteApplication>(*args)
}
먼저, 메인 어플리케이션 클래스에 @EnableScheduling을 통해 스케쥴러를 활성화 시켜준다.
@Scheduled(cron = "0 0 0 1/1 * *")
이메일이 자동으로 삭제될 수 있도록 코드를 작성했다.
@Scheduled
어노테이션을 통해 스케쥴을 입력해 준다.
fixedDelay
: milliseconds 단위로, 이전 Task의 종료 시점으로부터 정의된 시간 만큼 지난 이후 Task를 실행한다.
fixedRate
: milliseconds 단위로, 이전 Task의 시작 지점으로부터 정의된 시간 만큼 지난 이후 Task를 실행한다.
fixedDelay
와fixedRate
의 차이점은 아래와 같다.
cron
: Cron 표현식을 사용하여 작업을 예약할 수 있다.
특정 시간에 특정 작업을 예약하려는 나는 Cron을 사용해야 한다.
Cron 표현식은 무엇일까?
필드명 | 값의 허용 범위 | 허용된 특수문자 |
---|---|---|
초 | 0 ~ 59 | , - * / |
분 | 0 ~ 59 | , - * / |
시 | 0 ~ 23 | , - * / |
일 | 1 ~ 31 | , - * ? / L W |
월 | 1 ~ 12 or JAN ~ DEC | , - * / |
요일 | 0 ~ 6 or SUN ~ SAT(7도 일요일) | , - * ? / L # |
연도 | empty or 1970 ~ 2099 | , - * / |
각 자리에 위와 같은 정보를 담을 수 있다.
특수문자의 의미는 아래와 같다.
*
: 모든 값?
: 특정한 값이 없음-
: 범위 (MON-WED : 월요일부터 수요일까지),
: 값을 지정함 (MON,WED : 월요일과 수요일만)/
: 시작시간 / 단위 (0/5 : 0초부터 5초 마다 계속)L
: 가장 마지막 (일자에서 사용할 경우 28, 30, 31일, 요일에서 사용할 경우 토요일)W
: 가장 가까운 평일 (20W는 20일에서 가장 가까운 평일 (월~금)을 찾음)#
: 몇째 주의 무슨 요일을 표현함 (6#2 : 두 번째 주 토요일)물론 알면 좋겠지만, 툴을 사용해 간편하게 Cron 표현식을 사용할 수 있다.
내게 필요한 툴을 찾고 잘 사용하는 것도 중요한 능력 중 하나다.
@Scheduled(cron = "0 0 0 1/1 * *")
override fun deleteMail() {
val mailCheck = LocalDateTime.now().minusDays(2)
mailRepository.deleteBySendDateBefore(mailCheck)
생각보다 너무 간단하게 메일 삭제 로직이 완성되었다.
JPA에도 아래와 같이 추가해 준다.
fun deleteBySendDateBefore (date: LocalDateTime)