BackEnd/Spring

[SpringBoot] @EnableScheduling - 스프링 스케쥴러로 Cron 작업 돌리기

PgmJUN 2021. 12. 22. 00:08

 

 

 

이번 시간엔 스프링의 @Scheduled 어노테이션을 사용해 매일 00시마다 공공 데이터 포털에서 최신 주차장 데이터 CSV 파일을 받아와 파싱하고 데이터를 DB에 저장하는 데이터 자동 최신화 로직을 개발해보려한다.

 

바로 시작해보자.

 

 


기본 세팅

 

 

우선 스케쥴러를 사용하려면 main 메서드의 클래스에 @EnableScheduling 어노테이션을 추가해주어야한다.

 

@EnableScheduling
@ServletComponentScan
@SpringBootApplication
class ParkingServiceApplication {

   public static void main(String[] args) {
      SpringApplication.run(ParkingServiceApplication.class, args);

   }

}

 

기본 세팅이 끝났으니 이제 공공데이터 포털에서 CSV 파일을 받아와 data.csv 라는 이름으로 프로젝트 폴더에 저장하는 기능을 구현해보자.

 

 


배치 파일 생성

 

 

CSV 파일을 다운받는 부분은 배치파일로 구현하려한다. 

 

배치파일이란 명령 인터프리터에 의해 실행되게끔 고안된 명령어들이 나열되어 있는 텍스트 파일이다.

 

즉 우리가 흔히 알고있는 cmd창에서 실행할 명령어를 텍스트파일에 적어둔 것이라고 생각하면 편하다.

 

 

배치파일을 만들기 위해 우선 메모장 파일을 생성한다.

 

'텍스트 문서' 파일 생성

 

그리고 내부에 실행할 로직을 적어준다.

 

배치파일 로직

 

D: -> 로컬디스크D로 이동

 

cd [경로] -> CSV파일을 저장할 경로로 이동

 

curl [url] > data.csv -> url에서 받은 csv 파일을 data.csv 라는 이름으로 현재 경로에 저장

 

exit -> 배치파일 종료

 

다른 이름으로 저장

 

이렇게 로직 구성을 마치면 '다른 이름으로 저장' 을 선택하고 파일 이름 뒤에 .bat 을 붙여준다.

 

생성된 배치파일

 

CSV 파일을 받아와 지정된 경로에 data.csv 라는 이름으로 저장해 주는 배치파일 AutoCSVInstall.bat을 생성했다.

 

이 파일을 자신이 두고 사용할 레파지토리에 이동시키도록 하자.

 

 

이제 배치파일을 매일 00시마다 자동으로 실행시켜주는 로직만 구성하면 자동화 작업은 끝난다.

 

 


스케쥴러로 자동화 로직 구성

 

 

초기 세팅해놓은 @EnableScheduling 어노테이션의 @Scheduled 어노테이션으로 배치파일을 00시마다 자동 실행되도록 만들 것이다.

 

AutoCSVParser.java

@Component
public class AutoCSVParser {

    private ParkRepository parkingRepository;

    @Autowired
    public AutoCSVParser(ParkRepository parkingRepository) {
        this.parkingRepository = parkingRepository;
    }

    @Scheduled(cron = "0 0 0 * * *")        //cron = 초 분 시 일 월 요일
    public void parse() {

        Runtime runtime = Runtime.getRuntime();
        try {
            Process p1 = runtime.exec("cmd /c start D:\\project\\ParkingService\\src\\main\\java\\jh\\ParkingService\\repository\\park\\autoCsvInstall.bat");
            InputStream is = p1.getInputStream();
            int i = 0;
            while ((i = is.read()) != -1) {
                System.out.print((char) i);
            }
            parkingRepository.save();
        } catch (IOException ioException) {
            System.out.println(ioException.getMessage());
        }
    }
}

 

@Scheduled 어노테이션으로 매일 0시 0분 0초에 parse 함수를 수행하도록 cron을 설정했다.

 

아래의 내용들은 배치파일을 실행시켜 CSV 파일을 받아오고 ParkRepository의 save()함수로 최신화된 데이터를 저장하는 로직이다.

 

배치파일의 경로는 runtime.exec 함수 내에 start의 뒷 부분에 기입해주면 된다.

 

 


결과 확인

 

 

실행 결과를 확인하기 위해 @Scheduled 어노테이션 의 cron을 당시 시간인 23시 48분 0초로 변경하였다.

 

정상 작동하는 'AutoCSVParser' - 1

 

스케쥴러가 지정한 시간이 되자 배치파일을 실행시켜 CSV파일을 최신화시켰다.

 

정상 작동하는 'AutoCSVParser' - 2

 

save() 함수 또한 제대로 작동하며 주차장 데이터 자동 최신화 로직 구현을 성공적으로 마쳤다.

 

 

 

 

이렇게해서 주차장 데이터 최신화 로직 구현에 성공했습니다. 스프링의 스케쥴러 덕분에 어렵지 않게 구현할 수 있었던 것 같습니다. 

 

자바의 다양한 라이브러리와 스프링의 어노테이션들을 공부하면 여러 기능들을 쉽게 구현할 수 있을 것 같아 많이 찾아보고 공부해봐야 할 것 같습니다!

 

모두들 읽어주셔서 감사하고 다음 포스팅으로 찾아뵙겠습니다!

728x90
반응형