본문 바로가기

개발/02-1.Spring Batch

[SpringBatch, DEVOCEAN] Week2 - SpringBatch 코드 설명 및 아키텍처 알아보기 (미완성)

배경 : 스프링배치 스터디 2주차이다. 미리 안했더니, 결국은 회사일 때문에 밀리고 밀려서 이번주는 하루전에 실습하게 되었다. 반성하고. 주말 등을 활용해서 내 공부 시간을 마련해보자. 지난주 1주차에서 중요한 부분 정리 및 2주차 실습 위주로 진행해보자.

 

내용 : 1주차 remind 후 2주차 실습 + 미진한 스프링배치 기본 이론 다시 공부하는 방식으로 간다.

 

[1주차 중요 내용 Remind]

1) 스프링 배치란?

 

Spring Batch란 무엇인가?

Spring Batch는 대량의 데이터 처리를 위한 경량화된 프레임워크로, 반복적인 작업을 수행하는 일괄 처리(Batch Processing) 작업을 효율적으로 처리할 수 있는 기능을 제공한다. 대용량 데이터 처리나

velog.io

- 대량의 데이터 처리에 효과적인 경량화된 프레임워크

 (프레임워크의 의미 - 누구나 동일한 구조로 프로그래밍 할 수 있는 장점을 챙기자)

 

[보충공부] Spring Batch 의 특징

- 대용량 데이터 처리 : 데이터 처리간 분산 처리가 가능하여 방대한 양의 데이터 처리 가능 

- 트랜잭션 관리 : 데이터 처리 중 실패한 작업은 롤백 가능

- 재시도 기능 : 작업중 실패한 경우 작업을 재시도 할 수 있는 기능 제공. 재시도 횟수 설정 가능.

 

2) 내가 못했던 부분 (H2 DB에 Default 생성되지 않는 현상)

 - 스프링부트 3.x 부터는 @EnableBatchProcessing 주석 처리 후 진행

   (yaml 파일에서의 설정파일내 아무리 셋팅해도, 저 @EnableBatchProcessing 실행시 기존 야물파일 내 설정값이 다 초기회되어버려서 생성되지 않은 현상 이 발생했음)

- 최초 생성시에는 batch.jdbc.initialize-schema : always 로 셋팅. 생성된 이후는 mysql 같은 DBMS 툴에서는 설정 해제 후 사용 

@EnableBatchProcessing 주석 후 실행시 기본 테이블들 정상 생성됨.

 

3. 테이블 구조 

참고 : https://yeseul-dev.tistory.com/m/39

 

테이블 구조만 읽어보면  처음부터 잘 머리속에 들어오질 않았다.

메인테이너 기도님의 설명을 머리속에 넣기 좋게 잘 정리해주신 예슬님이 정리해주신 이 표로 확실히 리마인드 해보자.

 

1. 배치 실행

2. BATCH_JOB_INSTANCE - 배치 1개의 단위의 고유 키값인 JOB_INSTANCE_ID 값을 생성, JOB 명칭을 정할 수 있음

(Job : 하나 이상의 Step 을 가지며 하나의 배치작업을 의미함. Job은 JobInstance로 표현)

3.

BATCH_JOB_EXECUTION - Job 실행 관련 중요 정보를 저장하는 테이블. BATCH_JOB_INSTANCE 테이블의 고유 key 인 JOB_INSTANCE_ID 값을 JOIN 하여 사용

BATCH_JOB_EXECUTION_PARAMS : Job 실행시 사용된 파라미터를 저장

BATCH_JOB_EXECUTION_CONTEXT :  Job 실행시 컨텍스트 정보를 저장 

 

4. 

BATCH_STEP_EXECUTION : Job의 Step의 실행정보 저장

(Step : 배치 처리 작업의 최소 단위)

BATCH_STEP_EXECUTION_CONTEXT : Job의 Step 의 컨텍스트 정보 저장

 

=======================

Week2 내용 시작!!!

참고 : https://devocean.sk.com/blog/techBoardDetail.do?ID=166690

 

[SpringBatch 연재 02] SpringBatch 코드 설명 및 아키텍처 알아보기

 

devocean.sk.com

 

[실습]

  • Tasklet 구현체를 생성한다.
  • @Configuration을 통해서 생성할 배치 빈을 스프링에 등록한다.
  • Job, Step 을 생성하고 빈에 등록한다.
  • 실행 결과를 확인한다.

 

