Search

반응형

'Software/Spring'에 해당되는 글 6건

  1. 2021.12.05 [spring batch]처음 시작하기 2탄. (스프링 배치)
  2. 2021.11.21 [spring batch]처음 시작하기 1탄. (스프링 배치)
반응형

1탄에 이어 설명해 본다.

스프링 배치(spring batch)는 별도로 추가 코딩 작업량을 줄여주는 많은 클래스들을 제공해서 

비즈니스 로직에 집중할 수 있도록 한다.

 

 

https://spring.io/guides/gs/batch-processing/#scratch 참조

먼저 작업을 구성해야 하는데 @Configuration 클래스를 위 예제처럼 구성해야 한다.

@EnableBatchProcessing 어노테이션은 Job을 지원하는 주요 빈(bean)이 추가된다.

스프링 배치(spring batch)는 job과 step이 필요하므로

BatchConfiguration에 JobBuilderFactory와 StepBuilderFactory 객체를 추가한다.

 

이제 reader, processor, writer를 추가해 보자.

https://spring.io/guides/gs/batch-processing/#scratch 참조

reader()는 @Bean 어노테이션을 붙여서 사용한다.

<Person> 비즈니스 클래스를 사용한다.

return으로 FlatFileItemReaderBuilder<Person>() 생성자를 new를 사용해서 

인스턴스화 한다.

우선 .name은 personItemReader라고 정했다. 임의로 본인이 알아보고 쉽게 정하면 된다.

.resource는 데이터가 있는 파일을 지정한다. Database는 reader부터 다른 방식으로 사용한다.

.delimited() 는 파일 구분자로 파싱을 한다.

.names를 통해 키 값을 정하고 

.fieldSetMapper로 Person.class와 값을 매핑한다.

이렇게 .build() 하면 reader는 설정된다.

 

.

https://spring.io/guides/gs/batch-processing/#scratch 참조

 

두번째로 processor()는 reader()에서 읽어온 한 건의 데이터를 

비즈니스적으로 처리를 할 수 있다.

https://spring.io/guides/gs/batch-processing/#scratch 참조

 

마지막으로 writer()이다.

reader()에서 읽어 온 데이터를 가지고 저장/수정 처리를 한다.

.sql에서 insert문을 확인할 수 있다.

:firstName, :lastName은 Person의 속성 값과 매핑된다.

 

https://spring.io/guides/gs/batch-processing/#scratch 참조

이제 실제 배치를 설정한다.

우선 Job을 만들고 .flow로 step을 지정한다.

step1에서 reader, processor, writer를 순서대로 지정해 준다.

 

https://spring.io/guides/gs/batch-processing/#scratch 참조

JobCompletionNotificationListener 클래스는 job 리스너로

job 시작 전과 후에 비즈니스 처리가 가능하다.

위 예제는 afterJob 메서드를 구현해서

Job이 끝날 때 마지막 작업을 코딩했다.

내용을 보면 select 문을 사용해서

입력 사항들이 잘 처리되었는지 확인하는 작업을 기록했다.

https://spring.io/guides/gs/batch-processing/#scratch 참조

System.exit와 SpringApplication.exit는 배치가 실행되고 완료에 대한 조치 시 필요하다.

위 두개의 코드가 JVM 종료를 보장한다.

지금까지 spring.io에 있는 스프링 배치(spring batch) 예제를 같이 살펴봤다.

정말 기초적인 부분만 다룬 것으로 좀 더 전문적으로 공부를 한다면

spring.io 상단 메뉴 projects에서 Spring Batch를 보면 된다.

 

 

반응형
반응형

스프링 배치(spring batch) 프로그램을 갑자기 요청받았다.

한 번도 스프링 배치(spring batch)를 사용한 적이 없기에 spring.io를 방문했다.

우선 가이드(guide)에 있는 스프링 배치(spring batch) 서비스 만들기를 참조했다.

 

 

영어로 된 사이트를 잘 읽고 정리하는 포스팅이므로 원문을 보고 싶다면 spring.io에 방문하면 된다.

우선 스프링 부트(spring boot)로 개발환경이 되어 있어야 한다.

메이븐(maven) 또는 그레이들(gradle) 빌더로 준비 끝.

 

프로젝트는 스프링 배치(spring batch)를 만들 것이기에

Dependencies는 Spring Batch와 HyperSQL Database를 선택하고 Generate 하면 된다.

 

비즈니스 데이터

우선 스프링 배치(spring batch) 샘플 프로그램을 만들기 위해서

테스트용 데이터가 필요하다.

