SlideShare a Scribd company logo
1 of 29
Download to read offline
Spring Batch와 
함께 하는 
TDD 
정상혁 , KSUG 
(www.ksug.org)
목차 
1. 왜 Batch와 TDD인가? 
2. Spring Batch는 무엇을 해 주는가? 
3. 어떻게 응용했는가?
1. 왜 Batch와 TDD인가? 
1.1 발표 동기 
1.2 TDD 
1.3 Batch 
1.4 Batch + TDD
4 
1.1 발표 동기 
급하게 준비 
사진 출처 : http://blog.naver.com/khg2120/104069215
5 
1.1 발표 동기 
그리고 통합 주제에 대한 동경
6 
1.2 TDD 
나는 왜 TDD를 하는가? 
 재미, 집중 
 디버깅 시간을 줄이려고 
사진 출처 : http://www.flickr.com/photos/titicat/2986232393/ 
참고 : 내가 생각하는 TDD 
http://benelog.egloos.com/2766714
7 
1.2 TDD 
웹개발 TDD는 늘 아쉬웠다 
 Java 이외의 언어 부분은 검증 비용이 크다 
 SQL, javascript 
 UI 테스트는 어렵다 
 Java입장에서 html, javascript는 그냥 문자열이다 
 실행코드와 검증코드의 거리가 멀어 지기 쉽다 
 플래쉬, 브라우저 호환성등까지 검증하려면... 
 많은 오류는 javascript 같이 검증하기 어려운 곳에서 발생한다.
8 
1.3 Batch 
Batch 모듈은 
 복잡도가 높은 코드(super method가 흔함) 
 결과 확인과 재현에 큰 비용 
 오류 복구에 큰 비용 
 테스트 환경 구성의 어려움 
 결국 부분적인 테스트가 더욱 중요
9 
1.3 Batch 
어떤 Batch의 테스트 경험 
사진 출처 : http://www.imageafter.com/
10 
1.4 Batch + TDD 
Batch를 TDD로 개발한다면? 
 전체 코드를 돌리기 전에 더 일찍 오류 발견 
 덜 기다린다! 
 Java 테스트 코드만으로도 더 많은 영역을 검증 
 Testable한 구조로 만들다 보면 
 알아보기 쉬워 지고 
 변경에 유연 해짐 
 다양한 조건의 데이터를 쉽게 검증
2. Spring Batch는 무엇을 해 주는가? 
2.1 문제 해결 주제 
2.2 개별 작업 영역 
2.3 작업 처리 인프라 
2.4 활용예
12 
2.1 문제 해결 주제 
Batch 개발에서 이런 목소리가 들린다면? 
 XML을 읽는데 힙메모리가 모자라요 
 DB에 있는 건들을 메모리에 다 올릴 수가 없어요 
 배치가 도는 동안 테이블에 락이 걸려요 
 배치 실행 이력을 관리하고 싶어요 
 실패한 처리는 중간부터 다시 돌리고 싶어요 
 운영 환경에 올리기 전에는 테스트할 수 없어요
13 
2.1 문제 해결 주제 
Spring Batch 제공 기능 
 대용량 처리에 적합한 구조 
 Jdbc cursor, Jdbc batchUpdate 
 Stax, Stream방식의 파일 처리 
 구조 추상화 
 이력 관리 
 이벤트 처리 
 구성요소의 역할이 구분되어 있어서 테스트 코드 짜리에 좋다!
14 
2.2 개별 작업 영역 
Pipe & Filters 
 Bulk data processing을 위한 구조 
 Chunk 단위로 운반하면서 흘려 보냄
15 
2.2 개별 작업 영역 
구성 요소 
 Job 
 Step 
 Tasklet 
 ItemReader (Extract) 
 ItemProcessor (Transform) 
 ItemWriter (Load)
16 
2.2 개별 작업 영역 
처리 흐름 
 ItemProcessor는 선택적
17 
2.2 개별 작업 영역 
대표적인 ItemReader, ItemWriter 
 DB, XML, FlatFile 
자원 reader writer 
DB JdbcCursorItemReader JdbcBatchItemWriter 
Flat file FlatFileItemReader FlatFileItemWriter 
Xml file StaxEventItemReader StaxEventItemWriter
18 
2.2 개별 작업 영역 
대표적인 ItemReader, ItemWriter 
 DB, XML, FlatFile 
