스프링 배치 핵심 도메인 기초

2023. 10. 21. 20:57·개발/Spring Batch
반응형

Job

  • 배치 계층 구조에서 가장 상위에 있는 개념으로 하나의 배치 작업 자체를 의미한다.
  • 'A 데이터베이스의 데이터를 B 데이터베이스로 옮기는 배치'는 Job 자체를 의미한다.
  • JobConfiguration을 통해 생성되는 객체 단위, 배치 작업을 어떻게 구성하고 실행할 것인지 전체적으로 설정하고 명세해 놓은 객체
  • 배치 Job을 구성하기 위한 최상위 인터페이스이며 스프링 배치가 기본 구현체를 제공한다. ex SimpleJob, FlowJob
  • 여러 Step을 포함하고 있는 컨테이너로서 반드시 한 개 이상의 Step으로 구성해야 한다.

 

JobInstance

  • Job이 실행될 때 생성되는 Job의 논리적 실행 단위 객체로서 고유하게 식별 가능한 작업 실행을 나타낸다.
  • Job의 설정과 구성은 동일하지만 Job이 실행되는 시점에 처리하는 내용은 다르기 때문에 Job의 실행을 구분해야한다.
  • 하루에 몇 번씩 배치 Job이 실행된다면 실행되는 각각의 Job을 JobInstance로 표현한다.
  • Job과는 1:M 관계
  • JobName과 JobKey가 동일한 데이터는 중복해서 저장할 수 없다.

JobInstance 생성 및 실행

  • 처음 시작하는 Job + JobParameter일 경우 새로운 JobInstance 생성
  • 이전과 동일한 Job + JobParameter으로 실행할 경우 이미 존재하는 JobInstance 리턴
  • 내부적으로 Job + JobKey(JobParameter의 해시값을)을 가지고 JobInstance를 얻는다.

 

JobParameter

  • Job을 실행할 때 함께 포함되어 사용되는 파라미터를 가진 도메인 객체
  • 하나의 Job에 존재할 수 있는 여러 개의 JOBInstance를 구분하기 위한 용도
  • JobParameters와 JobInstance는 1:1 관계
  • JobExecution과 1:M 관계

 

JobExecution

  • JobInstance에 대한 한번의 시도를 의미하는 객체로서 Job 실행 중에 발생한 정보들을 저장하고 있는 객체

JobInstance과의 관계

  • JobExecution은 FAILED 또는 COMPLETED 등의 Job의 실행 결과 상태를 가지고 있다.
  • JobExecution은 실행 상태 결과가 COMPLETED면 JobInstance 실행이 완료된 것으로 간주해서 재실행이 불가능하다.
  • JobExecution은 실행 상태 결과가 FAILED면 JobInstance 실행이 완료되지 않은 것으로 간주해서 재실행이 가능하다.
    • JobParameter가 동일한 값으로 Job을 실행할지라도 JobInstance를 계속 실행할 수 있다.
  • JobExecution의 실행 상태 결과가 COMPLETED가 될 때까지 하나의 JobInstance 내에서 여러 번의 시도가 생길 수 있다.
  • JobInstance와 JobExecution는 1:M의 관계로서 JobInstance에 대한 성공/실패의 내역을 가지고 있다.

 

Step

  • Batch Job을 구성하는 독립적인 하나의 단계로서 실제 배치 처리를 정의하고 컨트롤하는데 필요한 모든 정보를 가지고 있는 도메인 객체
  • 단순한 단일 태스크 뿐 아니라 입력과 처리 그리고 출력과 관려된 복잡한 비즈니스 로직을 포함하는 모든 설정들을 담고 있다.
  • 배치작업을 어떻게 구성하고 실행할 것인지 Job의 세부 작업을 Task 기반으로 설정하고 명세해 놓은 객체
  • 모든 Job은 하나 이상의 Step으로 구성
  • 기본 구현체로는 TaskletStep, PartitionStep, JobStep, FlowStep 등이 있다.

 

StepExecution

  • Step에 대한 한번의 시도를 의미하는 객체로서 Step 실행 중에 발생한 정보들을 저장하고 있는 객체
  • Step이 매번 시도될 때 마다 생성되며 각 Step 별로 생성된다.
  • Job이 재시작 하더라도 이미 성공적으로 완료된 Step은 재실행되지 않고 실패한 Step만 실행된다.
  • 이전 단계 Step이 실패해서 현재 Step을 실행하지 않았다면 StepExecution을 생성하지 않는다. Step이 실제로 시작됐을 때만 StepExecution을 생성한다.

JobExecution과의 관계

  • Step의 StepExecution이 모두 정상적으로 완료 되어야 JobExecution이 정상적으로 완료된다.
  • Step의 StepExecution 중 하나라도 실패하면 JobExecution은 실패한다.
  • JobExecution와 StepExecution은 1:M 관계
  • 하나의 Job에 여러 개의 Step으로 구성했을 경우 각 StepExecution은 하나의 JobExecution을 부모로 가진다.

 