1. Tasklet 구현체를 생성한다

Tasklet 이란? - 하나의 작업 단위를 처리하는 인터페이스

Step (=배치 처리 작업의 최소 단위) 이 중지될 떄까지 execute 메서드가 계속 반복해서 수행하고, 수행할 때 마다 독립적인 트랜잭션이 얻어진다. 초기화, 저장 프로시저 실행, 알림 전송과 같은 Job 에서 일반적으로 사용.

 

GreetingTask.java  클래스를 생성하고, Tasklet,과  InitalizingBean 을 implements 해 온다.

그럼 인텔리제이에서 빨간줄이 뜨고, 오류를 확인하면 해당 클레스 내 execute와 afterPropertiesSet 을 오버라이드 하여 자동 생성하게 된다  (Tasklet 은 execute 메소드를, InitializingBean은 afterPropertiesSet 메소드를 필수로 생성해야 함)

 

 

자동 생성된 모습

 

이후 메인 교재에 언급되어 있는 실행 프로세스 확인을 위해 예제대로 log 를 찍는다.

 

현재 까지 진행과정중 모르는 용어 부분 은 정리한다.

 

[스프링 빈 생명주기 관련]

InitializingBean : 모든 속성이 BeanFactory에 의해 설정되면 반응해야하는 빈에 의해 구현되는 인터페이스

afterPropertiesSet : 모든 빈 프로퍼티가 설정된 이후, 빈 인스턴스가 전체 configuration 의 유효성 검증과 최종 초기화를 수행할 수 있도록 한다.

 

[참고] 

 

테스트 전 데이터베이스를 초기화하는 방법

최근 프로젝트 시 회고 및 기록의 중요성을 느껴 오늘부터는 배운 내용들을 기록해보려고 한다. 이제 왕초보 단계는 벗어났고 사용법도 어느정도 익숙해졌으니 내부 동작 원리를 이해하는 단계

velog.io

 

 

StepContribution : Chunk 기반 Tasklet 에서 Chunk 프로세스의 변경 사항을 버퍼링한 후 StepExecution 상태를 업데이트 하는 도메인 객체이다.

[참고]

 

[Spring Batch] 스프링 배치 StepContribution 이해하기 - Spring boot 2.x

StepContribution StepContribution은 Chunk 기반 Tasklet에서 Chunk 프로세스의 변경 사항을 버퍼링 한 후 StepExecution 상태를 업데이트하는 도메인 객체다. Chunck 커밋 직전에 StepExecution의 apply 메서드를 호출하

ittrue.tistory.com

 

 

ChunkContext : 현재 실행중인 Chunk에 대한 Context 정보를 담고 있는 객체이다

 

[참고]

 

[Spring] Spring Batch Tasklet 작업 단위 이해하기 - StepContribution, ChunkContext

Tasklet이란간단한 단위의 작업을 수행하는 Batch Step을 정의할 때 사용하는 인터페이스입니다,.Step은 보통 Tasklet, Chunk 단위로 작업을 처리합니다.Tasklet은 하나의 작업 단위를 처리하는 인터페이스

kylo8.tistory.com

 

 

위 생성 다 한 후 스프링 배치 빈을 @Configuration 을 사용해 등록한다.

 

Job Step 을 생성하고 빈에 등록한다

 

Step 생성

 

Job 생성

 

커스텀하게 위에서 생성한 greetingTasklet 또한 사용 위한 메소드 생성

 

실행 해보자.

 

아 진짜 ㅠㅠ lombok 관련 소스상에서는 문제없는데, 실행하면 오류난다.. 이거 왜그런거지?

 

 

해당 실행되면

afterPropertySet(), Job, Step, Tasklet 순으로 실행되는 것을 확인하자 

 

 

아 ㅠㅠ 시간이 없다..

빨리  이론 내용으로 들어가자

 

스프링 배치 아키텍처

스프링 배치 모델은 Tasklet , chunk 모델 2가지를 가진다.

Tasklet : 단순한 처리 로직 - 로직 자체가 단순한 경우

Chunk : 데이터량이 매우 큰 경우 효과적 처리, Reader/Processor/Writer 플로우 방식으로 처리됨.

 

배치 기본 아키텍처

 

못했음 ㅠㅠ

일단 스터디 준비하자 .. 이번 주말 보충 하겠음 ㅠㅠ

 

728x90