자원 종류 read/writer 자원 위치 
지정 
Raw data <-> Object 
DB 
JdbcCursorItemRead 
er 
datasource sql rowMapper 
JdbcBatchItemWriter datasource sql itemSqlSourceProvider 
flat file 
FlatFileItemReader resource  lineMapper 
FlatFileItemWriter resource  lineAggregator 
XML 
StaxEventItemReader resource 
fragmentRootElement- 
Name 
unmarshaller 
StaxEventItemWriter resource rootTagName marshaller
19 
2.3 작업 처리 인프라 
JobRepository, JobLauncher
20 
2.3 작업 처리 인프라 
JobRepository 테이블스키마
21 
2.4 활용예 
설정의 예 
<job id="ioSampleJob" 
job-repository="jobRepository > 
<step id="step1"> 
<tasklet> 
<chunk reader="gasStationDbReader" 
processor="gasStationNameFilter“ 
writer="gasStationXmlWriter“ 
commit-interval="10"/> 
</tasklet> 
</step> 
</job>
22 
2.4 활용예 
Demo
23 
3. 어떻게 응용했는가? 
3.1 JavaConfig 
3.2 실행 이력 
3.3 Spring Batch 구조 활용
24 
3.1 JavaConfig 
Xml설정의 단점 보안 
 @Configuration, @Bean 활용 
 Compile Validation 범위 증가 
 TDD와 궁합이 잘 맞았다 
 XML과의 관계를 잘 드러내기 위해서는 
 Component-scan은 좁은 범위로 
 Spring IDE의 support 
 Convention 
 BaseBallDbComponentFactory
25 
3.1 JavaConfig 
더 잘 읽히게 만들기 위해서는 
 XML과의 관계를 잘 드러내는 관례를 정하자 
 Component-scan은 좁은 범위로 
 Spring IDE의 support 
 이름과 package를 일관성 있게 
 BaseBallDbComponentFactory
26 
3.2 실행 이력 
운영에 도움이 됨 
 작업 진행상황을 보고 운영환경의 문제 파악을 더 빨리한 경험 
 건수로 데이터 변경 추이 파악 
 Log파일보다 일괄적인 view
27 
3.2 실행 이력 
Job의 성격에 따라 필요한지 고민 
 많은 Job이 사용하거나, Commit interval이 짧으면 병목 가능성 
 JobRepository를 정기적으로 삭제하는 배치를 돌리기도함 
 자주, 짧게 도는 Job에는 큰 이득이 없음 
 MapJobRepository 활용 
 테스트,단독 프로세스 
 Option이 생겼으면 
 실패한 건만 기록 
 Asynchronous JobRepository 
 https://jira.springsource.org/browse/BATCH-1524
28 
3.3 Spring Batch 구조 활용 
프레임웍만 쓴다고 다 응용되는 건 아니다. 
 처음 하는 사람은 Tasklet으로 많이 만듬 
 되도록 reader-writer 구조를 응용하는 것이 바람직 
 이력관리와 테스트 용이성 
 어떤 사람에게 배치는 1000라인짜리 메소드하나, 어떤 사람 
에게는 배치는 Job,Step,Reader, Writer 
 Transaction 처리를 혼동하는 사람이 많았다. 
 @Transactional을 습관적으로 넣음 
 특별한 경우가 아니면 Transaction은 Spring Batch에 맡기는 
것이 바람직
29 
정리 
Batch 개발의 피드백 속도 높이기 
 TDD 
 전체 실행 전에, 운영환경 전에 디버깅 
 적절한 모듈화가 되어야 가능 
 Spring Batch 기능 
 TDD에 용이한 구조 
 JavaConfig 를 접목시켜서 접목시켜서 Compile time 
validation을 높인 설정 가능 
 이력 확인 
 실행 환경의 상태를 더욱 빨리 파악

More Related Content

What's hot