StepContribution

  • 청크 프로세스의 변경 사항을 버퍼링한 후 StepExecution 상태를 업데이트하는 도메인 객체
  • 청크 커밋 직전에 StepExecution의 apply 메서드를 호출하여 상태를 업데이트한다.
  • ExitStatus의 기본 종료코드 외 사용자 정의 종료코드를 생성해서 적용할 수 있다.

 

ExecutionContext

  • 프레임워크에서 유지 및 관리하는 키/값으로 된 컬렉션으로 StepExecution 또는 JobExecution 상태를 저장하는 공유 객체
  • DB에 직렬화 한 값으로 저장된다. - { "key" : "value" }
  • Job 재시작시 이미 처리한 Row 데이터는 건너뛰고 이후로 수행하도록 하 때 상태 정보를 활용한다.

공유 범위

  • Step 범위 - 각 Step의 StepExecution에 저장되며 Step간 서로 공유 안됨 
  • Job 범위 - 각 Job의 JobExecution에 저장되며 Job 간 서로 공유 안되며 해당 Job의 Step 간 서로 공유된다.

 

JobRepository

  • 배치 작업 중의 정보를 저장하는 저장소 역할
  • Job이 언제 수행되었고, 언제 끝났으며, 몇 번이 실행되었고 실행에 대한 결과 등의 배치 작업의 수행과 관련된 모든 메타 데이터를 저장함
  • JobLauncher, Job, Step 구현체 내부에서 CRUD 기능을 처리한다.
  • @EnableBatchProcessing 애노테이션만 선언하면 JobRepository가 자동으로 빈으로 등록된다.

 

JobLauncher

  • 배치 Job을 실행시키는 역할을 한다.
  • Job과 Job Parameters를 인자를 받으며 요청된 배치 작업을 수행한 후 최종 client에게 JobExecution을 반환함
  • 스프링 부트 배치가 구동이 되면 JobLauncher 빈이 자동 생성 된다.

Job 실행

  • JobLauncher.run(Job, JobParameters)
  • 스프링 부트 배치에서는 JobLauncherApplicationRunner가 자동적으로 JobLauncher를 실행시킨다.
  • 동기적 실행
    • taskExecutor를 SyncTaskExecutor로 설정할 경우 -> 이게 기본 값
    • JobExecution을 획득하고 배치 처리를 최종 완료한 이후 Client에게 JobExecution을 반환
    • 스케줄러에 의한 배치처리에 적합함 -> 배치처리시간이 길어도 상관 없는 경우
  • 비동기적 실행
    • taskExecutor가 SimpleAsyncTaskExecutor로 설정한 경우
    • JobExecution을 획득한 후 Client에게 바로 JobExecution을 반환하고 배치처리를 완료한다.
    • HTTP 요청에 의한 배치처리에 적합함 -> 배치처리 시간이 길 경우 응답이 늦어지지 않도록 한다.

 

이상으로 포스팅을 마칩니다. 감사합니다.

 

참고 자료

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard

 

스프링 배치 - Spring Boot 기반으로 개발하는 Spring Batch - 인프런 | 강의

초급에서 중~고급에 이르기까지 스프링 배치의 기본 개념부터 API 사용법과 내부 아키텍처 구조를 심도있게 다룹니다. 그리고 스프링 배치 각 기능의 흐름과 원리를 학습하게 되고 이를 바탕으

www.inflearn.com

 

반응형
'개발/Spring Batch' 카테고리의 다른 글
  • 스프링 배치 개선하기 정리
  • Chunk Process
  • FlowJob
Debin
Debin
공부 기록을 남기며 게시글 리팩토링을 진행하는 블로그입니다.
  • Debin
    리팩토링하는 블로그
    Debin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • DB
        • DB 기초
        • MySQL
        • SQL 튜닝
      • OS
      • Network
      • Git
      • 디지털콘텐츠기획
      • 소프트웨어공학
      • 코딩테스트
        • 프로그래머스
        • 백준
        • 인프런
      • 공부 일지
      • 독서
        • 클린코드
        • 일상 속 사물이 알려주는 웹 API 디자인
        • 토비의 스프링
        • 객체지향의 사실과 오해
        • 자바 잘 읽는 법
      • 기록 및 회고
      • Cloud
        • AWS
      • 개발
        • Java
        • Spring Core
        • Spring MVC
        • Spring DB
        • Spring Boot
        • Spring Security
        • Spring Batch
        • JPA
        • Test
        • Android
      • 대외활동
        • UMC SERVER
        • 카엔프 SW 아카데미
      • 프로젝트
      • Docker
      • Gradle
      • ELK
      • 실무 이야기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

    • 본인 깃허브입니다!
  • 인기 글

  • 태그

    test
    ORM
    스프링 부트
    프록시
    spring mvc
    스프링
    innodb
    트랜잭션
    Java
    리눅스
    container
    컨테이너
    spring boot
    객체
    토비의 스프링
    JPA
    AOP
    객체지향
    AWS
    SQL
    도커
    redis
    인덱스
    운영체제
    mysql
    spring
    코딩 #개발자 #노마드북클럽 #노개북
    데이터베이스
    docker
    자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Debin
스프링 배치 핵심 도메인 기초
상단으로

티스토리툴바