본문 바로가기
👩‍💻TIL/Spring

[Spring Batch] 스프링배치 개념/핵심기능/파티셔닝 분할 방식

by devuna 2021. 8. 23.
728x90

[Spring Batch] 스프링배치 개념/핵심기능/파티셔닝 분할 방식

                        A라는 곳에 쌓여있는 데이터를 읽어와 B라는 곳로 옮기는 일련의 작업


💡스프링 배치란? 

Spring Batch는 일괄 처리에 주로 사용되는 spring 기반 프레임워크 중 하나이다.

 

스프링배치에서 제공하는 핵심 기능은 크게 다음과 같다.

 

📌 데이터베이스, 파일 또는 큐에서 데이터 읽기(Reader)
📌 데이터를 사용자가 정의한 방식으로 처리(Processor)
📌 처리된 데이터를 쓰기(Writer)

 

스프링 배치는 위와 같은 방식으로 사용자와의 상호작용 없이 반복적으로 데이터를 트랜잭션 단위로 처리할 수 있도록 구현되어 있고, 개발자는 데이터 처리에 대한 비즈니스 로직에만 집중하여 배치 프로세스를 작성할 수 있다.

 

DB-> DB , DB-> file, file->DB 등 여러가지 상황에서 데이터를 일괄로 가져오는 작업에 주로 사용되며 (예: 월말 계산, 푸시 알림 등) 일반적으로 순차적인 실행을 위해 단일 쓰레드를 사용한다.

간단하고 많지 않은 데이터의 read-> write 작업만 이루어진다면 큰 무리가 없겠지만, read와 write 사이에 무엇인가 process처리를 하게되고 작업량이 많은 경우 단일 쓰레드에서 배치를 수행하는데 시간이 많이 걸릴 수 있다.

이러한 경우 파티셔닝을 사용하여 나눠 수행하면 시간을 줄일 수 있다.

 

 

💡 파티셔닝 Partitioning

파티셔닝은 시간이 긴 배치 job을 실행하는 시간 단축을 목표로 한다.

입력 파일이나 메인 데이터베이스 테이블을 분할하여 각 어플리케이션을 각기 다른 데이터 셋과 함께 실행할 수 있다면, 파티셔닝을 적용할 수 있다. (이때 파티션된 작업은 지정된 데이터셋만 처리하도록 설계해야 한다!)

파티셔닝이 반드시 데이터베이스의 물리적 분할을 의미하는 것은 아니지만 대부분 명확한 분할을 위해 분할이 권장된다.

출처 : https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html#itemProcessor

 

💡 파티셔닝 분할방식 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

 

Spring Batch - Reference Documentation

If a group of Steps share similar configurations, then it may be helpful to define a "parent" Step from which the concrete Steps may inherit properties. Similar to class inheritance in Java, the "child" Step combines its elements and attributes with the pa

docs.spring.io

 

728x90

댓글