[오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core [오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core Ji-Woong Choi
 
세미나 Spring mybatis
세미나 Spring mybatis세미나 Spring mybatis
세미나 Spring mybatisSomang Jeong
 
Springcamp spring boot intro
Springcamp spring boot introSpringcamp spring boot intro
Springcamp spring boot introJae-il Lee
 
스프링 부트와 로깅
스프링 부트와 로깅스프링 부트와 로깅
스프링 부트와 로깅Keesun Baik
 
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)DK Lee
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Testbeom kyun choi
 
spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례Daehwan Lee
 
자바 메모리 릭 패턴
자바 메모리 릭 패턴자바 메모리 릭 패턴
자바 메모리 릭 패턴효원 강
 
소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙Hong Hyo Sang
 
03.실행환경 실습교재(배치처리)
03.실행환경 실습교재(배치처리)03.실행환경 실습교재(배치처리)
03.실행환경 실습교재(배치처리)Hankyo
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Woonduk-Kang
 
overview of spring4
overview of spring4overview of spring4
overview of spring4Arawn Park
 
자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)Chang-Hwan Han
 
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)EunChul Shin
 
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례Jemin Huh
 
메이븐 기본 이해
메이븐 기본 이해메이븐 기본 이해
메이븐 기본 이해중선 곽
 
백기선의 스프링 부트
백기선의 스프링 부트백기선의 스프링 부트
백기선의 스프링 부트Keesun Baik
 

What's hot (20)

[오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core [오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core
 
세미나 Spring mybatis
세미나 Spring mybatis세미나 Spring mybatis
세미나 Spring mybatis
 
Springcamp spring boot intro
Springcamp spring boot introSpringcamp spring boot intro
Springcamp spring boot intro
 
스프링 부트와 로깅
스프링 부트와 로깅스프링 부트와 로깅
스프링 부트와 로깅
 
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
 
spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례
 
자바 메모리 릭 패턴
자바 메모리 릭 패턴자바 메모리 릭 패턴
자바 메모리 릭 패턴
 
소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙
 
Java 기초
Java 기초Java 기초
Java 기초
 
03.실행환경 실습교재(배치처리)
03.실행환경 실습교재(배치처리)03.실행환경 실습교재(배치처리)
03.실행환경 실습교재(배치처리)
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015
 
HTTP web server 구현
HTTP web server 구현HTTP web server 구현
HTTP web server 구현
 
overview of spring4
overview of spring4overview of spring4
overview of spring4
 
자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)
 
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
 
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
 
메이븐 기본 이해
메이븐 기본 이해메이븐 기본 이해
메이븐 기본 이해
 
Jpa more
Jpa moreJpa more
Jpa more
 
백기선의 스프링 부트
백기선의 스프링 부트백기선의 스프링 부트
백기선의 스프링 부트
 

Similar to Spring batch와 함께 하는 TDD

Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드cranbe95
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Javajigi Jaesung
 
Spark performance tuning
Spark performance tuningSpark performance tuning
Spark performance tuninghaiteam
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기YoungSu Son
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계Leonardo YongUk Kim
 
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료beom kyun choi
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드KwangSeob Jeong
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용중선 곽
 
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4Seok-joon Yun
 
레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화Jaehoon Choi
 
스타트업사례로 본 로그 데이터분석 : Tajo on AWS
스타트업사례로 본 로그 데이터분석 : Tajo on AWS스타트업사례로 본 로그 데이터분석 : Tajo on AWS
스타트업사례로 본 로그 데이터분석 : Tajo on AWSGruter
 
버클리Db 를 이용한 게임 서버 제작
버클리Db 를 이용한 게임 서버 제작버클리Db 를 이용한 게임 서버 제작
버클리Db 를 이용한 게임 서버 제작Vong Sik Kong
 
Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Gruter
 
All about JDBC Performance Tuning_Wh apm
All about JDBC Performance Tuning_Wh apmAll about JDBC Performance Tuning_Wh apm
All about JDBC Performance Tuning_Wh apm엑셈
 
[PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System [PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System Kwangseob Kim
 
[PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System [PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System Kwangseob Kim
 
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWSMatthew (정재화)
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피ssuser776e2d
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQLI Goo Lee
 

Similar to Spring batch와 함께 하는 TDD (20)

Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
Spark performance tuning
Spark performance tuningSpark performance tuning
Spark performance tuning
 
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
클라우드 & 모바일 환경에서 알아야 할 성능 품질 이야기
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
 
Java JPA
Java JPAJava JPA
Java JPA
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
[2015 07-06-윤석준] Oracle 성능 최적화 및 품질 고도화 4
 
레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화레가시 프로젝트의 빌드 자동화
레가시 프로젝트의 빌드 자동화
 
스타트업사례로 본 로그 데이터분석 : Tajo on AWS
스타트업사례로 본 로그 데이터분석 : Tajo on AWS스타트업사례로 본 로그 데이터분석 : Tajo on AWS
스타트업사례로 본 로그 데이터분석 : Tajo on AWS
 
버클리Db 를 이용한 게임 서버 제작
버클리Db 를 이용한 게임 서버 제작버클리Db 를 이용한 게임 서버 제작
버클리Db 를 이용한 게임 서버 제작
 
Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014Elastic Search Performance Optimization - Deview 2014
Elastic Search Performance Optimization - Deview 2014
 
All about JDBC Performance Tuning_Wh apm
All about JDBC Performance Tuning_Wh apmAll about JDBC Performance Tuning_Wh apm
All about JDBC Performance Tuning_Wh apm
 
[PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System [PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System
 
[PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System [PYCON Korea 2018] Python Application Server for Recommender System
[PYCON Korea 2018] Python Application Server for Recommender System
 
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
스타트업 사례로 본 로그 데이터 분석 : Tajo on AWS
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQL
 

Spring batch와 함께 하는 TDD

  • 1. Spring Batch와 함께 하는 TDD 정상혁 , KSUG (www.ksug.org)
  • 2. 목차 1. 왜 Batch와 TDD인가? 2. Spring Batch는 무엇을 해 주는가? 3. 어떻게 응용했는가?
  • 3. 1. 왜 Batch와 TDD인가? 1.1 발표 동기 1.2 TDD 1.3 Batch 1.4 Batch + TDD
  • 4. 4 1.1 발표 동기 급하게 준비 사진 출처 : http://blog.naver.com/khg2120/104069215
  • 5. 5 1.1 발표 동기 그리고 통합 주제에 대한 동경
  • 6. 6 1.2 TDD 나는 왜 TDD를 하는가?  재미, 집중  디버깅 시간을 줄이려고 사진 출처 : http://www.flickr.com/photos/titicat/2986232393/ 참고 : 내가 생각하는 TDD http://benelog.egloos.com/2766714
  • 7. 7 1.2 TDD 웹개발 TDD는 늘 아쉬웠다  Java 이외의 언어 부분은 검증 비용이 크다  SQL, javascript  UI 테스트는 어렵다  Java입장에서 html, javascript는 그냥 문자열이다  실행코드와 검증코드의 거리가 멀어 지기 쉽다  플래쉬, 브라우저 호환성등까지 검증하려면...  많은 오류는 javascript 같이 검증하기 어려운 곳에서 발생한다.
  • 8. 8 1.3 Batch Batch 모듈은  복잡도가 높은 코드(super method가 흔함)  결과 확인과 재현에 큰 비용  오류 복구에 큰 비용  테스트 환경 구성의 어려움  결국 부분적인 테스트가 더욱 중요
  • 9. 9 1.3 Batch 어떤 Batch의 테스트 경험 사진 출처 : http://www.imageafter.com/
  • 10. 10 1.4 Batch + TDD Batch를 TDD로 개발한다면?  전체 코드를 돌리기 전에 더 일찍 오류 발견  덜 기다린다!  Java 테스트 코드만으로도 더 많은 영역을 검증  Testable한 구조로 만들다 보면  알아보기 쉬워 지고  변경에 유연 해짐  다양한 조건의 데이터를 쉽게 검증
  • 11. 2. Spring Batch는 무엇을 해 주는가? 2.1 문제 해결 주제 2.2 개별 작업 영역 2.3 작업 처리 인프라 2.4 활용예
  • 12. 12 2.1 문제 해결 주제 Batch 개발에서 이런 목소리가 들린다면?  XML을 읽는데 힙메모리가 모자라요  DB에 있는 건들을 메모리에 다 올릴 수가 없어요  배치가 도는 동안 테이블에 락이 걸려요  배치 실행 이력을 관리하고 싶어요  실패한 처리는 중간부터 다시 돌리고 싶어요  운영 환경에 올리기 전에는 테스트할 수 없어요
  • 13. 13 2.1 문제 해결 주제 Spring Batch 제공 기능  대용량 처리에 적합한 구조  Jdbc cursor, Jdbc batchUpdate  Stax, Stream방식의 파일 처리  구조 추상화  이력 관리  이벤트 처리  구성요소의 역할이 구분되어 있어서 테스트 코드 짜리에 좋다!
  • 14. 14 2.2 개별 작업 영역 Pipe & Filters  Bulk data processing을 위한 구조  Chunk 단위로 운반하면서 흘려 보냄
  • 15. 15 2.2 개별 작업 영역 구성 요소  Job  Step  Tasklet  ItemReader (Extract)  ItemProcessor (Transform)  ItemWriter (Load)
  • 16. 16 2.2 개별 작업 영역 처리 흐름  ItemProcessor는 선택적
  • 17. 17 2.2 개별 작업 영역 대표적인 ItemReader, ItemWriter  DB, XML, FlatFile 자원 reader writer DB JdbcCursorItemReader JdbcBatchItemWriter Flat file FlatFileItemReader FlatFileItemWriter Xml file StaxEventItemReader StaxEventItemWriter
  • 18. 18 2.2 개별 작업 영역 대표적인 ItemReader, ItemWriter  DB, XML, FlatFile 자원 종류 read/writer 자원 위치 지정 Raw data <-> Object DB JdbcCursorItemRead er datasource sql rowMapper JdbcBatchItemWriter datasource sql itemSqlSourceProvider flat file FlatFileItemReader resource  lineMapper FlatFileItemWriter resource  lineAggregator XML StaxEventItemReader resource fragmentRootElement- Name unmarshaller StaxEventItemWriter resource rootTagName marshaller
  • 19. 19 2.3 작업 처리 인프라 JobRepository, JobLauncher
  • 20. 20 2.3 작업 처리 인프라 JobRepository 테이블스키마
  • 21. 21 2.4 활용예 설정의 예 <job id="ioSampleJob" job-repository="jobRepository > <step id="step1"> <tasklet> <chunk reader="gasStationDbReader" processor="gasStationNameFilter“ writer="gasStationXmlWriter“ commit-interval="10"/> </tasklet> </step> </job>
  • 23. 23 3. 어떻게 응용했는가? 3.1 JavaConfig 3.2 실행 이력 3.3 Spring Batch 구조 활용
  • 24. 24 3.1 JavaConfig Xml설정의 단점 보안  @Configuration, @Bean 활용  Compile Validation 범위 증가  TDD와 궁합이 잘 맞았다  XML과의 관계를 잘 드러내기 위해서는  Component-scan은 좁은 범위로  Spring IDE의 support  Convention  BaseBallDbComponentFactory
  • 25. 25 3.1 JavaConfig 더 잘 읽히게 만들기 위해서는  XML과의 관계를 잘 드러내는 관례를 정하자  Component-scan은 좁은 범위로  Spring IDE의 support  이름과 package를 일관성 있게  BaseBallDbComponentFactory
  • 26. 26 3.2 실행 이력 운영에 도움이 됨  작업 진행상황을 보고 운영환경의 문제 파악을 더 빨리한 경험  건수로 데이터 변경 추이 파악  Log파일보다 일괄적인 view
  • 27. 27 3.2 실행 이력 Job의 성격에 따라 필요한지 고민  많은 Job이 사용하거나, Commit interval이 짧으면 병목 가능성  JobRepository를 정기적으로 삭제하는 배치를 돌리기도함  자주, 짧게 도는 Job에는 큰 이득이 없음  MapJobRepository 활용  테스트,단독 프로세스  Option이 생겼으면  실패한 건만 기록  Asynchronous JobRepository  https://jira.springsource.org/browse/BATCH-1524
  • 28. 28 3.3 Spring Batch 구조 활용 프레임웍만 쓴다고 다 응용되는 건 아니다.  처음 하는 사람은 Tasklet으로 많이 만듬  되도록 reader-writer 구조를 응용하는 것이 바람직  이력관리와 테스트 용이성  어떤 사람에게 배치는 1000라인짜리 메소드하나, 어떤 사람 에게는 배치는 Job,Step,Reader, Writer  Transaction 처리를 혼동하는 사람이 많았다.  @Transactional을 습관적으로 넣음  특별한 경우가 아니면 Transaction은 Spring Batch에 맡기는 것이 바람직
  • 29. 29 정리 Batch 개발의 피드백 속도 높이기  TDD  전체 실행 전에, 운영환경 전에 디버깅  적절한 모듈화가 되어야 가능  Spring Batch 기능  TDD에 용이한 구조  JavaConfig 를 접목시켜서 접목시켜서 Compile time validation을 높인 설정 가능  이력 확인  실행 환경의 상태를 더욱 빨리 파악