CheerUp_Cheers

스프링 부트2 - (7) 스프링 부트 배치 본문

서적 공부/스프링부트 - 처음 배우는 스프링부트2

스프링 부트2 - (7) 스프링 부트 배치

meorimori 2020. 9. 2. 12:54
백엔드의 배치 처리 기능을 구현하는데 사용하는 프레임워크
배치는 '프로그램 흐름에 따라 순차적 자료 처리(일괄처리)'

 

#구현기능

  • 배경지식
  • 스프링부트 배치 이해
  • 스프링 부트 휴면회원 배치 설계
  • 스프링 부트 배치 설정
  • 스프링 부트 휴면회원 배치 구현
  • 스프링 배치 심화
  • 멀티 스레드로 여러개의 스텝 실행

 

#7.1.1 배치처리에 스프링 부트 배치를 써야 하는 이유

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

#7.2 스프링 부트 배치 이해하기

일반적인 배치 처리 절차를 따름.

읽기 -> 처리 -> 쓰기

 

 

#7.2.1 Job

Job : 배치 처리 과정을 하나의 단위로 만들어 표현한 객체.

JobBuilder들은 반환타입이 빌더.

 ->경우에 따라 Job의 생성 방법이 모두 다르기 때문에 별도의 구체적인 빌더를 구현하고 Job생성.

 

*JobInstance

배치에서 Job이 실행될 떄 하나의 Job 실행 단위.

 

*JobExecution

JobInstance에 대한 한번의 실행을 나타내는 객체.

구성 : JobInstance, 배치실행상태, 시작시간, 끝난시간, 실패했을 떄의 메시지등의 정보 가짐.

ex)

  만약 오늘 실패한 Job을 내일도 실행한다면 모두 같은 JobInstance를 가짐.

  하지만, 오늘/내일은 다른 JobExecution을 가짐.

 

*JobParameters

Job이 실행될 때 필요한 파라미터들을 Map타입으로 저장하는 객체

JobInstance를 구분하는 기준.(1:1 관계)

 

# 7.2.2 Step

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

Job을 처리하는 실질적인 단위로 쓰임.

모든 Job 하나이상의 Step을 가짐.

 

*StepExecution

Step의 실행정보를 담는 객체.

Step이 실행될 때마다 생성.

 

# 7.2.3 JobRepository

배치 처리 정보를 담고 있는 메커니즘.

어떤 Job이 실행 되었으며 몇번 실행되었고 언제 끝났는지에 대한 배치처리의 메타데이터 저장.

 -> JobExecution과 StepExecution 저장.

 

# 7.2.4 JobLaucher

Job, JobParameters와 함께 배치를 실행하는 인터페이스

인터페이스의 메소드는 run().

 ex) public JobExecution run(Job job, JobParameters jobParameters)

  만약 매개변수가 이전과 동일하면서 이전에 JobExecution이 중단된 적이 있다면 동일한 JobExecution반환.

 

# 7.2.5 Item Reader

Step의 대상이 되는 배치 데이터를 읽어오는 인터페이스.

FILE,XML,DB등의 다양한 타입의 데이터 읽어 옴.

 ex) T read() throws Exception, UnexpectedInputException, ParseException, NonTran...

  -> read()메서드의 반환타입을 제네릭으로 구현했기 때문에 직접타입을 지정가능.

 

# 7.2.6 ItemProcessor

Item Reader로 읽어온 배치 데이터를 변환하는 역할.

 

*사용이유

비즈니스 로직을 분리.

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

 

ex) public interface ItemProcessor<I, 0>{

  0 process(I item) throws Excetion; }

 

# 7.2.7 ItemWriter

배치 데이터를 저장. 일반적으로 DB나 파일을 저장

 

ex) public interface ItemWriter<T>{

  void wirter(List<? extends T> items) throws Exception; }

  -> Reader와 비슷한 방식

 


 

# 7.3 스프링 부트 휴면회원 배치 설계하기

커뮤니티 회원 중 1년 지나도록 상태변화가 없는 회원을 휴면회원으로 만드는 배치를 만들겠음.

앞서 배운 Job, Step을 모두 사용하여 만들 것임.

 

1) H2 DB에 저장된 데이터 중 1년간 업데이트되지 않은 사용자를 찾는 로직을 ItemReader로 구현.

2) 대상 사용자 데이터의 상탯값을 휴면회원으로 전환하는 프로세스를 ItemProcessor에 구현.

3) 상탯값이 변한 휴면회원을 실제로 DB에 저장하는 ItemWriter를 구현.

 

# 7.5.3 SQL로 데스트 데이터 주입하기

지금까지 테스트 데이터 등록은 CommandLineRunner를 사용해서 애플리케이션 생성시 생성과 저장.

이번에는 스프링 부트 SQL파일을 이용한 테스트 데이터를 생성 저장.

 

*방법

resources의 하위 경로에 import.sql파일을 생성해놓으면, 실행시 자동으로 쿼리 실행.

 -> import.sql은 하이버네이트, data.sql은 스프링 JDBC가 실행.