스프링부트 - #7 batch

2020. 11. 17. 13:24개발&TIL/스프링

스프링 배치는 백엔드의 배치 처리 기능을 구현하는 데 사용하는 프레임위크

배치(batch)는 프로그램의 흐름에 따라 순차적으로 자료를 처리를 말함, 일괄 처리와 같은 말

스프링 부트 배치를 써야 하는 이유

  1. 대용량 데이터 처리에 최적화되어 고성능을 발휘
  2. 효과적인 로깅, 통계 처리, 트랜잭션 관리 등 재사용 가능한 필수 기능을 지원
  3. 수동으로 처리하지 않도록 자동화 되어 있음
  4. 예외사항과 비정상 동작에 대한 방어 기능
  5. 스프링 부트 배치의 반복되는 작업 프로세스를 이해하면 비즈니스 로직에 집중 가능

스프링 부트 배치 2.0은 스프링 배치 4.0 기반

  1. 자바 8 이상에서 동작, 함수형 인터페이스와 람다를 지원
  2. 스프링 프레임워크 5로 진화하면서 새롭게 재배열된 의존성 트리 지원
  3. ItemReaders, ItemProcessors, ItemWriters에 대한 빌더를 제공

스프링 부트 배치 주의사항

  1. 가능한 단순화해서 복잡한 구조와 로직을 피해야 합니다.
  2. 데이터를 직접 사용하는 직업이 빈번하게 일어나므로 데이터 무결성을 유지하는 유효성 검사 등의 방어책 필요
  3. 배치 처리시 시스템I/O 사용을 최소화, 잦은 I/O로 데이터베이스 커넥션과 네트워크 비용이 커지면
    성능에 영향을 줄 수 있음, 가능하면 한번에 데이터를 조회하여 메모리를 저장해두고 처리를 한 다음, 그 결과를
    한번에 데이터베이스에 저장하는것이 좋음
  4. 배치 처리가 진행되는 동안 다른 프로젝트 요소에 영향을 주지 않는지 확인 필요
  5. 스프링 부트는 배치는 스케줄러를 제공하지 않음, 쿼츠 프레임워크 등을 이용 필요

배치 처리 절차

  1. 일기(read) : 데이터 저장소에서 특정 데이터 레코드 읽기
  2. 처리(processing) : 원하는 방식으로 가공/처리
  3. 쓰기(write) : 수정된 데이터를 다시 저장소에 저장

Job

  • 배치 처리 과정을 하나의 단위로 만들어 표현한 객체
  • Job 안에는 여려 Step으로 구성으로 1 대 N 관계
  • JobBuilderFactory를 이용하여 쉽게 Job 생성 가능
  • JobInstance : 배치에서 Job이 실행될 대 하나의 Job 실행 단위
  • JobExecution : JobInstance에 대한 한 번의 실행을 나타내는 객체
  • JobParameters : Job이 실행될 때 필요한 파라미터들을 Map 타입으로 저장하는 객체

Step

실질적인 배치 처리를 정의하고 제어하는데 필요한 모든 정보가 들어 있는 도메인 객체

StepExecution : Step 실행 정보를 담은 객체

  • 포함된 필드 정보
      - jobExecution
      - stepName
      - status
      - readCount
      - writeCount
      - commitCount
      - rollbackCount
      - readSkipCount
      - processSkipCount
      - writeSkipCount
      - startTime
      - endTime
      - lastUpdated
      - executionContext : step 실행시에 유지해야 하는 사용자 데이터
      - exitStatus
      - terminateOnly
      - filterCount
      - failureExceptions

JobRepository

배치 처리 정보를 담고 있는 매커니즘(mechanism, 어떠한 사물의 구조, 또는 그것이 작동하는 원리)

어떤 Job이 실행되었는지 몇번실행되었고 언제 끝났는지 등 배치 처리의 메타데이터를 저장

JobLauncher

배치를 실행하는 인터페이스, run() 메서드

ItemReader

Step의 대상이 되는 배치 데이터를 읽어오는 인터페이스, FILE, XML, DB 등

ItemPrcessor

ItemReader로 읽어온 배치 데이터를 변환하는 역할을 수행

비즈니스 로직을 분리하기 위해 분리

읽어온 배치 데이터와 쓰여질 데이터의 타입이 다를 경우에 대응

ItemWriter

DB나 파일에 배치 데이터를 저장

write() 메서드는 List 자료구조를 사용해 지정한 타입의 리스트를 매개변수로 받음

리스트의 데이터 수는 설정한 청크(chunk)단위로 불러옴

@EnableBatchPocessing

스프링 부트 스타터에 미리 정의된 설정들을 실행시키는 어노테이션

배치에 필요한 JobBuilder, Stepbuilder, JobRepository, JobLauncher 등의 설정 자동 주입

@StepScope

기본 빈 생성은 싱글턴이지만 @StepScope를 사용하면 해당 메서드는 Step의 주기에 따라 새로운 빈을 생성

@StepScope는 기본 프록시 모드가 반환되는 클래스 참조하기 때문에 @StepScope를 사용하면 반드시 구현된 반환 타입을 명시해 반환 필요

/resources

하위 경로에 import.sql 파일을 생성해놓으면 스프링 부트가 실행될때 자동으로 파일 쿼리 실행

import.sql은 하이버네이트가 실행

data.sql은 스프링 JDBC가 실행

jpa.hibernate.ddl-auto

create 로 선언시 재기동마다 테이블을 새로 생성하므로 주의

@AutoConfigureTestDatabase 어노테이션

사용하면 테스트시에 H2를 할당 처리 가능

import org.spring.framework.boot.jdbc.EmbeddedDatabaseConnection;
import org.spring.framework.boot.test.autoconfigure.jdbc.AutoConfiureTestDatabase;

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureTestDatabase(Connection = EmbeddedDatabaseConnection.H2)
public class InactiveuserJobTest {
}

배치 인터셉터 Listener

배치 흐름 전후 처리를 하는 Listener를 설정하면 전후 처리 상세 설정 가능

Job의 전후 처리, Step의 전후 처리, 청크 단위 전후 처리

배치에서 제공되는 Listener 인터페이스와 어노테이션

인터페이스명 어노테이션 설명
JobExecutionListener @BeforeJob, @AfterJob Job 실행 전후 처리 리스너
ChunkListener @BeforeChunk, @AfterChunk, @AfterChunkError Chunk 실행 전후 처리 리스너
ItemReadListener @BeforeRead, @AfterRead, @OnReadError Read 전후 처리 리스너
ItemProcessListener @BeforeProcess, @AfterProcess Process 전후 처리 리스너
ItemWriteListener @BeforeWrite, @AfterWrite, @OnWriteError Write 전후 처리 리스너
SepExecutionListener @BeforeStep, @AfterStep Step 실행 전후 처리 리스너
SkipListener @OnSkipInRead, @OnSkipInWrite, @OnSkipInProcess 배치 처리중 Skip 발생시 리스너
728x90

'개발&TIL > 스프링' 카테고리의 다른 글

스프링부트 - #6 REST  (0) 2020.11.17
스프링부트 - #5 oAuth2  (0) 2020.11.17
스프링부트 - #4 web  (0) 2020.11.17
스프링부트 - #3 테스트  (0) 2020.11.17
스프링부트 - #2 환경설정  (0) 2020.11.17