[Spring Batch] 기초

728x90

Task 기반 배치 vs Chunk 기반 배치

  • 배치를 처리할 수 있는 방법은 크게 2가지
  • Tasklet을 사용한 Taks 기반 처리
    • 배치 처리 과정이 비교적 쉬운 경우 쉽게 사용
    • 대량 처리를 하는 경우 더 복잡
    • 하나의 큰 덩어리를 여러 덩어리로 나누어 처리하기 부적합
  • Chunk를 사용한 chunk(덩어리) 기반 처리
    • ItemReader, ItemProcessor, ItemWriter의 관계 이해 필요
    • 대량 처리를 하는 경우 Tasklet 보다 비교적 쉽게 구현
    • ex) 10,000개의 데이터 중 1,000개씩 10개의 덩어리로 수행
      • 이를 Tasklet으로 처리하면 10,000개를 한번에 처리하거나 혹은 수동으로 1,000개씩 분할하여 처리

Chunk 기반 처리 흐름
  • reader에서 null을 return 할 때까지 Step은 반복
  • <INPUT, OUTPUT> chunk(int)
    • reader에서 INPUT을 return
    • processor에서 INPUT을 받아 processing 후 OUTPUT을 return
      • INPUT, OUTPUT은 같은 타입일 수도 있음.
    • write에서 List<OUTPUT>을 받아 write 함.

JobParameters 이해

  • 배치 실행에 필요한 값을 parameter를 통해 외부에서 주입
  • JobParameters는 외부에서 주입된 parameter를 관리하는 객체
  • parameter를 JobParameters Spring EL(Expression Language)로 접근
    • String parameter = jobParameters.getString(key, defaultValue);
    • @Value("#{jobParameters[key]}")

@JobScope vs @StepScope

  • @xxxScope는 어떤 시점에 bean을 생성/소멸 시킬 지 bean의 lifecycle을 설정함.
  • @JobScope는 job 실행 시점에 생성/소멸
    • Step에 선언한다.
  • @StepScope는 step 실행 시점에 생성/소멸
    • Tasklet, Chunk(ItemReader, ItemProcessor, ItemWriter)에 선언
  • Spring의 @Scope과 같은 개념
    • @Scope("job") == @JobScope
    • @Scope("step") == @StepScope
  • Job과 Step 라이프사이클에 의해 생성되기 때문에 Thread safe하게 작동한다.
  • @Value("#{jobParameters[key]}")를 사용하기 위해

ItemReader

  • 배치 대상 데이터를 읽기 위한 설정
    • 파일, DB, 네트워크 등에서 읽기 위함.
  • (Chunk 기반) Step에서 ItemReader는 필수
  • 기본 제공되는 ItemReader 구현체
    • ex) file, jdbc, jpa, hibernate, kafka, etc..
  • ItemReader 구현체가 없으면 직접 개발
  • ItemStream은 ExecutionContext로 read, write 정보를 저장
  • CustomItemReader

CSV 파일 데이터 읽기

  • FlatFileItemReader 클래스로 파일에 저장된 데이터를 읽어 객체에 매핑

JDBC 데이터 읽기 - Cursor

  • Cursor 기반 조회
    • 배치 처리가 완료될 때 까지 DB Connection이 연결됌
    • DB Connection 빈도가 낮아 성능이 좋은 반면, 긴 Connection 유지 시간이 필요하다.
    • 하나의 Connection에서 처리되기 때문에, Thread Safe하지 않음
    • 모든 결과를 메모리에 할당하기 때문에, 더 많은 메모리를 사용
  • Paging 기반 조회
    • 페이징 단위로 DB Connection을 연결
    • DB Connection 빈도가 높아 비교적 성능이 낮은 반면, 짧은 Connection 유지 시간 필요
    • 매번 Connection을 하기 때문에 Thread Safe
    • 페이징 단위의 결과만 메모리에 할당하기 때문에, 비교정 더 적은 메모리를 사용한다.

ItemWriter

  • ItemWriter는 마지막으로 배치 처리 대상 데이터를 어떻게 처리하는지를 결정
  • (Chunk 기반) Step에서 ItemWriter는 필수
  • 사용용도 ex) ItemReader에서 읽은 데이터를 DB에 저장, API로 서버에 요청, 파일에 데이터를 write etc…
  • 항상 write를 하지 않음.
    • 데이터를 최종적으로 마무리하는 것이 ItemWriter

CSV 파일 데이터 쓰기

  • FlatFileItemWriter는 데이터가 매핑된 객체를 파일로 write 한다.

JDBC 데이터 쓰기

  • JdbBatchItemWriter는 jdbc를 사용해 DB에 write
  • JdbcBatchItemWriter는 bulk insert/update/delete처리
  • 단건 처리가 아니기 때문에 비교적 높은 성능

JPA 데이터 쓰기

  • JpaItemWriter는 JPA Entity 기반으로 데이터를 DB에 write
  • Entity를 하나씩 EntityManager.persist 또는 EntityManager.merge로 insert (bulk로 업데이트하기에는 좋지 않아 보임)

ItemProcessor

  • ItemReader에서 읽은 데이터를 가공 또는 Filtering
  • Step의 ItemProcessor는 optional
  • ItemProcessor는 필수는 아니지만, 책임 분리를 분리하기 위해 사용
  • ItemProcessor는 I(input)를 O(output)로 변환하거나
  • ItemWriter의 실행 여부를 판단할 수 있도록 filtering 역할을 한다.
    • ItemWriter는 not null만 처리

 

728x90