회사에 입사하고,
Spring Batch와 Scheduler로 구성된 배치서버를 처음 봤다.
그리고 배치 API를 만들어서 해당 스케쥴러로 돌리는 거 까지 성공했다.
이 과정에 있어서 이해하고, 막혔던 부분에 대해서 블로깅을 해보도록 하겠다.
일단 Spring Batch란
Spring에서 제공하는 프레임워크 중에 하나이다.
기본적으로 JOB을 등록해서 사용하며, BatchConfiguration과 Step으로 관리한다.
BatchConfiguration은 BatchJob을 등록하는 곳이다.
기본적으로 BatchConfiguration에서 BatchStep을 등록하고 이 Step에 대한 Job을 빈으로 등록한다.
그리고 이제 Step
Step은 보통 reader와 writer로 나누어져 있고, 이 사이에 processor라는 클래스가 존재를 할 수도 있고, 안 할 수 도 있다.
기본적으로 reader로 시작하여 말 그대로 필요한 정보를 가져온다.
이제 그 정보를 가져온 담에 processor 혹은 writer 클래스로 넘겨서 비즈니스 로직을 처리한다.
로직을 처리 후에 writer는 연결된 DB로 데이터를 저장하거나 혹은 추후의 과정으로 진행된다.
근데 이렇게 사용되는 Batch는 스스로 동작할 수 없다. JOB을 따로 Bean으로 저장을 해놨지만 어느 부분도 JOB을 실질적으로 실행하는 부분이 없기 때문이다.(REST API로 end point로 만들거나 사용하는 클래스에서 콜을 하는 방법은 있다.)
그러므로 Scheduler를 사용해서 등록된 JOB을 call 하여서 사용하게 된다.
사실 Batch 프로세스를 1번 실행하는 건 Batah 서버만 있어도 충분히 실행이 가능(위와 같은 방법으로)하지만 Scheduler를 사용하는 이유는 Batch서버가 스스로 일정한 시간에 어떤 로직을 처리하는 걸 원하기 때문에 사용하는 것이다. 사용자의 어떠한 컨트롤 없이 저장된 시간에 등록된 Batch JOB을 실행하기 위해서는 Scheduler를 사용하는 게 좋다.
Spring에서는 보통 Spring Scheduler 혹은 Quartz Scheduler를 채택하게 되는데, 난 원래 존재하는 프로젝트를 받은 거라 Quartz Scheduler를 사용한 상태였다.
둘의 차이는 인터넷에 찾아보니 Spring Scheduler는 좀 단순한 느낌 Quartz Scheduler는 좀 더 복잡한 느낌이었다.(더 다양한 기능이 있다.)
그래서 Quartz Scheduler에 대해서 말해보자면, 이 프레임워크도 기본적으로 Configuration을 갖는다. 그리고 JobLauncher를 가진다.
QuartzConfiguration에서는 JobLauncher class를 불러오면서 사용되게 된다. 일반적으로 QuartzConfiguration에서는 CRON_EXPRESSSION을 불러와서 저장하는 역할을 한다. 당연히 QuartzConfiguration은 주기적으로 배치를 실행하게 만드는 설정 class이기 때문이다. yml에 CRON_EXPRESSSION정의해서 가져오게 되면 @Bean으로 각각의 배치를 매핑해 주고 마지막으로
이런 식의 트리거로 빈을 매핑해 준다. 이후에 서버를 열어놓으면
위와 같이 설정(yml)된 시간에 쿼츠 스케쥴러가 실행된다.
위의 표현식은
위와 같은 표현식으로 된다. 예를 들어서
00 11 09 * * ? * -> 매년 매월 매일 09시 11분에 해당되는 배치잡 시작 (? 는 설정 값없음으로 일과 요일에만 설정가능)
이라고 생각하면 된다.
이거는 근데 기본적인 것들이고, 이 부분을 코딩하게 되면서 제일 힘든 부분이 있었는데, 그 부분이 바로 새로운 batch를 만들었는데, 아무 오류도 안 나오고 배치가 완료됐다고 나오는 것이었다.....
batch step에 txt혹은 json으로 되어있는 데이터를 구분자로 나눠진 걸 읽어서 DB에 저장하는 것이었는데, 파일을 객체형태로 잘 변환해서 Model까지 toString이 찍히는 걸 확인을 했는데도 아무 오류도 없이 save가 진행이 되었다고 나오는 것이었다.(결과는 저장이 안 됐다.)
대체 뭘까하면서 머리를 혼자 싸매고 생각해 봤지만 3일 정도 이 이슈로 진행이 잘 안돼서 결국 StackOverFlow에 물어보게 되었는데
아랍계 분이 batchConfiguration에서 트랜잭션을 다시 한번 재설정해보라는 것이었다.
그래서 딱
이 부분을 추가하니 기가 막히게 돌아가게 되었다... (역시 아랍...)
째든 하면서 이것저것 어려운 것도 많았지만 처음 해보는 거라 신기하기도 했다.
다만, 갑과의 인터페이스가 맞는 게 생각보다 없어서 매번 들어오는 데이터값의 length가 overflow 나서 DB의 데이터 구조를 수정하게 되었지만 말이다... (일주일째 데이터 받고 있는데, 아직도 종종 그러는 중...)
째든 처음 하는 거 치고는 굉장히 재미있는 부분이었다고 생각된다. 다음에는 파일을 받기 위해 환경을 만든 걸 포스팅하도록 해야겠다.
'Back-End > SpringBatch' 카테고리의 다른 글
Spring Batch를 진행하기위해서 만드는 작업들..(S3, ShellScript 등) (0) | 2023.07.26 |
---|
댓글