https://spring.io/guides/gs/batch-processing/
Spring-Batch를 이용하여 작업을 한번에 묶어 처리하도록 만들어본다.
initializer로 Spring Batch와 HyperSQL Database를 dependency로 추가하고 프로젝트를 구성하면 된다. 또 가이드에서 알려주는 데로 아래 csv 파일을 추가해주고, sql 파일까지 작성해주자
## src/main/resources/sample-data.csv
Jill,Doe
Joe,Doe
Justin,Doe
Jane,Doe
John,Doe
## src/main/resources/schema-all.sql
DROP TABLE people IF EXISTS;
CREATE TABLE people (
person_id BIGINT IDENTITY NOT NULL PRIMARY KEY,
first_name VARCHAR(20),
last_name VARCHAR(20)
);
SpringBoot가 "schema-@@platfor@@.sql을 실행하면서 자동적으로 실행한다고 한다. 여기서 -all은 모든 플랫폼을 지칭하는 기본이여서 해당 코드가 항상 실행된다.
메인이 되는 코드 작업은 코드 양이 좀 되고, 오히려 개념을 알아가는 것이 더 도움이 될거 같아 코드는 github에서 찾아보는 걸 추천한다. 그 대신 이번 가이드의 핵심인 Spring-Batch에 대한 간략한 이해를 적어보려고 한다.
아래 내용들은 공식문서와, 공식문서 번역본을 참고했다. 후에 Spring-Batch에 대해 깊게 공부해야 할 때 다시 훑어보면 좋을 것 같다.
공식문서, 번역본
Spring-Batch에서 정말 필수적으로 알아야할 도메인 개념으로는 크게 5가지가 있는 것 같다.
단순히 말해서 batch Job으로 하나의 entity라고 볼 수 있다. 가장 큰 개념이라고 볼 수 있고, 추후에 나올 Step들로 구성되어 있다. 여러 Step 들의 순서를 배치하고, 해당 job의 재시작 가능 여부 정도를 설정하여 생성한다.
Job 자체가 작업의 정의라면, JobInstance는 하나의 논리적인 job 실행을 뜻한다고 한다. 말이 살짝 어려운데 나는 이렇게 바꿔서 이해했다.
Job은 여러 항목에서 뭐가 필요하다는 지시사항이 적혀있는 비어있는 틀이고, JobInstance는 각 여러 항목에 실제로 값이 들어가 있는 실행 단위이다.
좋지않은 비유일 수도 있지만 비어있는 회원가입 Form과 값을 당신의 아이디와 비밀번호를 직접 입력한 회원가입 창을 비교해보면 비슷한 느낌이 들지 않을까 생각한다.
바로 위 얘기와 연장선에 있는 개념이다. Job과 JobInstance를 구별해 줄 수 있으며, 실제적으로 Job을 실행하는데 사용하는 parameter set을 가지고 있는 객체이다.
앞 예시와 연결짓자면, 직접 입력한 아이디, 비밀번호, 이메일 등이 들어있는 set인 것이다.
실제로 실행과 연관된 객체이다. JobInstance의 경우 성공적으로 종료되기 전까지는 완료되지 않은 것으로 간주된다. 그렇기에 동일한 JobInstance에 대해 여러개의 관련된 JobExecution이 있을 수 있다. 문서 상에서는 JobExecution과 관련된 여러 많은 properties를 소개해주는데, 일단은 다루지 않고 넘어간다.
Step은 Job을 구성하는 요소로 독립적이고 순차적인 각각의 단계 라고 이해하면 편하다. 모든 Job은 최소 1개 이상의 Step으로 구성되어 있다. Step 또한 Job과 같이 StepExecution이 존재한다. 또한 Step에서 Chunk 사이즈를 조절하게 된다.
Step에서 아이템을 한번에 하나씩 읽어오는 역할을 한다. 더 이상 아이템이 없을 경우 null을 return하는 것도 특징이 될 수 있겠다. 보통
Flat 파일, XML, Database에서 데이터를 읽어오게 된다.
ItemReader와 비슷하지만 말 그대로 read가 아닌 write를 한다는 점이 큰 차이점이다. SQL을 사용한다면 이 시점에서 query를 이용해서 insert, update 등을 진행하게 될 것이다. 또 차이점이 있다면 items을 받는다. 일반적으로 chunk로 묶어 한번에 처리하므로 item이 아닌 items를 받게된다.
ItemReader와 ItemWriter 사이에 존재할 수도, 그렇지 않을 수도 있는 단계이다. 실제적으로는 비즈니스 로직을 추가해야 한다면 처음으로 고민해봐야 하는 부분이다. item을 읽어오고, 쓰는 파트에 직접적인 영향을 주지 않으며, 그 흐름안에서 item에 어떠한 작업을 하고 싶을 때 사용하면 될 것 같다. interface 자체도 객체를 받아 어떤 객체든 return 해주면 된다.
이 그림을 통해서 전체적인 흐름을 이해하면 좋을 것 같다. 결국 구성요소들을 잘 알아두면 만드는 거 자체야 살짝 찾아보면 되니 이정도의 이해도 나중에 충분히 도움이 될 거라고 확신한다.
생각했던 것 보다 좀 더 많은 개념을 필요로 했던 guide여서 시간을 좀 많이 썼다. 코드 자체도 새롭게 보이는 부분들이 많고, batch 자체도 학교 수업에서 딱 개념 자체만 배웠었던 정도였는데, 코드로 이를 보니 좀 많이 새로웠다. Spring-Batch에 대해서도 살짝 찾아보니 꽤나 정보가 방대하고, 많은 작업을 할 수 있어 보였다. 실제로 지금 내 수준에서는 유의미하게 건들어 보지 못할 거라고 판단해 이정도로 공부를 마치지만, 후에 사이즈가 큰 프로젝트나 일을 하게 된다면 다시 깊게 파봐야할 것 같다.
코드는 여기서 확인할 수 있다.