spring.io 가이드를 보면 성과 이름을 가지고 대문자로 변환하는 스프링 배치(spring batch)를 구현하고 있다.

우리도 그럼 데이터를 만들어보겠다.

먼저 오라클이나 Mysql을 사용하려면 다운받고 설치하고 설정해야 하는데

우선 스프링 배치(spring batch)에 집중하기 위해 번거로운 작업을 피해서

csv파일을 활용해 보자.

spring.io와 다르게 다른 이름을 활용하자.

우선 엑셀을 실행하거나 또는 메모장을 열어도 좋다.

엑셀은 각 셀마다 이름과 성을 넣고 sample-data라는 이름으로 csv확장자로 저장한다.

메모장의 경우는 콤마(,)로 성과 이름을 구분해서 입력하고 sample-data.csv

Kabsu, Kim

YoungHee, Cho

MinJong, Ahn

Sam, Jackson

Joon, Park

이름과 성은 CSV 타입으로 콤마로 값을 구분한다.

위 데이터 구조는 별 다른 사용자의 변환 없이 처리할 수 있는

상당히 일반적인 패턴이다.


HyperSQL Database에 테이블을 생성해보자

spring.io의 테이블 생성 스크립트를 그대로 사용해보겠다. (출처:spring.io)

 

DROP TABLE people IF EXISTS;

CREATE TABLE people  (
    person_id BIGINT IDENTITY NOT NULL PRIMARY KEY,
    first_name VARCHAR(20),
    last_name VARCHAR(20)
);

데이터와 테이블 스크립트는 스프링 배치(spring batch) 프로젝트의

resources 폴더에 생성하면 된다.

 

비즈니스 데이터(이름과 성)를 구성했고

이를 저장할 테이블 스크립트까지 구성했다.

 

이제 비즈니스 데이터를 관리할 비즈니스 클래스를 만들어보자.

흔히 우리가 사용하는 DTO 또는 getter, setter 클래스이다.

 

https://spring.io/guides/gs/batch-processing/#scratch 참조

전체 소스는 spring.io에서 제공받을 수 있고 여기서는 개념 정리를 우선으로 하자.

 

Person에 대한 비즈니스 클래스를 구성했다.

우리의 스프링 배치(spring batch)는 성과 이름을 대문자로 바꾸는 기능을 한다.

그렇다면 어디선가 그런 기능을 갖고 있어야 한다.

스프링 배치(spring batch)에서는 이런 역할을 ItemProcessor에서 담당한다.

데이터를 수집하고 변환한 뒤 다른 곳으로 보내는 기능이 배치의 일반적 기능으로 보면 되고

스프링 배치(spring batch) 역시 배치이기에 같은 패러다임을 따르게 된다.

그 구성을 살펴보자.

import org.springframework.batch.item.ItemProcessor;

스프링 배치(spring batch)의 ItemProcessor을 사용한다.

이미 엔진은 만들어져 있기에 우리는 비즈니스 로직에만 신경 쓰면 된다는 것이

스프링 배치(spring batch)의 철학인 듯하다.

 

public class PersonItemProcessor implements ItemProcessor<Person, Person> {

클래스 선언부로 스프링 배치(spring batch)의 ItemProcessor 인터페이스를 구현했다.

타입은 입력 Person, 출력 Person 클래스 타입을 사용한다.


  @Override
  public Person process(final Person person) throws Exception {

스프링 배치(spring batch) ItemProcessor 인터페이스의 process 추상 메서드를

Override 해서 구현한다.


    final String firstName = person.getFirstName().toUpperCase();
    final String lastName = person.getLastName().toUpperCase();

이름과 성을 toUpperCase() 함수를 사용해서 대문자로 변환한다.


    final Person transformedPerson = new Person(firstName, lastName);

변환된 대문자 이름과 성을 새로운 Person 객체로 생성자 파라미터로 넘겨서 생성한다.

즉, 입력받은 (대문자 변환 전) Person과 새로운 (대문자로 변환된) 객체가 존재한다.

    return transformedPerson;

스프링 배치(spring batch) ItemProcessor 인터페이스의 process 메서드에서

받은 이름을 대문자로 변환해서 새로운 Person 객체를 생성자에 파라미터로

넘겨서 생성한 뒤 리턴하는 상황이다.

 다음 포스팅은

스프링 배치(spring batch)에서 데이터를 읽어오는 Reader부분과

이번 포스팅에서 만든 처리 부분

그리고 마지막 데이터베이스에 작성하는 Writer부분에 대해 같이 살펴볼 것이다.

그리고 스프링 배치(spring batch)의 Job과 Step에 대해서도 알아본다.

 

 

반응형