spring batch 를 이용할때 어떤 reader 를 이용할지 항상 고민되는 편이다. DB 접근을 JPA 로 하고 있다면 대표적으로 JpaCursorItemReader, JpaPagingItemReader 중에 고민하게 된다. 보통 이 둘을 고민하는 상황이 오면 성능적으론 JpaCursorItemReader 가 더 좋다는걸 알게 된다. 하지만 대량의 데이터를 조회한 후 커서를 이동시키는 이 방식은 타임아웃을 유발할 수 있기에 데이터가 많을땐 조심해야해서, 이런 문제에 대해 안전한 JpaPagingItemReader 를 선택하는 경우가 많다. 하지만 페이징 기반의 리더를 쓰게되면 몇가지 곤란한 부분이 있는데 대표적으로 특정 상태를 이용해 조회한 후 상태를 변경하는 방식의 배치 잡을 만들때다. 1페이지를..
spring batch 4.3 부터 JpaCursorItemReader 가 추가됐다. 이게 추가되기 이전에는 배치에서 JPA 를 쓸땐 JpaPagingItemReader 를 사용하거나 cursor 방식이 필요하다면 HibernateCursorItemReader 를 써야했다. JpaCursorItemReader 가 추가된지 비교적 얼마 안됐기때문에 아직 HibernateCursorItemReader 를 이용해 돌아가고있는 배치가 많을 것으로 예상한다. 하지만 HibernateCursorItemReader 는 spring batch 5.0 부터 Deprecate 되었고, 5.2 부터는 아예 삭제될 예정이므로 최신 spring batch 에서 배치 로직을 작성하거나 기존 spring batch 프로젝트의 버전..
spring batch 를 이용하여 배치를 만들때 job 설정은 아래와 같이 JobbuilderFactory 를 주입받아 이를 이용한다.@Configurationpublic class SimpleBatchConfiguration { @Autowired private JobBuilderFactory jobBuilderFactory; @Bean public Job simpleJob(Step step) { return this.jobBuilderFactory.get("simpleJob") .start(step) .build(); }} 하지만 현재 최신버전(3.2.5)의 spring boot 를 이용한다면 해당 클래스가..
spring batch 를 이용해 많은 batch job 을 만들지만 배치를 테스트하기란 쉽지않다. 하지만 배치도 분명한 하나의 애플리케이션인만큼 테스트 작성에 대한 욕구가 있었는데 그것들을 정리해보고자한다. 먼저 spring batch reference 에서 테스트 코드에 대해 가이드하고있는 부분이 있는데 가이드 문서가 불친절해 제대로 테스트를 작성하기 힘들었다. 실전 엔터프라이즈 애플리케이션에서는 해당 가이드대로 했을때 도저히 테스트를 구동할 수 없었고, 많은 삽질끝에 얻은 결론을 정리하려한다. # batch job 작성 @Configuration class SampleBatch( private val jobBuilderFactory: JobBuilderFactory, private val stepB..
spring batch 에서 JdbcPagingItemReader 를 이용해서 데이터를 조회하는 코드를 작성했다. 이후 배치 잡을 실행했는데 아래와 같은 에러 메세지와 함께 잡이 실패했다. Column 'column4' not found.; nested exception is java.sql.SQLException: Column 'column4' not found. column4 는 임의로 이름을 바꾼거고, 실제로 존재하는 컬럼명을 넣었었다. 혹시 컬럼명에 오타가 있는건가 해서 오타도 확인해보고, 실제로 쿼리를 직접 SQL 에서 실행할때는 잘 돌아가는 것까지 확인했다. JdbcPagingItemReader 를 만드는 코드도 일반적인 관례를 따랐으며, QueryProvider 를 이용했다. SqlPagin..
spring 에서는 멀티스레드 활용을 위해 jdk 에서 제공하는 Executor 인터페이스를 확장한 TaskExecutor 인터페이스를 근간으로 활용하고있다. 아마도 개발자들은 TaskExecutor 구현체로 ThreadPoolTaskExecutor 를 사용하고, spring 에서 제공하는 @Async 애노테이션을 활용한 멀티스레드 프로그래밍을 많이 할 것 같다. 보통 spring-batch 로 spring 을 처음 접하는 경우는 흔치 않을 것이고, spring-mvc 와 같은 web 프로젝트로 spring 에 대해 접한 후 spring-batch 도 접하게 되는 경우가 많을텐데, 이때 기존에 알고있던 spring 의 멀티스레드 프로그래밍 경험으로 코드를 작성하면 job 실행 이후 jvm 이 종료되지 ..
spring batch 에서 chunk oriented 방식을 이용해 로직을 작성하다보면 reader-writer 쌍이 필요해진다. 이때 JPA 를 사용하고 있다면 JpaPagingItemReader 와 JpaItemWriter 를 많이 이용하게 될텐데 이때 writer 에서 저장하는게 신규 엔티티라면 문제가 없지만 기존 엔티티의 업데이트라면 원치않는 select 쿼리가 날아가는걸 경험할 수 있다. public Step chunkStep1() { return stepBuilderFactory.get("chunkStep1") .chunk(500) .reader(chunkReader()) .processor(chunkProcessor()) .writer(chunkWriter()) .build(); } @Be..
spring batch 를 이용하면 JobBuilderFactory, StepBuilderFactory 를 이용해 코드를 작성하게 된다. 이때 factory 가 제공해주는 다양한 속성들이 있는데, 나같은 경우 자동완성으로 뜨긴뜨는데 뭐하는건지 명확히 모르고 그냥 사용하던 것만 사용하고 있었다. 이것들을 한번 정리해본다. preventRestart spring batch 는 job name 과 job parameters 를 이용해 job 인스턴스를 식별한다. job 이 실패했을경우 동일한 식별정보로 job 실행요청이 들어오면 실패한 step 부터 job 을 실행하게되는데 preventRestart 가 설정되어있으면 예외를 일으켜 잡이 다시 실행되는걸 막는다. allowStartIfComplete A job..
spring batch 에서 Step 라이프사이클을 활용해 step 이 실행되기전 선작업이 필요한 경우 2가지 방법이 있다. StepExecutionListener 인터페이스를 구현하는 방법과 @BeforeStep 애노테이션을 이용해 선언적으로 명시하는 방법이다. - StepExecutionListener 인터페이스를 구현하는 방식(인터페이스의 추상메서드들을 기본으로 구현해주는 스켈레톤 클래스인 StepExecutionListenerSupport 를 상속받았다.) class SampleTasklet : Tasklet, StepExecutionListenerSupport() { override fun execute(contribution: StepContribution, chunkContext: Chunk..
spring batch 에서는 batch 메타 테이블을 이용해 배치 잡의 메타 데이터들을 관리해준다. job 의 실행 이력, 들어온 job parameters, 실행 결과 등을 말이다. 이 메타 테이블에 있는 정보를 이용해 spring batch 는 이전에 실행 이력이 있는 파라미터로 job 요청이 들어오면 job 실행을 중단할 수 있다. 하지만 이런식으로 job 실행을 막는건 여러모로 불편할때가 있다. 그래서 이를 무력화 하기위해 spring batch 는 기본 job parameters 에 유니크한 파라미터를 추가해주는 JobParametersIncrementer 라는 인터페이스를 제공한다. 그리고 이 인터페이스의 구현체인 RunIdIncrementer 클래스를 제공하고있다. https://githu..
- Total
- Today
- Yesterday
- http
- JPA
- db
- OOP
- generics
- backend개발환경
- toby
- Spring
- code
- DesignPattern
- programming
- Jackson
- javascript
- spring cloud
- 정규표현식
- go-core
- servlet
- Git
- mariadb
- java8
- EffectiveJava
- Design Pattern
- MySQL
- frontcode
- clean code
- JavaScript Core
- Kotlin
- TEST
- frontend개발환경
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |