Page l 1
Page l 2
Page l 3
실행환경배치처리레이어 (1/2) 1. 개요 대용량데이터처리를위한기반환경을제공하는 Layer 임 서비스그룹 설명 Presentation Layer 전자정부표준프레임워크실행환경 Business Logic Layer Persistence Layer Batch Layer Integration Layer Mobile Presentation Layer Layer Mobile Device API Presentation Layer Business Logic Layer Batch Layer Persistence Layer 업무프로그램과사용자간의 Interface 를담당하는 Layer 로서, 사용자화면구성, 사용자입력정보검증등의기능을제공함 업무프로그램의업무로직을담당하는 Layer 로서, 업무흐름제어, 에러처리등의기능을제공함 대용량데이터처리를위한기반환경을제공하는 Layer 임 데이터베이스에대한연결및영속성처리, 선언적인트랜잭션관리를제공하는 Layer 임 Foundation Layer ( 공통기반레이어 ) Integration Layer 타시스템과의연동기능을제공하는 Layer 임 환경 서비스그룹 Foundation Layer 실행환경의각 Layer 에서공통적으로사용하는공통기능을제공함 Page l 4
실행환경배치처리레이어 (2/2) 1. 개요 배치처리레이어는 Batch Core, Batch Execution, Batch Support 등총 3 개의서비스를제공함 실행환경 화면처리레이어 업무처리레이어 데이터처리레이어 배치처리레이어 연계통합레이어 모바일화면처리 모바일디바이스 API Ajax Support MVC UI Adaptor Internationalization Security Biz. Process Management Exception Handling Data Access ORM Transaction DataSource Batch Core Batch Execution Batch Support Message Service Naming Service Web Service UX/UI Component Device API 공통기반레이어 AOP Cache Compress/Decompress Encryption/Decryption Excel File Handling File Upload/Download FTP ID Generation IoC Container Logging Mail Marshalling/Unmarshalling Object Pooling Property Resource Scheduling Server Security String Util XML Manipulation Page l 5
Batch 개념 1. 개요 Batch 작업의정의 Batch processing is execution of a series of programs ("jobs") on a computer without human interaction [ 출 처 : Wikipedia] Without Human Interaction Batch From Time Based Event 주요사례 : PC 에서프린트출력, 웹사이트로그분석, 주기적으로계산처리하는회계결산이나급여작업등 Batch 작업의특징 특징관리자에의한실행스케줄링사용백그라운드실행 설명 - 상용대형컴퓨터나서버에서는일반적으로시스템사용자에의해실행 - 특정시간에자동으로실행되도록정의 - 주로 Back Ground( 후면 ) 에서실행 - 배치작업보다우선순위가높고 Fore Ground( 전면 ) 에서실행되는인터랙티브프로그램이사용자의요청을기다리는시간에실행 Page l 6
Spring Batch 1. 개요 Spring Batch Spring Batch is a lightweight, comprehensive batch framework designed to enable the development of robust batch applications vital for the daily operations of enterprise systems Spring Batch 기능 Batch Monitoring 기능제공 Commit Interval 지원 Retry, Restart, Skip 기능지원 Commit/Rollback/Retry Count 정보제공 Quartz, Command Line, Web 등을통한실행지원 Page l 7
Spring Batch 구성요소 (1/5) 1. 개요 Spring Batch 기본구성 Page l 8
Spring Batch 구성요소 (2/5) 1. 개요 Spring Batch 구성요소 구분 설명 JobLauncher JobLauncher 는 Batch Job 을실행시키는역할수행. Job 과 Parameter 를받아서실행하며 JobExecution 를반환. JobRepository 수행되는 Job 에대한정보를담고있는저장소. Job 이수행, 종료, 실행횟수및결과등, Batch 수행과관련된모든 Meta Data 가저장되어있음 Job 실행시킬작업. 논리적인 Job 실행의개념. JobParameter JobInstance Batch Job 을실행하는데사용하는파라미터의집합으로 Job 이실행되는동안에 Job 을식별하거나 Job 에서참조하는데이터로사용 논리적인 Job 실행 (JobInstance=Job+JobParameter) Step Batch Job 을구성하는독립적인하나의단계. Job 은 1 개이상의 Step 으로구성실제 Batch 처리과정을정의하고, 제어하는데필요한모든정보를포함 Step 의내용은전적으로개발자의선택에따라구성됨. Item 처리할데이터의가장작은구성요소. ( 예 ) 파일의한줄, DB 의한 Row, Xml 의특정 Element ItemReader Step 안에서 File 또는 DB 등에서 Item 을읽어들임. 더이상읽어올 Item 이없을때에는 read() 메소드에서 null 값을반환하며그전까지는순차적인값을리턴. ItemWriter Step 안에서 File 또는 DB 등으로 Item 을저장. Item Processor Item reader 에서읽어들인 Item 에대하여필요한로직처리작업을수행. Page l 9
Spring Batch 구성요소 (3/5) 1. 개요 Spring Batch Layered Architecture 서비스그룹 Application 설명 Spring Batch 를이용해개발된 Batch Job 과커스텀코드 Batch Core Batch Job 을실행하거나제어하는데필요한설정또는구현체 ( 예 : JobLauncher/Job/Step) Batch Infrastructure Application 과 Core 에서사용하는 I/O 나기본적인서비스기능 Page l 10
Spring Batch 구성요소 (4/5) 1. 개요 Spring Batch Architecture 회색박스 외부어플리케이션으로 Spring Batch 의범위에포함되지않음파란박스 Spring Batch 가제공하는 Application Architecture Service 녹색박스 개발자구현부분으로 Job Scheduler 나 Job 설정파일등을포함 Page l 11
Spring Batch 구성요소 (5/5) 1. 개요 Spring Batch Architecture Tier 설명 Run Tier Scheduling 과 Application 실행담당 Spring Batch 에서는 Scheduling 기능을따로제공하지않고 Quartz 같은외부모듈이나 Cron 을이용하도록권고 Job Tier Application Tier Data Tier 전체적인 Job 실행담당 Job 내의각 Step 들을지정한정책에따라순차적으로수행 Job 을실행하는데필요한컴포넌트들로구성 Database, File 등물리적데이터소스와결합이이루어지는영역 Page l 12
Page l 13
Job Repository 2. Batch 구성요소 개념 JobRepository 은수행되는 Job 에대한정보를담고있는저장소로 JobExecution 과 StepExecution 에대한 CRUD 기능수행 Batch 작업최초실행시 JobRepository 에서 JobExecution 이생성되고 Batch 작업이실행되는동안 설정 StepExecution 및 JobExecution 의정보들이 JobRepository 에저장되고갱신됨 <job-repository id="jobrepository" data-source="datasource" transaction-manager="transactionmanager" isolation-level-for-create="serializable" table-prefix="batch_" max-varchar-length="1000" /> Database 방식과 Memory 방식지원 Spring Batch 는 jobrepository 를 Database 또는 Memory 로설정가능 작업상태를유지하지않아도되는 Batch 작업을수행할경우 Memory Repository 를통해 Job 을실행 <bean id="jobrepository" class="org.springframework.batch.core.repository.support.mapjobrepositoryfactorybean"> <property name="transactionmanager" ref="transactionmanager"/> Page l 14
Job Launcher (1/2) 2. Batch 구성요소 개념 JobLauncher 는 Batch 작업을실행시키는역할을수행하며 Job 과 Job Parameters 를이용하여요청된 Batch 작 설정 업을실행후 JobExecution 을반환. <bean id="joblauncher" class="org.springframework.batch.core.launch.support.simplejoblauncher"> <property name="jobrepository" ref="jobrepository" /> JobLauncher Interface 의기본구현클래스로는 SimpleJobLauncher 가제공. SimpleJobLauncher 클래스는 JobName 과 JobParameter 를이용하여 JobRepository 에서 JobExecution 을획득 하고작업을수행함. jobrepository 설정은필수임 Page l 15
Job Launcher (2/2) 2. Batch 구성요소 Job 의동기적실행과비동기적실행 JobLauncher 는 taskexecutor 설정을통해 Job 을동기적혹은비동기적으로실행가능. 별도로설정하지않으면 synctaskexecutor 클래스가 Dafault 로설정됨. <bean id="joblauncher" class="org.springframework.batch.execution.launch.simplejoblauncher"> <property name="jobrepository" ref="jobrepository" /> <property name="taskexecutor"> <bean class="org.springframework.core.task.synctaskexecutor" /> </property> <bean id="joblauncher" class="org.springframework.batch.execution.launch.simplejoblauncher"> <property name="jobrepository" ref="jobrepository" /> <property name="taskexecutor"> <bean class="org.springframework.core.task.simpleasynctaskexecutor" /> </property> Page l 16
Job Runner (1/3) 2. Batch 구성요소 개념 외부실행모듈과 JobLauncher를연결해주는모듈 유형 Command Line방식, Web 방식 (Scheduler는두가지방식모두가능 ) Job Runner Command Line 방식 Web 방식 Command Line Http JMS Scheduler Cron Scheduler Web Service Page l 17
Job Runner (2/3) 2. Batch 구성요소 Command Line 방식 CommandLineJobRunner 라는클래스를이용하면 main 메소드가포함된일반적인 java application 처럼 Spring Batch 의 Job 들을실행 java CommandLineJobRunner [ 설정파일명 ] [ job 이름 ] [Job Parameter A=B 형태 ] 예시 Web 방식 Web 방식은 WebApplicationContext 에 job Launcher 및 job 설정을 bean 으로등록한후, Controller 에 Http Request 요청이왔을때, Job Launcher 의 run() 메소드를호출하여작업수행 @RequestMapping(value="/batchRun.do", method = RequestMethod.POST) public String batchrun(@requestparam(value = "jobname", required = false) String jobname, @RequestParam(value = "async", required = false) String async, Model model){ try { JobExecution jobexecution = joblauncher.run(jobregistry.getjob(jobname), getuniquejobparameters(jobname));.. Page l 18
Job Runner (3/3) 2. Batch 구성요소 Scheduler 설정 Spring Batch 에서는내부적으로 Quartz 를이용해서실행스케줄을설정 Command Line 과 Web 에서모두사용가능 <bean class="org.springframework.scheduling.quartz.schedulerfactorybean"> <property name="triggers"> <bean id="crontrigger" class="org.springframework.scheduling.quartz.crontriggerbean"> <property name="jobdetail" ref="jobdetail" /> <property name="cronexpression" value="0/10 * * * *?" /> </property> <bean id="jobdetail" class="org.springframework.scheduling.quartz.jobdetailbean"> <property name="jobclass" value="org.springframework.batch.sample.quartz.joblauncherdetails" /> <property name="group" value="quartz-batch" /> <property name="jobdataasmap"> <map> <entry key="jobname" value="footballjob"/> <entry key="joblocator" value-ref="jobregistry"/> <entry key="joblauncher" value-ref="joblauncher"/> </map> </property> <bean id="jobregistry" class="org.springframework.batch.core.configuration.support.mapjobregistry" /> Page l 19
Job (1/2) 2. Batch 구성요소 Job 개념 Job 은 Batch 작업중심개념으로 Batch 작업자체를의미 Job 은실제프로세스가진행되는 Step 을최상단에서포함하고있으며 Job 의실행은 Batch 작업전체실행의 미 Job 설정 <job id="footballjob job-repository= jobrepository" > <step id="playerload" next="gameload" /> <step id="gameload" next="playersummarization" /> <step id="playersummarization" /> </job> 구분 id step jobrepository job 식별자 설명 job 은적어도하나이상의 step 을정의 Batch 작업실행중 JobExecution 을주기적으로저장하기위한저장소 (default 설정은 'jobrepository' 로생략가능 ) Restart 가능여부설정 동일한 Job Instance 에대해 Job 실패시 Job Restart 를가능하게하는옵션 (COMPLETED 일경우 Restart 불가 ) restartable=false 로설정된 job 을재시작할경우 JobRestartException 발생 Page l 20
Job (2/2) 2. Batch 구성요소 Job Instance JobInstance는논리적 Job 실행의개념으로 JobInstance = Job + JobParameters로표현할수있음. JobInstance는동일한 Job이각기다른 JobParameter를통해실행된 Job 실행단위임. Job Parameters JobParameters는하나의 Job에존재할수있는여러개의 JobInstance를구별하기위한 Parameter 집합임. Job이실행되는동안에 Job을식별하거나 Job에서참조하는데이터로사용됨. Job Parameter를통해여러 JobInstance 생성가능. Page l 21
Job Execution 2. Batch 구성요소 Job Execution JobExecution 은한번의 Job 시도를의미하는기술적인개념. Status 가 COMPLETED 인 JobExecution 을가진 JobInstance 는 restart 불가. Job 에정의된 Step 들을순서에따라실행 JobRepository 에실행정보저장. Job Execution Property 정보 status starttime 구분 JobExecution 의상태를보여주는지표 - 수행중 : STARTED - 실패 : FAILED - 성공 : COMPLETED Job 이실행된시간 endtime Job 이종료된시간 (Job 성공여부와무관함 ) exitstatus createtime lastupdated executioncontext failureexceptions Job 의실행결과를보여주는상태값 JobExecution 정보가최초에생성된시간 (starttime 보다 createtime 이먼저등록됨 ) 설명 JobExecution 정보가마지막으로변경된시간 JobExecution 정보를담고있는공간 Job 수행동안발생한 Exception 의 List Page l 22
Step (1/2) 2. Batch 구성요소 Step 개념 Step은 Job 내부에구성되어실제 Batch작업수행을위해작업을정의하고제어함. Step은 Job의독립적이고순차적단계를캡슐화하는도메인객체이고모든 Job은적어도하나이상의 Step으로구성되며 Step에실제 Batch작업을처리하고제어하기위해필요한모든정보가포함됨. Step에는 JobExecution에대응되는 StepExecution이있음. Job 내에복수개의 Step 설정가능 Job + JobParameter JobInstance + 실행시점 Job 실행내에복수개의 Step 이실행 Step 설정으로여러번의실행가능 Page l 23
Step (2/2) 2. Batch 구성요소 Step 설정 Step 에서는입력자원을설정하고어떤방법으로어떤과정을통해처리할지그리고어떻게출력자원을만들 것인지에대한모든설정을포함. <job id="samplejob" job-repository="jobrepository"> <step id="step1"> <tasklet transaction-manager="transactionmanager"> <chunk reader="itemreader" writer="itemwriter" commit-interval="10"/> </tasklet> </step> </job> 구분 설명 reader writer transaction-manager commit-interval Batch 작업을위해 item 을읽는 ItemReader ItemReader 에의해읽힌 item 을쓰는 ItemWriter Spring 의 PlatformTransactionManager 로 Batch 작업중트랜잭션을시작하고커밋하는데사용 (default 설정은 transactionmanger 이며생략가능 ) 트랜잭션이커밋되기전처리되어야할 item 의수 ItemProcessor 속성은옵션이며 ItemProcessor 가없는경우 reader 에서 writer 로직접전달됨 Page l 24
Step Execution 2. Batch 구성요소 Step Execution StepExecution은 Step을수행하기위한단한번의 Step 시도를의미하며매번시도될때마다생성. StepExecution은주로 Step이실행중에어떤일이일어났는지에대한속성들을저장하는저장메커니즘역할을하며 commit count, rollback count, start time, end time 등의 Step 상태정보를저장함.(commit 시점에데이터갱신되며, restart, 통계용도로주로사용됨 ) JobRepository로실행정보저장 Event(Exception 등 ) 발생시에 Step Listener를이용해서해당 Event처리가능 구분 설명 status StepExecution의상태를보여주는지표 ( STARTED/ FAILED/ COMPLETED ) starttime Step이시작된시간 endtime Step이종료된시간 exitstatus Step의실행결과를보여주는상태값 readcount 성공적으로읽은데이터의개수 writecount 성공적으로쓴데이터의개수 commitcount StepExecution 동안 Commit된횟수 rollbackcount StepExecution동안 Rollback된횟수 readskipcount 데이터읽기도중실패로인하여 skip한횟수 processskipcount 데이터처리도중실패로인하여 skip한횟수 filtercount ItemProcessor에서 Filtering한데이터의개수 writeskipcount 데이터쓰기도중실패로인하여 skip한횟수 Page l 25
Step 유형 2. Batch 구성요소 Chunk-Oriented Processing Spring Batch에서가장일반적으로사용하는 Step 유형 Item 읽기 (Read) 처리 / 변환 (Processor) 쓰기 (Write) 의단계를거치는메커니즘 구성요소 : ItemReader, ItemWriter, PlatformTransactionManager, JobRepository 중요속성 : commit interval( 하나의트랜잭션당처리개수 ), startlimit(step의실행횟수제한 ) Page l 26
Step 흐름제어 (1/2) 2. Batch 구성요소 Step Flow Control Step 내의 next 설정과 Decision 설정으로 Job을수행할수있음 Step의처리결과에따라다른 Step을선택하여수행할수있고, 특정 Step의실패가 Job 전체의실패로이어지지않도록구성할수있음 [ 순차적인 Step 실행 ] [ 조건에따른 Step 실행 ] 설명 - 모든 Step을순서대로실행 - Step 엘리먼트의 'next' 어트리뷰트를이용해서설정 - Spring Batch의 XML 설정은 Job 설정최상단 Step이최초로실행되며, 그후의 Step 실행순서는 XML 설정순서와는관계없음 소스코드 <job id="job"> <step id="stepa" parent="s1" next="stepb" /> <step id="stepb" parent="s2" next="stepc"/> <step id="stepc" parent="s3" /> </job> 설명 - 조건에따라 Step 실행 - next 엘리먼트는사용횟수에제한이없으며, 실행실 패에대한 default 설정이없음 소스코드 <job id="job"> <step id="stepa" parent="s1"> <next on="*" to="stepb" /> <next on="failed" to="stepc" /> </step> <step id="stepb" parent="s2" next="stepc" /> <step id="stepc" parent="s3" /> </job> Page l 27
Step 흐름제어 (2/2) 2. Batch 구성요소 Batch Status 와 Exit Status 의관계 구분 Batch Status Exit Status 특징 Job 과 Step 의수행상태표현 Step 의수행이완료된시점의상태표현 상태값 COMPLETED, STARTING, STARTED, STOPPING, STOPPED, FAILED, ABANDONED or UNKNOWN EXECUTING, COMPLETED, NOOP, STOPPED, FAILED, UNKNOWN & Custom Exit( 사용자정의가능 ) 활용 배치운영환경에서 Job 의상태를확인하고자할경우에사용 Step 이나 decision 의 next on 에해당하는조건값으로사용 표현 JobExecution, StepExecution 테이블의 status 항목에기록 JobExecution 과 StepExecution 테이블의 ExitCode 항목에기록 Page l 28
ItemReader 와 ItemWriter(1/3) 2. Batch 구성요소 Item 종류 Item 의종류로는 Reader( 필수 ), Processor( 옵션 ), Writer( 필수 ) 가있음 ItemProcessor ItemProcessor 는아이템변환및처리를목적으로하고, Generic 개념의도입으로타입안정성까지강화 public interface ItemProcessor<I, O> { process(i item) throws Exception; } Foo 타입의 input 을받아 Bar 타입으로변환하는예 public class FooProcessor implements ItemProcessor<Foo,Bar>{ public Bar process(foo foo) throws Exception { //Perform simple transformation, convert a Foo to a Bar return new Bar(foo); } } Page l 29
ItemReader 와 ItemWriter(2/3) 2. Batch 구성요소 ItemReader 의종류 Flat File, XML, Database 등의데이터타입을입력받을수있음 ItemReader AggregateItemReader FlatFileItemReader StaxEventItemReader JdbcCursorItemReader 설명 DelegatingItemReade 를확장한클래스. Read 메소드의결과로 java.util.collection 객체를반환함. 직접파일을 READ 하지않고대신 READ 할클래스를지정함 ( 주로 Parrlel 작업에사용됨 ) 플랫파일을읽어와서 read() 메소드에서 String 을반환함. Flat file 에서 item 을읽어들이며 ItemStream 을구현하고있음. StAX 를통해서 XML 파일에서 Item 을읽음 JDBC 를이용해서 DB 에서 Item 을읽어옴 HibernateCursorItemReader 하이버네이트의 HQL 을사용해서커서기반으로 Item 조회를함. IbatisPagingItemReader ibatis 를통해 Driving query 기반으로 Item 을읽어들임 JmsItemReader read 메서드에서 javax.jms.message 객체를반환. Spring 의 JmsOperations 객체의 receive 메소드를통해서 Item 을조회함 JpaPagingItemReader JPQL 문에기반하여 row 를페이지단위로읽어큰데이터를읽을때메모리부족이생기지않음 JdbcPagingItemReader SQL 문에기반하여 row 를페이지단위로읽어큰데이터를읽을때메모리부족이생기지않음 Page l 30
ItemReader 와 ItemWriter(3/3) 2. Batch 구성요소 ItemWriter 의종류 Flat File, XML, Database 등을지원함 ItemWriter AbstractItemStreamItemWriter CompositeItemWriter 설명 ItemStream and ItemWriter interfaces 를결합하여만든 Abstract Class 가장기본적인 ItemWriter Interface Item 을 List 로담겨진여러개의 ItemWriter 에게전달하여처리한다 ItemWriterAdapter 다른어플리케이션의클래스를 Spring Batch 에적용할수있도록하는 ItemWriter interface 이다. PropertyExtractingDelegatingItemW riter FlatFileItemWriter HibernateItemWriter JdbcBatchItemWriter JpaItemWriter StaxEventWriterItemWriter ItemWriter 인터페이스를구현하지않은기존의클래스를 ItemWriter 로쓰고자할때, 이 ItemWriter 의구현체를써서기존클래스에파라미터로넘겨질속성값들을지정하고실행할수있다 Item 을 String 으로변환해서 Flat File 에쓸수있게하는 ItemWriter Hibernate 를이용하여 DB 로 Item 을쓸수있게하는 ItemWriter Jdbc 를이용해 Batch Update 의형태로 DB 로 Item 을쓸수있게하는 ItemWriter JPA EntityManager 인식및핸들링할수있는 ItemWriter StAX 를이용해서 Item 을 XML 파일에쓰는 ItemWriter Page l 31
Page l 32
Spring Batch 2.x 주요업그레이드 (1/4) 3. Spring Batch 2.x Java 5 Annotation, Generic 지원 Spring Batch 지원 Annotation @BeforeJob @AfterJob @BeforeStep @AfterStep @BeforeRead @AfterRead @OnReadError @OnProcessError @BeforeProcess @AfterProcess @OnWriteError @OnSkipInRead @BeforeWrite @AfterWrite @OnSkipInProcess @OnSkipInWrite Chunk Oriented Processing 1.x에서는 Item 기반으로작업처리 Chunk 기반처리는지정한크기만큼 Item을읽고처리한후이결과를 List의형태로가지고있다가한번에쓰 는방식 Page l 33
Spring Batch 2.x 주요업그레이드 (2/4) 3. Spring Batch 2.x Xml Namespace 1.x 에서는 XML 설정시모든설정을 Bean으로등록 2.0 에서는 XML Namespace가추가되어 XML 설정상에서 Job과 Step과의관계를명시적으로확인할수있으며사용하고있는 Item Reader/writer 파악용이 [ Spring Batch 1.x ] [ Spring Batch 2.x ] Page l 34
Spring Batch 2.x 주요업그레이드 (3/4) 3. Spring Batch 2.x Meta Data enhancements 1.x에서는 Batch 작업실행중인상태에서 JobRepository에직접접근불가 2.x에서는 JobExplorer와 JobOperator가추가되었고이를통해 JobRepository에접근할수있게되어 Batch작업수행도중 Meta Data를조회하거나실행중인 Job을제어할수있음 Page l 35
Spring Batch 2.x 주요업그레이드 (4/4) 3. Spring Batch 2.x Non Sequential Step Execution 1.x의경우모든 Step의실행이순차적으로이루어져예외상황발생시해당 Item은 Skip하고다음 Item을처리하거나해당 Job의 Fail 처리를 Listener나 ItemProcessor를통해제어 2.0은추가된 Control Flow를이용하면현재진행중인작업의처리결과상태 (Exit Status) 에따라수행할다음 Step을지정하거나우회된 Step으로진행하거나 Job 중지가가능 [ 조건처리 ] [ Step 제어방식의변화 ] Page l 36
Page l 37
Flat File 처리 (1/4) 4. Batch Processing Flat File 플랫파일은 2 차원데이터를포함하는유형의파일로 Flat File 을읽고파싱하는기본적인기능을제공함. Flat File 의두가지 Token 방식 구분 설명 구분자 (delimiter) 를이용하여 Element 를구분함 1. 파일에서한줄읽기 2. 한줄문자열을 LineTokenizer.tokenize() 메소드에전달해서 FieldSet 을받아옴 3. 반환받은 FieldSet 을 FieldSetMapper 에게전달하고, 그결과객체를 ItemReader.read() 에서반환. 구분자 (Delimited) 방식 FlatFileItemReader itemreader = new FlatFileItemReader(); itemreader.setresource(new FileSystemResource("resources/players.csv")); //DelimitedLineTokenizer defaults to comma as it's delimiter itemreader.setlinetokenizer(new DelimitedLineTokenizer()); itemreader.setfieldsetmapper(new PlayerFieldSetMapper()); itemreader.open(new ExecutionContext()); Player player = (Player)itemReader.read(); 전문과같이고정길이의문자열을통해 Element 를구분함 고정길이 (Fixed Length) 방식 1. 파일에서한줄읽기 2. FixedLengthLineTokenizer() 메소드이용 FieldSet 을받아옴 3. 반환받은 FieldSet 을 FieldSetMapper 에게전달하고, 그결과객체를 ItemReader.read() 에서반환. <bean id="fixedlengthlinetokenizer" class="org.springframework.batch.io.file.transform.fixedlengthtokenizer"> <property name="names" value="isin, Quantity, Price, Customer" /> <property name="columns" value="1-12, 13-15, 16-20, 21-29" /> Page l 38
Flat File 처리 (2/4) 4. Batch Processing Flat File Read Mechanism Item 을한라인씩읽어서 String 으로변환후에 VO 로변환 FlatFile 1 Line String By FlatFileItemReader (BufferdReader.readLine() 호출 ) String FieldSet By LineTokenizer 1) DelimitedLineTokenizer ( 구분자 ) 2) FixedLengthTokenizer ( 고정길이 ) 3) PrefixMatchingCompositeLineTokenizer( 앞첨자 ) FieldSet Mapped Object By FieldSetMapper Flat File Write Mechanism Object List 형태의 Item 을받아와서 StringBuffer 에한라인씩 Add 한후 FileWriter 를통해 File 로변환 Mapped Object FieldSet By FieldExtractor FieldSet String By LineAggregater 1) Delimited, 2) FixedLength String FlatFile 1 Line By FlatFileItemWriter Page l 39
Flat File 처리 (3/4) FlatFileItemReader 4. Batch Processing Flat File 읽기설정 (Fixed Length 방식 ) FlatFileReader 를통해 txt 파일을한라인씩읽은후에 VO 의 field 값에 Mapping 할길이를지정하여 Tokenizing 하고 Tokenizing 된결과를 VO 에 Mapping 하는예제 <bean id="itemreader" class="org.springframework.batch.item.file.flatfileitemreader"> <property name="resource" value="data/iosample/input/fixedlength.txt" /> <property name="linemapper"> <bean class="org.springframework.batch.item.file.mapping.defaultlinemapper"> <property name="linetokenizer"> <bean class="org.springframework.batch.item.file.transform.fixedlengthtokenizer"> <property name="names" value="name,credit" /> <property name="columns" value="1-9,10-11" /> </property> <property name="fieldsetmapper"> <bean class="org.springframework.batch.item.file.mapping.beanwrapperfieldsetmapper"> <property name="targettype value="org.springframework.batch.sample.domain.trade.customercredit" /> </property> </property> Page l 40
Flat File 처리 (4/4) FlatFileItemWriter 4. Batch Processing Flat File 쓰기설정 (Fixed Length 방식 ) FieldExtractor 를통해 VO 의 field 값에서값을꺼내와서지정한 Format 으로변환하여한라인으로합친후에 File 에 Write 를수행하는예제 <bean id="itemwriter" class="org.springframework.batch.item.file.flatfileitemwriter"> <property name="resource" ref="outputresource" /> <property name="lineaggregator"> <bean class="org.springframework.batch.item.file.transform.formatterlineaggregator"> <property name="fieldextractor"> <bean class="org.springframework.batch.item.file.transform.beanwrapperfieldextractor"> <property name="names" value="name,credit" /> </property> <property name="format" value="%-9s%-2.0f" /> </property> <bean id="outputresource" class="org.springframework.core.io.filesystemresource"> <constructor-arg value="target/test-outputs/fixedlengthoutput.txt" /> Page l 41
XML File 처리 (1/3) 4. Batch Processing Xml File 처리방안 XML 처리과정에서토크나이징이필요한레코드의행 (FieldSet) 대신에 XML 자원을개별레코드에대응되는 Fragments 의콜렉션으로가정. Spring Batch 는 Fragment 를객체로바인드하는데 Object/XML Mapping(OXM) 을사용. 그렇지만 Spring Batch 는특정 XML 바인딩기술에종속되지않음. 대표적인사용방법은가장대중적인 OXM 기술에대한일관된추상화를제공하는 Spring OXM 에위임. Spring OXM 에대한의존성은선택이며, 필요시 Spring Batch 에서특정인터페이스를구현하도록선택가능.(JDK 6 에기본으로포함 ) Page l 42
XML File 처리 (2/3) 4. Batch Processing StaxEventItemReader XML레코드처리시설정항목 설정항목 설명 fragmentrootelementname 매핑되는객체를구성하는프레그먼트의루트엘리먼트이름. resource 읽어들일데이터의위치를지정 ( 파일이나 URL 등 ) unmarshaller XML 프레그먼트를객체로매핑하는 Spring OXM 에의해서제공되는언마샬링기능 StaxEventItemWriter XML 레코드처리시설정항목 resource marshaller 설정항목 작성할파일의위치 설명 객체를 XML 프레그먼트로매핑하는 Spring OXM 에의해서제공되는마샬링기능 roottagname 객체를 XML 에매핑할때사용하는루트태그이름. Page l 43
XML File 처리 (3/3) 4. Batch Processing XML Reader/Writer 설정 <bean id="itemreader" class="org.springframework.batch.item.xml.staxeventitemreader"> <property name="fragmentrootelementname" value="customer" /> <property name="resource" value="data/iosample/input/input.xml" /> <property name="unmarshaller" ref="customercreditmarshaller" /> XML파일을 Object로변환 <bean id="itemwriter" class="org.springframework.batch.item.xml.staxeventitemwriter"> <property name="resource" ref="outputresource" /> <property name="marshaller" ref="customercreditmarshaller" /> Object를 XML파일로변환 <property name="roottagname" value="customers" /> <property name="overwriteoutput" value="true" /> <bean id="customercreditmarshaller" class="org.springframework.oxm.xstream.xstreammarshaller"> <property name="aliases"> <util:map id="aliases"> <entry key="customer value="org.springframework.batch.sample.domain.trade.customercredit" /> <entry key="price" value="java.math.bigdecimal" /> <entry key="name" value="java.lang.string" /> </util:map> </property> Page l 44
Multi File 처리 4. Batch Processing Multi File 처리 N N: N 개의대상을읽은후읽은개수만큼결과물을만들어냄. 다수의파일 ( 동일유형의복수개의파일 ) 을대상으로동일유형의 Batch 처리시사용. 하나의 Reader 와 Writer 를지정하며 XML 과 Flat File 등다양한입력타입을제공 Reader 설정 MultiResourceItemReader 를통해 1 개이상의리소스를읽어온다음 Reader 에게데이터처리를위임함. input resource 경로에 * 를사용하여다수의파일을처리가능. <bean id="multiresourcereader class="org.springframework.batch.item.sortedmultiresourceitemreader"> <property name="resources" value="classpath:data/multiresourcejob/input/file-*.txt" /> <property name="delegate" ref="flatfileitemreader" /> Writer 설정 MultiResourceItemWriter 를통해출력파일의개수를지정한다음 Writer 에게데이터처리를위임. <bean id="itemwriter class="org.springframework.batch.item.file.multiresourceitemwriter scope="step"> <property name="resource" value="#{ jobparameters['output.file.path']}" /> <property name="itemcountlimitperresource" value="6" /> <property name="delegate" ref="delegatewriter" /> Page l 45
DB 처리 4. Batch Processing DB 처리 DB는 Batch 저장메커니즘의중심으로만일 SQL 문이백만행을반환하는경우결과집합은모든행을읽을때까지메모리에모든결과를보유함. Spring Batch는이문제를해결하기위해 Cursor와 Paging기반 Database ItemReader를제공. DB처리방식의유형 구분유형설명 처리건수축소 대상의범위축소 Cursor 기반 Paging 기반 Driving Query 1 라인씩읽어서처리 Page Size 만큼읽어서처리 1 단계 : 조회조건을통해 Primary Key 도출 2 단계 : Primary Key 를이용하여데이터처리 처리가능 DB 유형 구분 설명 JDBC ibatis Hibernate 가장기본적인데이터접근지원프레임워크 DriverManager 클래스, Connection, 다양한구문, ResultSet 클래스로구성 특징 : 일괄처리능력 ORM 도구로자바빈프로퍼티값을생성하는데필요한 SQL 코드직접작성. 각데이터베이스에서표준 SQL 을확장한기능을완벽히사용가능 - 객체 - 관계매핑도구로자바코드에최소한의영향을가하여 DB 에있는일반자바객체를찾고저장하고삭제가가능 Page l 46
기존서비스재사용 4. Batch Processing 배치업무의유형 구분업무유형배치구현방안 배치전용프로그램 설계초기부터대량 (Bulk) 데이터처리고려해서구현 ItemReader ItemWriter 온라인시스템, Thin Client Program 기존의 Service, Dao 를배치업무로사용 ItemReaderAdapter ItemWriterAdapter 구현방안 targetmethod 가 read() 메소드의형태와동일해야함. ItemReader 인터페이스를구현하고있는클래스가아니더라도메소드호출시하나씩읽어온 Object 를반환하고더읽을것이없으면 null 을반환하는 ItemReader 의동작방식만만족한다면사용가능. ItemReader 의경우 ItemReaderAdapter 를이용해서 targetobject 속성에서실행할클래스의 bean 선언을참조하고 tagetmethod 속성에서 ItemReader.read() 와같은역할을하는메소드를지정함. <bean id="itemreader" class="org.springframework.batch.item.adapter.itemreaderadapter"> <property name="targetobject" ref="fooservice" /> <property name="targetmethod" value="generatefoo" /> <bean id="fooservice" class="org.springframework.batch.item.sample.fooservice" /> <bean id="itemwriter class="org.springframework.batch.item.adapter.itemwriteradapter"> <property name="targetobject" ref="fooservice" /> <property name="targetmethod" value="processfoo" /> <bean id="fooservice" class="org.springframework.batch.item.sample.fooservice" /> Page l 47
Page l 48
Scaling and Parallel Processing (1/3) 5. Batch Support Multi-threaded Step 하나의 StepExecution 을여러개의 Thread 로처리하는형태 가장단순한병렬처리로 Step 구성요소중 <tasklet> 속성에 TaskExecutor 를추가하여구현 Multi-thread 처리를원하는 Step 의경우 tasklet 에비동기설정필요 <step id="loading"> <tasklet task-executor="taskexecutor">...</tasklet> </step> <bean id="taskexecutor" class="org.springframework.core.task.simpleasynctaskexecutor" /> Thread 의수는기본값으로 4 가설정되어있으나필요하다면증가시켜사용가능 <step id="loading"> <tasklet task-executor="taskexecutor" throttle-limit="20">... </tasklet> </step> Page l 49
Scaling and Parallel Processing (2/3) 5. Batch Support Parallel Step 병렬화가필요한부분에따라영역을나눈후각단계별로할당하여하나의프로세스에서병렬처리가능 각작업분할은최종종료상태로통합되기전에모두완료하도록구성해야함 분리된 flow들이모두완료되어야만다음 step으로진행가능 <job id="job1"> <split id="split1" task-executor="taskexecutor" next="step4"> <flow> <step id="step1" parent="s1" next="step2" /> <step id="step2" parent="s2" /> </flow> <flow> <step id="step3" parent="s3" /> </flow> </split> <step id="step4" parent="s4" /> </job> <beans:bean id="taskexecutor" class="org.spr...simpleasynctaskexecutor" /> Page l 50
Scaling and Parallel Processing (3/3) 5. Batch Support Partitioning Spring Batch 는 Step Partitioning 과 Remote execution 지원 설정항목 설명 Grid-Size - 실행할 Context 영역의개수를지정하는단위 (Thread Pool 개수지정 ) - Grid-Size 만큼의 Context 가생성되며, 각 Context 마다데이터가나뉘어져들어감 Page l 51
Listener 5. Batch Support Listener Batch 처리중이벤트발생시해당이벤트를 Intercepting 하여필요한 Logic 수행 사용예 Job 설정파일에서 <listener> 이용해등록 <job id="compositeitemwriterjob" xmlns="http://www.springframework.org/schema/batch" > <step id="compositeitemwriterstep1"> <tasklet> <chunk reader="fileitemreader" processor="processor" writer="compositewriter commit-interval="1"> <streams> <stream ref="fileitemreader"/> <stream ref="fileitemwriter1"/> <stream ref="fileitemwriter2"/> </streams> </chunk> </tasklet> <listeners> <listener ref="forsteptestlistener" /> </listeners> </step> <listeners> <listener ref="forjobtestlistener" /> </listeners> </job> <bean id="forsteptestlistener" class="org.springframework.batch.sample.forsteptestlistener" /> <bean id="forjobtestlistener" class="org.springframework.batch.sample.forjobtestlistener" /> Page l 52
Page l 53
실행환경배치처리레이어 (1/5) 6. egovframe Batch 제공기능 표준프레임워크배치실행환경은 3 개레이어 (Core, Support, Execution Layer) 로구성되며, 일괄 ( 배 치 ) 처리를위한기반환경을제공 Presentation Layer Job Configuration Step Configuration ItemReader/ ItemWriter 배치실행환경구성 Business Logic Layer Batch Layer Batch Core Batch Execution Batch Support Job Execution Step Execution Tasklet 표준프레임워크실행환경 Foundation Layer 전자정부표준프레임워크 Data Layer Job Repository Job Launcher Job Runner Integration Layer Skip/Repeat/ Retry History Management Pre/Post Processing Batch Layer Scalability Sync/Async Processing Parallel Processing 표준프레임워크 배치실행환경 구현 배치실행관리 다양한배치실행기능지원 병렬처리 주요내용 - 시작 (Run) - 재시도 (Retry) - 건너뛰기 (Skip) - 재시작 (Restart) 전처리 / 후처리관리 프로세스전 / 후단계에서이벤트처리 (Event Handling) 기능제공 배치처리시멀티스레드기반의병렬처리기능제공 Page l 54
실행환경배치처리레이어 (2/5) 6. egovframe Batch 제공기능 egovframe Batch Architecture 표준프레임워크배치실행환경은일괄처리기능구현에필요한사항을프레임워크영역에서제공함으로써개발자의변경부분을작업설정및비즈니스구현등으로최소화 Run Tier Job Tier Application Tier 분류 구성요소 제공기능 JobLauncher Job Runner Job 실행유형설정 Scheduler Http, Web Service Command- Line JobRunner egovjob Job 설정 egovstep Step 설정 ItemReader ItemProcessor ItemWriter Run Tier Job Tier Job Locator Job Configuration Job Launcher Job 기등록한 Job 검색기등록한 Job 설정 Job 실행모듈 Job 정보설정 JobRepository Job Repository Job 수행이력기록 [ 범례 ] 외부실행모듈표준프레임워크제공개발대상모듈 표준프레임워크실행환경 Presentation Layer Business Logic Layer Data Layer Foundation Layer 전자정부표준프레임워크 Integration Layer 처리흐름 참조 Batch Layer Application Tier Step Item Reader Item Processor Item Writer Step 정보설정 리소스형식에따라데이터읽기 비즈니스처리 리소스형식에따라데이터쓰기 Page l 55
실행환경배치처리레이어 (3/5) 6. egovframe Batch 제공기능 전자정부배치실행환경구성요소 분류기술요소제공기능 Batch Core Batch Execution Batch Support Job Configuration Step Configuration ItemReader/ItemWriter Job Execution Step Execution Tasklet Job Repository Job Runner Job Launcher History Management Scalability Sync/Async Processing Parallel Processing Pre/Post Processing Skip/Repeat/Retry Job 설정기능제공 Step 설정기능제공 File/DB 처리기능제공 Job Instance 의수행기능제공 Step Instance 의수행기능제공 Job 의실행중배치작업외단순처리가필요한작업 ( 파일이동등 ) 의처리기능을제공 JobExecution, StepExecution 정보를저장 Scheduler, CommandLine (CronTab), Http/Webservice 방식지원인터페이스제공 Job Repository 및실행방법설정기능제공 JobRepository 와이력관리기능제공 Partitioning 기능제공 JobLauncher 설정을통한동기 / 비동기처리기능제공 Job 설정을사용하여병렬처리기능제공 Listener 를사용한전처리 / 후처리 Event Handling 기능제공 건너뛰기, 반복, 재시도기능제공 Page l 56
실행환경배치처리레이어 (FlatFileItemReader) 6. egovframe Batch 제공기능 Flat File 처리 - egovframe Batch 제공 FlatFileItemReader 파일 ItemReader의요소중성능저하요인인 LineMapper 부분개선. FieldSet을사용하지않으므로 Tokens FieldSet으로변환하는과정이없음. 전자정부 Batch 실행환경에서제공하는 EgovDefaultLineMapper, EgovLineTokenizer, EgovObjectMapper를사용하는경우 Token 상태에서 Object로직접맵핑됨. 개선항목 EgovDefaultLineMapper EgovLineTokenizer EgovAbstractLineTokenizer EgovDelimitedLineTokenizer EgovObjectMapper 설명 EgovLineTokenizer 와 EgovObjectMapper 가변경됨에따라 LineMapper 총과정을제어하는 DefaultLineMapper 를변경하여 EgovDefaultLineMapper 제공 전자정부에서는 FieldSet 을사용하지않기때문에 FieldSet 을반환하는 LineTokenizer 인터페이스를변경하여 EgovLineTokenizer 제공 LineTokenizer 인터페이스가 EgovLineTokenizer 로변경됨에따라토크나이징만관여하는추상클래스 EgovAbstractLineTokenizer 제공 Spring 에서제공하는 DelimitedLineTokenizer 의성능을개선한 EgovDelimitedLineTokenizer 제공 전자정부에서는 FieldSet 을사용하지않고토크나이징된값들을직접 Object 에맵핑하는 EgovObjectMapper 를제공 Page l 57
실행환경배치처리레이어 (FlatFileItemWriter) 6. egovframe Batch 제공기능 Flat File 처리 - egovframe Batch 제공 FlatFileItemWriter - Spring Batch 의 FileItemWriter 개선사항 개선항목 BeanWrapperFieldExtractor 성능개선 FormatterLineAggregator 경량화 설명 item 에서 field 값을추출하는과정의성능을개선한 EgovFieldExtractor 제공 FormatterLineAggregator 를경량화하여고정길이방식의 EgovFixedLineAggregator 제공 Page l 58
DB 처리 - egovframe Batch 제공 DB ItemWriter 6. egovframe Batch 제공기능 DB 처리 - egovframe Batch 제공 DB ItemWriter Spring 에서제공하는 JdbcBatchItemWriter 는상용 Batch F/W 와비교하여대용량데이터처리속도차이발생 JdbcBatchItemWriter 에서는사용자가 PreparedStatement 를 setter 하기위한클래스를직접작성하지않으 며 XML 설정시쿼리의파라미터값을지정하여자동으로 PreparedStatement 를 setter 해주는기능제공 Spring Batch 설정 : sql 작성시필드명에 : 을붙여서작성 <bean id="empdbbatchwriter" class="org.springframework.batch.item.database.jdbcbatchitemwriter"> <property name="assertupdates" value="true" /> <property name="itemsqlparametersourceprovider"> <bean class= BeanPropertyItemSqlParameterSourceProvider" /> </property> <property name="sql" value="insert into UIP_EMPLOYEE (num, name, sex) values (:num, :name, :sex)" /> <property name="datasource" ref="datasource" /> 전자정부배치설정 : sql 작성시? 로설정하고필드명을 params 에작성 <bean id="egovjdbcbatchitemwriter3" class="org.springframework.batch.item.database.egovjdbcbatchitemwriter"> <property name="assertupdates" value="true" /> <property name="itempreparedstatementsetter"> <bean class=..egovmethodmapitempreparedstatementsetter" /> </property> <property name="sql value="insert into UIP_EMPLOYEE (num, name, sex) values (?,?,?)" /> <property name="params" value="num, name, sex"/> <property name="datasource" ref="datasource" /> Page l 59
Job Runner egovframe Batch 제공 6. egovframe Batch 제공기능 Batch Runner 유형 전자정부배치실행환경에서는작업실행유형에따라미리 JobRunner 를구현한표준 Batch Runner 를제공 유형 EgovBatchJobRunner Web, Java Application 등을이용하여범용적으로실행되는일괄처리작업에사용. EgovCommandLineRunner 외부프로그램 (Windows: / Unix/Linux: crontab 등 ) 이나명령프롬프트 (Windows: bat / Unix/Linux: Shell) 에서독립적으로실행되는 Batch 작업에사용. 설명 EgovSchedulerRunner 주기적으로실행되어야하는일괄처리작업에사용. 유형별 Batch Runner 제공기능 유형 Java Application 실행 Web 실행 Job 상태모니터링 Scheduling 기능 EgovBatchRunner, EgovSchedulerRunner 에서명령프롬프트연동을위해서는추가적인구현이필요 명령프롬프트연동지원 EgovBatchJobRunner X EgovCommandLineRunner X X EgovSchedulerRunner X Page l 60
Page l 61
Page l 62
실행환경배치처리레이어 7. 참고자료 - egovframe Batch 제공기능 Flat File 처리 (Delimited) - egovframe Batch 제공 FlatFileItemReader (1/3) 읽어들인문자열에서구분자를경계값으로사용하여필드를분리 <bean id="itemreader" class="org.springframework.batch.item.file.flatfileitemreader" scope="step"> <property name="resource" value="#{jobparameters[inputfile]}" /> <property name="linemapper"> <bean class="egovframework. rte.bat.core.item.file.mapping.egovdefaultlinemapper"> <property name="linetokenizer"> <bean class="egovframework.rte.bat.core.item.file.transform.egovdelimitedlinetokenizer"> <property name="delimiter" value=","/> </property> <property name="objectmapper"> <bean class="egovframework.rte.bat.core.item.file.mapping.egovobjectmapper"> <property name="type" value="egovframework.brte.sample.domain.trade.customercredit" /> <property name="names" value="name,credit" /> </property> </property> 설정항목내용예시 delimiter 필드의경계를구별해주는문자, ( 콤마 ) type VO 클래스 org.springframework.batch.customercredit names VO 클래스의필드 name,credit Page l 63
실행환경배치처리레이어 7. 참고자료 - egovframe Batch 제공기능 Flat File 처리 (FixedLength) - egovframe Batch 제공 FlatFileItemReader (2/3) 읽어들인문자열에서필드의경계를파일내의문자열길이로판단하여필드를분리 <bean id="itemreader" class="org.springframework.batch.item.file.flatfileitemreader" scope="step"> <property name="resource" value="#{jobparameters[inputfile]}" /> <property name="linemapper"> <bean class="egovframework.rte.bat.core.item.file.mapping.egovdefaultlinemapper"> <property name="linetokenizer"> <bean class="egovframework.rte.bat.core.item.file.transform.egovfixedlengthtokenizer"> <property name="column" value="1-9,10-11" /> </property> <property name="objectmapper"> <bean class="egovframework.rte.bat.core.item.file.mapping.egovobjectmapper"> <property name="type" value="egovframework.brte.sample.domain.trade.customercredit" /> <property name="names" value="name,credit" /> </property> </property> 설정항목내용예시 column 필드경계의범위 1-9,10-11 type VO 클래스 org.springframework.batch.customercredit names VO 클래스의필드 name,credit Page l 64
실행환경배치처리레이어 7. 참고자료 - egovframe Batch 제공기능 Flat File 처리 (ByteLength) - egovframe Batch 제공 FlatFileItemReader (3/3) EgovFixedByteLengthTokenizer 는 FixedLengthTokenizer 와유사하나, byte 문자열을기준으로필드의경계값 을구해필드를분리 <bean id="itemreader" class="org.springframework.batch.item.file.flatfileitemreader" scope="step"> <property name="resource" value="#{jobparameters[inputfile]}" /> <property name="linemapper"> <bean class="egovframework.brte.core.item.file.mapping.egovdefaultlinemapper"> <property name="linetokenizer"> <bean class="egovframework.brte.core.item.file.transform.egovfixedbytelengthtokenizer"> <property name="encoding" value="utf-8"/> <property name="columns" value="1-9,10-11" /> </property> <property name="objectmapper"> <bean class="egovframework.brte.core.item.file.file.mapping.egovobjectmapper"> <property name="type" value="egovframework.brte.sample.domain.trade.customercredit" /> <property name="names" value="name,credit" /> </property> </property> 설정항목내용예시 column 필드경계의길이 1-9,10-11 encoding byte 문자열인코딩타입 utf-8 type VO 클래스 org.springframework.batch.customercredit names VO 클래스의필드 name,credit Page l 65
실행환경배치처리레이어 7. 참고자료 - egovframe Batch 제공기능 Flat File 처리 ( FixedLength ) - egovframe Batch 제공 FlatFileItemWriter (1/2) <bean id="itemwriter" class="org.springframework.batch.item.file.flatfileitemwriter" scope="step"> <property name="resource" value="#{jobparameters[outputfile]}" /> <property name="lineaggregator"> <bean class="egovframework.brte.core.item.file.transform.egovfixedlengthlineaggregator"> <property name="fieldextractor"> <bean class="egovframework.brte.core.item.file.transform.egovfieldextractor"> <property name="names" value="name,credit" /> </property> <property name="fieldranges" value="9,2" /> </property> EgovFlatFileItemWriter 설정항목 (FixedLength) fieldranges names VO 클래스의필드를나타낸다. 설명 Item 의필드값들을 1 Line 의 String 으로만들때필드값의범위 ( 고정길이 ) 지정 Page l 66
실행환경배치처리레이어 7. 참고자료 - egovframe Batch 제공기능 Flat File 처리 (Delimited) - egovframe Batch 제공 FlatFileItemWriter (2/2) <bean id="itemwriter" class="org.springframework.batch.item.file.flatfileitemwriter" scope="step"> <property name="resource" value="#{jobparameters[outputfile]}" /> <property name="lineaggregator"> <bean class="org.springframework.batch.item.file.transform.delimitedlineaggregator"> <property name="fieldextractor"> <bean class="egovframework.brte.core.item.file.transform.egovfieldextractor"> <property name="names" value="name,credit" /> </property> <property name="delimiter" value=","/> </property> EgovFlatFileItemWriter 설정항목 (Delimited ) delimiter names VO 클래스의필드를나타낸다. 설명 Item 의필드값들을 1 Line 의 String 으로만들때경계가되는구분자지정 Page l 67
Appendix. Chunk Oriented Processing 7. 참고자료 -Batch Core Data를한번에하나씩읽고, 트랜잭션범위내에서 'Chunk' 를만든후한번에쓰는방식. 즉, 하나의 item이 ItemReader를통해읽히고, Chunk 단위로묶인 item들이한번에 ItemWriter로전달되어쓰이게됨. Commit-Interval 횟수만큼데이터를읽어서처리한후한번에 Write함 Page l 68
Appendix. Chunk Oriented Processing Restart 7. 참고자료 -Batch Core start-limit 각 Step 실행횟수를설정하는옵션으로 default 값은 Integer.MAX_VALUE 임. <step id="step1"> <tasklet start-limit="1"> <chunk reader="itemreader" writer="itemwriter" commit-interval="10" /> </tasklet> </step> allow-start-if-complete Job 의 Restart 시 COMPLETED 로완료된 Step 의실행여부를설정하는옵션. true 로설정시, COMPLETED 로완료한 Step 도다시실행되며, false 설정시, COMPLETED 로완료한 Step 은 skip 됨. 아래예제에서 step1 Step 은 10 번만실행가능하며 Job 을 Restart 했을시, 이전시도와관계없이재실행됨. <step id="step1"> <tasklet allow-start-if-complete="true"> <chunk reader="itemreader" writer="itemwriter" commit-interval="10" /> </tasklet> </step> Page l 69
Appendix. Chunk Oriented Processing - Retry 7. 참고자료 -Batch Core Retry Batch 작업수행중오류발생시지정한횟수만큼반복해서처리하는옵션 Batch 수행중 Exception 발생시 3 번만큼재시도하는예제 <job id="retrysample"> <step id="step1"> <tasklet> <chunk reader="itemgenerator" writer="itemwriter" commit-interval="1" retry-limit="3"> <retryable-exception-classes> java.lang.exception </retryable-exception-classes> </chunk> </tasklet> </step> </job> Page l 70
Appendix. Chunk Oriented Processing Skip 7. 참고자료 -Batch Core Skip Batch 작업수행중오류발생시해당오류를처리하지않고넘기는옵션 Batch 수행중 FlatFileParseException 이나 WriteFailedException 발생시 10 회의오류까지는넘기는예제 (Skip 하면서 ExitCode 를 COMPLETED WITH SKIPS 로변환하는로직이내부적으로포함 ) <job id="skipjob" incrementer="incrementer"> <step id="step1" parent="basestep"> <tasklet> <chunk reader="fileitemreader" processor="tradeprocessor" writer="tradewriter" commit-interval="3" skip-limit="10"> <skippable-exception-classes> org.springframework.batch.item.file.flatfileparseexception org.springframework.batch.item.writefailedexception </skippable-exception-classes> </chunk> </tasklet> <next on="*" to="step2" /> <next on="completed WITH SKIPS" to="errorprint1" /> <fail on="failed" exit-code="failed"/> </step>... </job> Page l 71
Appendix. ItemReader 와 ItemWriter (1/2) 7. 참고자료 -Batch Core ItemReader 의종류 Flat File, XML, Database 등의데이터타입을입력받을수있음 ItemReader AggregateItemReader FlatFileItemReader StaxEventItemReader JdbcCursorItemReader 설명 DelegatingItemReade 를확장한클래스. Read 메소드의결과로 java.util.collection 객체를반환함. 직접파일을 READ 하지않고대신 READ 할클래스를지정함 ( 주로 Parrlel 작업에사용됨 ) 플랫파일을읽어와서 read() 메소드에서 String 을반환함. Flat file 에서 item 을읽어들이며 ItemStream 을구현하고있음. StAX 를통해서 XML 파일에서 Item 을읽음 JDBC 를이용해서 DB 에서 Item 을읽어옴 HibernateCursorItemReader 하이버네이트의 HQL 을사용해서커서기반으로 Item 조회를함. IbatisPagingItemReader JmsItemReader JpaPagingItemReader JdbcPagingItemReader ibatis 를통해 Driving query 기반으로 Item 을읽어들임 read 메서드에서 javax.jms.message 객체를반환. Spring 의 JmsOperations 객체의 receive 메소드를통해서 Item 을조회함 JPQL 문에기반하여 row 를페이지단위로읽어큰데이터를읽을때메모리부족이생기지않음 SQL 문에기반하여 row 를페이지단위로읽어큰데이터를읽을때메모리부족이생기지않음 Page l 72
Appendix. ItemReader 와 ItemWriter (2/2) 7. 참고자료 -Batch Core ItemWriter 의종류 Flat File, XML, Database 등을지원함 ItemWriter AbstractItemStreamItemWriter CompositeItemWriter ItemWriterAdapter PropertyExtractingDelegatingIt emwriter FlatFileItemWriter HibernateItemWriter JdbcBatchItemWriter JpaItemWriter StaxEventWriterItemWriter 설명 ItemStream and ItemWriter interfaces 를결합하여만든 Abstract Class 가장기본적인 ItemWriter Interface Item 을 List 로담겨진여러개의 ItemWriter 에게전달하여처리한다 다른어플리케이션의클래스를 Spring Batch 에적용할수있도록하는 ItemWriter interface 이다. ItemWriter 인터페이스를구현하지않은기존의클래스를 ItemWriter 로쓰고자할때, 이 ItemWriter 의구현체를써서기존클래스에파라미터로넘겨질속성값들을지정하고실행할수있다 Item 을 String 으로변환해서 Flat File 에쓸수있게하는 ItemWriter Hibernate 를이용하여 DB 로 Item 을쓸수있게하는 ItemWriter Jdbc 를이용해 Batch Update 의형태로 DB 로 Item 을쓸수있게하는 ItemWriter JPA EntityManager 인식및핸들링할수있는 ItemWriter StAX 를이용해서 Item 을 XML 파일에쓰는 ItemWriter Page l 73
Appendix. DB 처리 Cursor 기반 (1/2) 7. 참고자료 -Batch Core Cursor 기반 Spring Batch에서 Cursor는 Cursor를초기화해서열어주는 ItemReader에기반하며 read가호출될때마다 Cursor를다음행으로이동시키고처리과정중에사용되는맵핑된객체를반환. 주의점 : ResultSet.HOLD_CURSORS_OVER_COMMIT 을지원하기위해서는 JDBC3.0 드라이버필요. 'FOO' 테이블은 ID, NAME, BAR 3 개의컬럼으로구성되어있으며 SQL 문을통해 ID 가 1 보다크고 7 보다작은행의 결과를조회 Cursor 는 ID 2 에서시작하며 read() 가호출될때마다 FOO 객체로매핑되고 Cursor 는다음행으로이동 Page l 74
Appendix. DB 처리 Cursor 기반 (2/2) 7. 참고자료 -Batch Core Cursor 기반 ItemReader 종류 JdbcCursorItemReader : Cursor 기반기술의 JDBC를구현한 ItemReader HibernateCursorItemReader : Hibernate 사용이슈원인인 cache나 dirty checking을제거한 ItemReader로 HQL문을선언하고 SessionFactory를전달하는방식으로동작함 Cursor 기반 ItemReader 설정 : JdbcCursorItemReader <bean id="itemreader" class="org.springframework.batch.item.database.jdbccursoritemreader"> <property name="datasource" ref="datasource"/> <property name="sql" value="select ID, NAME, CREDIT from CUSTOMER"/> <property name="rowmapper"> <bean class="org.springframework.batch.sample.domain.trade.internal.customercreditrowmapper"/> </property> 설정항목 datasource sql rowmapper 설명 DB connection을넣어올수있는 datasource를지정실행할쿼리 ResultSet에서객체를매핑하는클래스로 RowMapper 인터페이스를구현한클래스정의 Page l 75
Appendix. DB 처리 Paging 기반 (1/2) 7. 참고자료 -Batch Core Paging 기반처리 데이터베이스커서를사용하는대신여러번쿼리를실행할수있는데실행되는각쿼리는정해진크기인페이지만큼의결과를가져올수있음. 실행되는각쿼리는시작행번호를지정하고페이지에반환시키고자하는행의수를지정한후사용. Paging 기반 ItemReader1 - JdbcPagingItemReader 페이지를형성하는행을반환하는데사용하는 SQL 쿼리를제공할책임을지고있는 PagingQueryProvider 인터페이스필요 데이터베이스유형별로지원하는서로다른 PagingQueryProvider 를사용 <bean id="itemreader class="org.springframework.batch.item.database.jdbcpagingitemreader"> <property name="datasource" ref="datasource"/> <property name="queryprovider"> <bean class="org.spr...sqlpagingqueryproviderfactorybean"> <property name="selectclause" value="select id, name, credit"/> <property name="fromclause" value="from customer"/> <property name="whereclause" value="where status=:status"/> <property name="sortkey" value="id"/> </property> <property name="parametervalues"> <map><entry key="status" value="new"/></map> </property> <property name="pagesize" value="1000"/> <property name="rowmapper" ref="customermapper"/> Page l 76
Appendix. DB 처리 Paging 기반 (2/2) 7. 참고자료 -Batch Core Paging 기반 ItemReader2 - JpaPagingItemReader JPA 는하이버네이트 StatelessSession 과비슷한개념이없으므로 JPA 명세에서제공하는다른특징을사용 JpaPagingItemReader 에는 JPQL 문을선언하고 EntityManagerFactory 전달 <bean id="itemreader" class="org.spr...jpapagingitemreader"> <property name="entitymanagerfactory" ref="entitymanagerfactory" /> <property name="querystring" value="select c from CustomerCredit c" /> <property name="pagesize" value="1000" /> Paging 기반 ItemReader3 - IbatisPagingItemReader 페이지의 Row 를읽을수있는직접적인지원은하지않으나여러표준화된변수를이용하여쿼리추가가능 <bean id="itemreader" class="org.spr...ibatispagingitemreader"> <property name="sqlmapclient" ref="sqlmapclient" /> <property name="queryid" value="getpagedcustomercredits" /> <property name="pagesize" value="1000" /> <select id="getpagedcustomercredits resultmap="customercreditresult "> select id, name, credit from customer order by id asc LIMIT #_skiprows#, #_pagesize# </select> Page l 77
Appendix. DB 처리 Driving Query 기반 7. 참고자료 -Batch Core Driving Query 기반처리 많은애플리케이션벤더들은매우극단적인 pessimistic Lock 전략을가지고있음. ( 대표적인경우 IBM, DB2) Pessimistic Lock 전략 ( 조회시에도 Lock 을거는전략 ) 은또다른온라인애플리케이션에서도테이블의읽기가필요한경우문제원인이될수있음. 극단적으로양이많은데이터집합에대해서 Cursor 를여는건특정벤더에따라서이슈가될수있음. 동작메커니즘 1 단계 : 원하는조회조건으로 Primary Key 를우선조회 ( 단일키 : SingleColumnJdbcKeyCollector, 다수키 MultipleColumnJdbcKeyCollector) 2 단계 : 조회한 Primary Key 를파라미터로사용해서처리 (Processing) Page l 78
7. 참고자료 -Batch Core Spring Batch http://static.springsource.org/spring-batch/2.1.x/reference/html/index.html Page l 79