이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[Spring Batch] 스프링 배치 내부 흐름

  • 2024.02.25 17:50
  • Spring/Spring Batch
반응형

 

 

 

스프링 배치는 대용량 데이터를 효율적으로 처리하기 위해 설계된 프레임워크이다.

 

 

1. Chunk 단위로 나눠서 작업

데이터를 일정량의 Chunk 단위로 묶어서 처리한다.

각 Chunk는 여러 Item으로 구성되고 배치 작업은 Item을 하나씩 읽고 처리한 후 모든 Item이 처리되면 결과를 갱신한다.

대량의 데이터를 한 번에 처리할 때 발생할 수 있는 메모리 부하를 줄이고 로직 수행 중 오류가 발생한 경우 유연하게 복구할 수 있다.

 

 

2. 예외처리 

스프링 배치는 Job을 여러 Step으로 구성하는 방식으로 사용한다.

Step은 독립적인 작업 단위로, 특정 Step에서 예외가 발생했을 때 그 Step에 대해서만 예외를 처리할 수 있어 유연하다.

 

 

3. 트랜잭션

각 Chunk 처리 과정에서 트랜잭션을 시작하고 처리가 완료된 후 커밋한다. 

개발자가 별도로 트랜잭션을 구현하지 않아도 프레임워크 수준에서 자동으로 처리해준다.

 

 

 


 

 

 

 

Job은 배치 처리의 전체적인 단위로 하나의 배치 작업 과정을 의미하고, 여러 개의 Step으로 구성된다.

 

 

 

 

Instance : 논리적 실행 단위로 매개변수로 Instance를 구분한다

Execution : 인스턴스의 실제 실행으로 여러 번 실행될 수 있다 (실패 후 재실행 등..)

Parameter : 실행 시 제공되는 매개변수로 인스턴스를 구분할 때 사용한다

Context : 실행되는 동안 상태 정보나 데이터를 키-값 형태로 저장해 배치 작업의 여러 단계 간 상태를 공유한다 

Repository : 실행에 대한 정보(Context)를 데이터베이스에 저장해 배치 작업을 재시작 할 때 사용한다

Listener : before / after 메서드로 배치 작업의 실행 전후 커스텀 로직을 추가한다 

 

 

Step은 Tasklet Step과 Chunk Oriented Step으로 구분된다.

 

Tasklet Step

배치에서 가장 기본적인 구현체로 단일 작업을 수행할 때 사용된다.

간단한 작업 / 배치 작업 전후 필요한 준비 작업을 수행할 때 Tasklet Step으로 구현한다. 

 

Chunk Oriented Step

데이터를 일정한 Chunk 단위로 나눠 처리한다.

ItemReader로 데이터를 읽고, ItemProcessor로 데이터를 처리한 후 ItemWriter로 데이터를 저장한다.

 

 

 

 

 

 

@Component
public class FirstItemReader implements ItemReader<Integer> {

    // sample data
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    int i = 0;

    @Override
    public Integer read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        System.out.println("Inside Item Reader");
        Integer item;
        if(i < list.size()) {
            item = list.get(i);
            i++;
            return item;
        }
        return null; 
    }
}

 

 

 

@Component
public class FirstItemProcessor implements ItemProcessor<Integer, Long> {

    @Override
    public Long process(Integer item) throws Exception {
        System.out.println("Inside Item Processor");

        return Long.valueOf(item + 20);
    }
}

 

 

 

@Component
public class FirstItemWriter implements ItemWriter<Long> {
    
    @Override
    public void write(List<? extends Long> list) throws Exception {
        System.out.println("Inside Item Writer");
        list.stream().forEach(System.out::println);
    }
}

 

 

@Autowired
private FirstItemReader firstItemReader;

@Autowired
private FirstItemProcessor firstItemProcessor;

@Autowired
private FirstItemWriter firstItemWriter;

@Bean	
public Job secondJob() {
    return jobBuilderFactory.get("Second Job")
            .incrementer(new RunIdIncrementer())
            .start(firstChunkStep())
            .next(secondStep())
            .build();
}

private Step firstChunkStep() {
    return stepBuilderFactory.get("First Chunk Step")
            .<Integer, Long>chunk(3) 
            .reader(firstItemReader)
            .processor(firstItemProcessor)
            .writer(firstItemWriter)
            .build();

}

 

 

 

 

Reader로 DataSource에서 읽어온 데이터를 Processor에서 비즈니스 로직을 수행하고 Writer가 데이터를 최종적으로 저장하는 흐름이다.

 

Step을 구성할 때 명시하는 chunk로 한 번에 몇 개의 데이터를 한 덩어리로 가져올지 설정할 수 있다. 

 

역할과 책임을 명확하게 분리하는 구성으로 개발과 유지보수성을 높인다.

 

예시에서는 직접 read / write / process 메서드를 오버라이드해서 로직을 구현했는데

스프링 배치는 자주 사용되는 케이스에 대한 각 클래스의 구현체를 기본적으로 제공해 오버라이드 하지 않고 편하게 사용할 수 있게 도와준다.

 

 

@Bean
public FlatFileItemReader<Person> reader() {
    FlatFileItemReader<Person> reader = new FlatFileItemReader<>();
    
    reader.setResource(new ClassPathResource("sample.csv"));
    
    reader.setLineMapper(new DefaultLineMapper<Person>() {{
        setLineTokenizer(new DelimitedLineTokenizer() {{
            setNames(new String[] { "firstName", "lastName" });
        }});
        setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
            setTargetType(Person.class);
        }});
    }});
    
    return reader;
}

 

 

 

csv 파일에서 데이터를 읽어오고 각 라인을 특정 객체로 매핑하는 예시이다.

csv 말고도 Jdbc / JPA 등 여러 데이터소스로부터 데이터를 읽어오고 쓸 수 있는 구현체를 제공한다. 

 

 

스프링 배치를 사용해 비즈니스 로직을 구현할 때 Job과 Step을 어떻게 설계하는지가 매우 중요하다.

Job은 전체적인 배치 처리 작업의 큰 단위로 설정하고, Step은 그 작업을 구성하는 단위로 서로서로 연결될 수 있도록 유기적으로 설계해야 한다. 

 

데이터 로딩 -> 작업 디렉토리에 로딩한 데이터 반영 -> 데이터 전처리 -> 운영 데이터베이스에 적용 

 

하나의 Job을 위와 같은 방식으로 구성하듯.. 비즈니스 로직을 제대로 이해하고 가독성과 유지보수성을 고려한 Step을 설계하자.

 

반응형
저작자표시 (새창열림)

'Spring > Spring Batch' 카테고리의 다른 글

[Spring Batch] Chunk 아키텍처  (0) 2024.08.24
[Spring Batch] Flow 아키텍처  (2) 2024.07.21
[Spring Batch] Job / Step 아키텍처  (1) 2024.07.07
[Spring Batch] 배치 도메인 이해  (0) 2024.06.30
[Spring Batch] ItemReader / ItemWriter  (1) 2024.02.27

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Spring Batch] Flow 아키텍처

    [Spring Batch] Flow 아키텍처

    2024.07.21
  • [Spring Batch] Job / Step 아키텍처

    [Spring Batch] Job / Step 아키텍처

    2024.07.07
  • [Spring Batch] 배치 도메인 이해

    [Spring Batch] 배치 도메인 이해

    2024.06.30
  • [Spring Batch] ItemReader / ItemWriter

    [Spring Batch] ItemReader / ItemWriter

    2024.02.27
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (677)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (17)
    • 👥 모각코 (9)
    • 💬 기록 (7)
    • 📚 공부 (6)
    • -------------- (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바