@SpringBatchTest 자동으로 ApplicationContext에 테스트에 필요한 여러 유틸 Bean을 등록해주는 어노테이션 클래스 설명 JobLauncherTestUtils launcJob(), launchStep()과 같은 스프링 배치 테스트에 필요한 유틸성 메서드를 지원한다. JobRepositoryTestUtils JobRepository를 사용해서 JobExecution을 생성 및 삭제 기능 메서드를 지원한다. StepScopeTestExecutionListener @StepScope 컨텍스트를 생성해준다. 해당 컨텍스트를 통해 JobParameter 등을 단위 테스트에서 DI 받을 수 있다. JobScopeTestExecutionListener @JobScope 컨텍스트를 생성해준다...
SynchronizedItemStreamReader Thread-safe 하지 않은 ItemReader를 Thread-safe하게 처리하도록 하는 기능을 제공한다. Thread-safe Reader 각 스레드가 대기하고 있다가 순차적으로 Item을 읽어온다. read() public class SynchronizedItemStreamReader implements ItemStreamReader, InitializingBean { private ItemStreamReader delegate; public void setDelegate(ItemStreamReader delegate) { this.delegate = delegate; } /** * This delegates to the read method ..
Partitioning MasterStep이 SlaveStep을 실행시키는 구조이다. SlaveStep은 각 스레드에 의해 독립적으로 실행이 된다. SlaveStep은 독립적인 StepExecution 파라미터 환경을 구성한다. SlaveStep은 ItemReader / ItemProcessor / ItemWriter 등을 가지고 동작하며 작업을 독립적으로 병렬 처리한다. MasterStep은 PartitionStep이며, SlaveStep은 TaskletStep, FlowStep 등이 올 수 있다. 예제코드 PartitioningCustomer.java package com.project.springbatch._45_partitioning; import lombok.AllArgsConstructor; ..
Parallel Steps SplitState를 사용하여 여러개의 Flow들을 병렬적으로 실행하는 구조이다. 실행이 다 완료된 후 FlowExecutionStatus 결과들을 취합해서 다음 단계를 결정한다. Job 생성 ParallelStepConfiguration.java package com.project.springbatch._44_parallel; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.c..
스프링배치 Multi-thread Step 내에서 멀티 스레드로 Chunk 기반 처리가 이루어지는 구조다. TaskExecutorRepeatTemplate이 반복자로 사용된다. 설정한 개수만큼의 스레드를 생성하여 수행한다. ItemReader는 Thread-safe 인지 반드시 확인해야 한다. 데이터를 소스로부터 읽어오는 역할이기 때문에 스레드마다 중복해서 데이터를 읽어오지 않도록 동기화가 보장되어야한다. 스레드마다 새로운 Chunk가 할당되어 데이터 동기화가 보장된다. 스레드끼리 Chunk를 서로 공유하지 않는다. 예제코드 MultiThreadCustomer.java package com.project.springbatch._43_multiThread; import lombok.AllArgsConstr..
단일스레드 vs 멀티스레드 단일 스레드 : 프로세스 내 특정 작업을 처리하는 스레드가 하나인 경우 멀티 스레드 : 프로세스 내 특정 작업을 처리하는 스레드가 여러개인 경우 작업 처리에 있어서 단일 스레드와 멀티 스레드의 선택 기준은 "어떤 방식이 자원을 효율적으로 사용하고 성능 처리에 유연한가" 이다. 일반적으로 복잡한 처리나 대용량 데이터를 다루는 작업일 경우 전체 소요 시간 및 성능상의 이점을 가져오기 위해 멀티 스레드 방식을 선택한다. 멀티 스레드 처리 방식은 데이터 동기화 이슈가 존재하기 때문에 최대한 고려해서 결정해야한다. 스프링 배치 스레드 모델 스프링 배치는 기본적으로 단일 스레드 방식으로 작업을 처리한다. 성능 향상과 대규모 데이터 작업을 위한 비동기 처리 및 Scale out 기능을 제공..
문제 https://www.acmicpc.net/problem/18406 18406번: 럭키 스트레이트 첫째 줄에 점수 N이 정수로 주어진다. (10 ≤ N ≤ 99,999,999) 단, 점수 N의 자릿수는 항상 짝수 형태로만 주어진다. www.acmicpc.net 풀이코드 package com.algorithm._01_그리디_구현; import java.util.Scanner; import java.util.stream.IntStream; /** * @Date 2022/07/05 * @URL https://www.acmicpc.net/problem/18406 */ public class A18406_럭키_스트레이트 { public static void main(String[] args) { A18406..
ItemReaderAdapter SpringBatch에서 Job 안에 이미 있는 DAO나 다른 서비스를 ItemReader 안에서 사용하고자 할 때 위임 역할을 한다. Adapter 패턴을 도입하여 지정한 서비스를 호출하도록 한다. Job 생성 ItemReaderAdapterConfiguration.java package com.project.springbatch._57_readerAdapter; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configurat..
Paging 방식 페이징 단위로 데이터를 조회하는 방식으로 Page Size만큼 한번에 메모리로 가지고 온 다음 한개씩 읽는다. 한 페이지를 읽을때마다 Connection을 맺고 끊기 때문에 대량의 데이터를 처리하더라도 SocketTimeout 예외가 거의 발생하지 않는다. 시작 행 번호를 지정하고 페이지에 반환시키고자 하는 행의 수를 지정한 후 사용한다. (offset-limit) 페이징 단위의 결괌나 메모리에 할당하기 때문에 메모리 사용량이 적다. Connection 연결 유지 기간이 길지 않고 메모리 공간을 효율적으로 새용해야하는 데이터 처리에 적합하다. JdbcPagingItemReader Paging 기반의 JDBC 구현체로써, 쿼리에 시작 행 번호(offset)와 페이지에서 반환할 행수(lim..
Cursor 방식 JDBC ResultSet의 기본 메커니즘을 사용한다. 현재 행에 커서를 유지하며 다음 데이터를 호출하면 다음 행으로 커서를 이동하며 데이터 반환이 이루어진다. (Streaming 방식) ResultSet이 open()될 때마다 next()가 호출되어 Database의 데이터가 반환되고 객체와 매핑이 이루어진다. DB Connection이 연결되면 배치 처리가 완료될 때까지 데이터를 읽어오기 때문에 DB와 SocketTimeout을 충분한 값으로 설정해야한다. 모든 결과를 메모리에 할당하므로 메모리 사용량이 많다. Connection 연결 유지 시간과 메모리 공간이 충분하다면 대량의 데이터 처리에 적합할 수 있다. JdbcCursorItemReader Cursor 기반의 JDBC 구현체..
Xml 파일 읽어오기 resources/item51/customer.xml 1 hong gil dong1 40 2 hong gil dong2 42 3 hong gil dong3 43 Customer.java package com.project.springbatch._52_reader_json; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class Customer { private final long id; private final String name; private final int age; } build.gradle implementation 'org.springframework:sprin..
Job 생성 FlatFileConfiguration.java package com.project.springbatch._47_reader_FlatFiles; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springfr..
Job 생성 ItemStreamConfiguration.java package com.project.springbatch._41_itemStream; import com.project.springbatch._41_itemStream.custom.CustomItemStreamReader; import com.project.springbatch._41_itemStream.custom.CustomItemStreamWriter; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.c..
카프카의 탄생 카프카 도입 전의 단점을 파악하여 카프카가 왜 탄생했는지에 대해서 알아봅시다. 카프카 도입 전 1) 일반적으로 데이터를 생성하는 '소스 애플리케이션'과 생성된 데이터가 적재되는 '타깃 애플리케이션'은 연결되어있습니다. 그림을 보면 end-to-end 연결 방식으로 여러 애플리케이션이 서로 데이터를 주고받습니다. 만약, 작게 시작했던 서비스가 점점 커지면서 위 그림처럼 복잡해진다면 앞으로 어떻게 확장을 해나가야 할까요? 각 애플리케이션의 의존도가 높아지면서 확장은 어려워지고 장애 발생 가능성은 커지게되어 서비스 관리가 힘들어집니다. 2) 한 쪽의 서비스에 장애가 발생한다면, 그와 연결된 서비스에 모두 영향을 미칩니다. N:1 또는 1:N 구조를 가지고있기 때문에 한 서비스에 장애가 발생한다면..
다대일 (N:1) 다대일 관계의 반대 방향을 항상 일대다 관계이고, 일대다 관계의 반대 방향은 항상 다대일 관계이다. 외래키는 항상 다(N)쪽에 있으며, 그러므로 연관관계의 주인은 항상 다(N) 쪽이다. - 단방향 MemberA.java import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import javax.persistence.*; @Entity @Getter @Setter @NoArgsConstructor @AllArgsConstructor public class MemberA { @Id @Column(name= "ID") @GeneratedValue(..
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.