[I-Taxi] @Scheduled를 사용한 모집글 자동 삭제 기능

hhjj0506·2023년 1월 15일
0

I-Taxi

목록 보기
4/9

처음 프로젝트를 시작할 때 개발하기로 했던 기능들을 모두 개발하고 이제부터는 추가적으로 필요한 기능들을 개발해야하는 시기가 왔다. 필요할것 같은 기능들을 리스트하고 그 중 몇가지를 골라 개발하게 됐는데 내가 개발하게된 기능 중 하나가 모집글 삭제를 자동화 하는것이었다.

모집글들이 삭제되는 경우가 마지막으로 남은 유저가 방을 나가는 순간 밖에 없기 때문에 정기적으로 정해진 시간에 시간이 지난 모집글들을 삭제해주는 기능이 필요했고, 이를 위해 @Scheduled를 사용하기로 결정했다.

스케쥴링 활성화

이 아노테이션을 사용하기 위해서는 먼저 어플리케이션 메인 클래스에 @EnableScheduling을 추가해줘야 한다.

@EnableScheduling
public class ServerApplication {
	...
}

스케쥴링 메소드 작성

다음으로는 실제 스케쥴링 기능을 수행할 메소드를 작성해준다. 나는 scheduller 폴더와 파일을 따로 생성해주었다.
내가 수행해야할 기능은 repository들을 불러와 정보들을 수정한 후 저장까지 해야하기 때문에 @Service와 @RequiredArgsConstructor까지 추가해주었다.
여기서 기능을 고정된 간격으로 실행하는 fixedRate, 이전 작업 완료 이후 실행되는 fixedDelay 등의 방법등이 있지만, 삭제는 팀원들과의 협의 후 1시간마다 실행되는걸로 협의를 하여 cron 표현식을 사용했다.

Cron 표현식?

초, 분 정도로 표현하기보다 일, 월 등 더욱 넓은 범위의 시간을 표현할 때 유용하다. 왼쪽부터 오른쪽까지 초, 분, 시, 일, 월, 년을 설정할 수 있다. 더욱 자세한 사용방법은 crontab.guru를 참고

코드

@Component
@Service
@RequiredArgsConstructor
public class Scheduller {
    private final PostRepository postRepository;
    private final KTXRepository ktxRepository;

    //@Scheduled(fixedRate = 30000) // 테스트용 (30초로 설정)
    @Scheduled(cron = "0 0 * * * *") // 매시 0분에 동작하도록 설정
    public void deletePostByTime() {
        // 현재 Post와 KTX중에서 deleted = 0인것들을 가져온다
        List<Post> postList = postRepository.findByDeleted(false);
        List<KTX> ktxList = ktxRepository.findByDeleted(false);
        LocalDateTime time = LocalDateTime.now();

        // Post와 KTX를 담고 있는 List들을 iterate하며 현재 시간과 비교하여 시간이 지난 채팅방들을 삭제한다.
        for (Post post : postList) {
            if (time.isAfter(post.getDeptTime())) {
                post.setDeleted(true);
                postRepository.save(post);
            }
        }
        for (KTX ktx : ktxList) {
            if (time.isAfter(ktx.getDeptTime())) {
                ktx.setDeleted(true);
                ktxRepository.save(ktx);
            }
        }
    }
}
profile
눈부시게 높은 하늘 그보다 더 큰 꿈을 꿔

0개의 댓글