[Spring Batch] 스프링배치 개념/핵심기능/파티셔닝 분할 방식
A라는 곳에 쌓여있는 데이터를 읽어와 B라는 곳로 옮기는 일련의 작업
💡스프링 배치란?
Spring Batch는 일괄 처리에 주로 사용되는 spring 기반 프레임워크 중 하나이다.
스프링배치에서 제공하는 핵심 기능은 크게 다음과 같다.
📌 데이터베이스, 파일 또는 큐에서 데이터 읽기(Reader)
📌 데이터를 사용자가 정의한 방식으로 처리(Processor)
📌 처리된 데이터를 쓰기(Writer)
스프링 배치는 위와 같은 방식으로 사용자와의 상호작용 없이 반복적으로 데이터를 트랜잭션 단위로 처리할 수 있도록 구현되어 있고, 개발자는 데이터 처리에 대한 비즈니스 로직에만 집중하여 배치 프로세스를 작성할 수 있다.
DB-> DB , DB-> file, file->DB 등 여러가지 상황에서 데이터를 일괄로 가져오는 작업에 주로 사용되며 (예: 월말 계산, 푸시 알림 등) 일반적으로 순차적인 실행을 위해 단일 쓰레드를 사용한다.
간단하고 많지 않은 데이터의 read-> write 작업만 이루어진다면 큰 무리가 없겠지만, read와 write 사이에 무엇인가 process처리를 하게되고 작업량이 많은 경우 단일 쓰레드에서 배치를 수행하는데 시간이 많이 걸릴 수 있다.
이러한 경우 파티셔닝을 사용하여 나눠 수행하면 시간을 줄일 수 있다.
💡 파티셔닝 Partitioning
파티셔닝은 시간이 긴 배치 job을 실행하는 시간 단축을 목표로 한다.
입력 파일이나 메인 데이터베이스 테이블을 분할하여 각 어플리케이션을 각기 다른 데이터 셋과 함께 실행할 수 있다면, 파티셔닝을 적용할 수 있다. (이때 파티션된 작업은 지정된 데이터셋만 처리하도록 설계해야 한다!)
파티셔닝이 반드시 데이터베이스의 물리적 분할을 의미하는 것은 아니지만 대부분 명확한 분할을 위해 분할이 권장된다.
💡 파티셔닝 분할방식 Partitioning Approaches
1. 균등 분할 : Fixed and Even Break-Up of Record Set
입력 레코드 셋(Input record set)을 균등하게 나눈다. (예를 들어, 10은 정확하게 1/10씩)
나눈 다음 각 인스턴스가 나눠진 레코드 셋을 처리한다. 이 방법을 사용하려면 데이터 셋을 나누기 위한 분할작업이 필요하며, 이 전처리 작업으로 인해 오버헤드가 발생한다.
2. 키 열로 나누기 : Break up by a Key Column
location code나 batch instance의 key값 등 키 컬럼을 이용해 처리한다.
하지만 하나의 인스턴스에서 처리되는 범위에는 값이 적을 수도 있다. 두 방법 모두 레코드를 각 배치 인스턴스에 완전히 동일하게 분배할 수는 없다. 배치 인스턴스가 사용할 레코드 수를 변경해주는 동적인 설정은 없다.
3. 뷰로 나누기 : Breakup by Views
기본적으로 키 컬럼으로 분할한다는 점은 같지만 이 방법은 데이터베이스 레벨에서 분할한다는 점이 특징이다. 레코드 셋을 뷰로 나누고, 각 배치 어플리케이션 인스턴스는 이 뷰를 조회한다. 분리는 데이터를 그룹화하여 수행한다. 이 방법을 사용한다면 각 배치 어플리케이션 인스턴스가 특정 뷰를 참조하도록 설정해줘야 한다. 또한, 새 데이터가 추가되면 이 새 그룹을 뷰에 추가해야한다. 인스턴스 수를 변경하면 뷰도 바뀌기 때문에 동적인 설정은 불가능하다.
4. 처리지표 추가 : Addition of a Processiong Indicator
이번에는 식별자 역할을 하는 새 컬럼(처리지표)을 입력 테이블에 추가하는 방법이다. 이 방법을 쓰면, 테이블의 I/O가 증가하는데, 업데이트를 수행하는 배치 어플리케이션이라면 어차피 쓰기작업(write)이 항상 있기때문에 이 단점은 큰 영향을 끼치지 않을 수 있다.예를 들어, 전 처리 단계에서 처리지표는 '처리되지 않음'으로 마킹된다. 배치 어플리케이션에서는 '처리되지 않음'으로 마킹된 레코드만 읽으며, 한 번 읽으면 (잠금과 함께) '처리 중'으로 다시 마킹한다. 처리가 완료된 레코드는 식별자를 '완료'나 '에러'로 업데이트한다. 별도 컬럼만으로 레코드가 한 번만 처리된다는 걸 보장할 수 있으므로 아무 변경 없이 여러 배치 어플리케이션 인스턴스를 시작할 수 있다.
5. 파일로 테이블 추출 : Extract Table to a Flat File
이 방법은 테이블을 파일로 추출하는 작업이 포함된다. 추출한 파일을 여러 세그먼트로 분할하고, 배치 인스턴스에 대한 입력으로 사용하는 방식이다. 참고로, 이 옵션을 사용하면 테이블을 파일로 추출하고 분할할 때 발생하는 오버헤드가 다중분할의 효과를 상쇄할 수 있다. 파일 분할 스크립트를 변경해 동적인 설정이 가능하다.
6. 해싱 컬럼 사용하기 : Use of a Hashing Column
드라이버 레코드를 검색할 때 쓰는 데이터베이스 테이블에 해시 컬럼을 추가한다. 이 컬럼은 특정 row를 어떤 배치 어플리케이션 인스턴스가 처리하는지 결정하는 식별자를 가진다. (예를 들어 배치 인스턴스 세 개를 실행한다면 식별자 값이 'A'면 인스턴스 1에서, 'B'면 인스턴스 2에서, 'C'면 인스턴스 2에서 수행)
참고
https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html#partitioning
'👩💻TIL > Spring' 카테고리의 다른 글
[WebFlux] Mono와 Flux 개념과 구현 (0) | 2021.05.09 |
---|---|
[Spring] WebFlux의 개념 / Spring MVC와 간단비교 (2) | 2021.05.07 |
[Spring Security] 스프링시큐리티 시작하기 /기본세팅 (9) | 2020.05.15 |
[Spring Security] 스프링시큐리티의 기본 개념과 구조 (2) | 2020.05.12 |
댓글