1. 개요 간단한 ItemReader를 작성한 후 실행시켰는데 다음과 같은 트랜잭션 관련 에러가 발생했다. java.lang.IllegalStateException: Transaction already active at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:74) ~[hibernate-core-5.6.15.Final.jar:5.6.15.Final] at org.springframework.batch.item.database.JpaPagingItemReader.doReadPage(JpaPagingItemReader.java:193) ~[spring-batch-infrastructure-4.3...
1. 개요 JpaPagingItemReaderBuilder를 사용해 Paging Query를 처리하려 했는데, 다음과 같은 에러가 발생했다. 결론부터 말하자면 메서드의 반환타입이 문제였다. java.lang.NullPointerException: null at org.springframework.batch.item.database.JpaPagingItemReader.doReadPage(JpaPagingItemReader.java:192) ~[spring-batch-infrastructure-4.3.8.jar:4.3.8] ... ItemReader는 다음과 같이 선언했다. @Bean @StepScope public ItemReader trafficAggregationItemReader() { return ..
1. 스텝이란? 잡이 전체적인 처리를 지칭하는 반면, 스텝은 잡의 구성 요소를 담당한다. 스텝(step)은 모든 단위 작업의 조각으로서 트랜잭션 내에서 자체적으로 입/출력을 처리한다. 즉, 스텝을 정의하자면 독립적이고 순차적으로 배치 처리를 수행하는 잡의 하위 컴포넌트라고 할 수 있다. 배치 처리는 일반적으로 데이터 처리와 관련이 있는데, 데이터 처리를 위한 태스크릿(Tasklet) 모델과 청크(Chunk) 기반 처리 모델 두 가지 유형의 처리 모델을 지원한다. 1) 태스크릿 모델 단일 명령만 실행하는 작업에 적합 삭제 SQL문 실행, 디렉터리를 정리하는 셸 스크립트, 알림 메일 전송 등 Tasklet 인터페이스를 사용해 Tasklet.execute 메서드가 RepeatStatus.FINISHED를 반환..
1. 잡이란? 잡(job)은 처음부터 끝까지 독립적으로 실행할 수 있는 고유하며 순서가 지정된 여러 스텝의 목록이다. 이 정의가 너무 장황하다면 이전에 설명했던 대로 "배치로 수행할 전체 작업" 정도로 생각해도 무방할 것 같다. 잡의 특성은 다음과 같다. 1) 유일하다 잡은 동일한 구성으로 반복적으로 실행할 수 있다 2) 순서를 가진 여러 스탭의 목록이다 잡은 모든 스텝을 논리적으로 실행할 수 있도록 구성된다 어떤 일련의 과정을 거쳐야만 비로소 전체 작업이 달성되는 것이다 3) 처음부터 끝까지 실행 가능하다 외부 의존성 없이 실행할 수 있는 일련의 스텝이다 즉, 이전 스텝 작업의 결과를 기다리는 식으로 잡을 구성하는 것이 아니라 시작을 바로 할 수 있는 시점에 잡이 시작되도록 잡을 구성해야 한다는 것이다..
배치 애플리케이션의 개념과 스프링 배치의 대략적인 개요는 여기를 참고하자. 여기서는 전체적인 그림만 그리고 세부적인 사항과 구현은 별도의 포스팅으로 다룰 예정이다. 1. 스프링 배치 기본 구조 스프링 배치는 세 개의 티어로 구성된 레이어 구조로 이루어져있다. 1) 애플리케이션 레이어 (Application Layer) 배치 처리 구축에 사용되는 모든 사용자 코드와 구성 비즈니스 로직, 서비스, 잡 구조화와 관련된 구성을 포함한다 코어와 인프라스트럭처를 이용해 배치의 기능을 만든다 2) 코어 레이어 (Core Layer) 배치 도메인을 정의하는 모든 부분이 포함된다 Job, Step, JobLauncher, JobParamters 3) 인프라스트럭처 레이어 외부와 상호작용을 담당한다 파일, 데이터베이스와의..