1
1
<a name =" Spring_Batch " ></a >
2
2
# Spring Batch
3
3
4
- 마이바티스 스프링 연동모듈의 1.1.0버전에서는 스프링 배치 애플리케이션을 만들기 위해 세개의 빈을 제공한다.
5
- 세개의 빈은 ` MyBatisPagingItemReader ` 와 ` MyBatisCursorItemReader ` 와 <code >MyBatisBatchItemWriter</code >이다.
4
+ 마이바티스 스프링 연동 모듈의 1.1.0버전에서는 스프링 배치 애플리케이션을 만들기 위해 세 개의 빈을 제공한다.
5
+ 세 개의 빈은 ` MyBatisPagingItemReader ` 와 ` MyBatisCursorItemReader ` 와 <code >MyBatisBatchItemWriter</code >이다.
6
6
7
7
또한 2.0.0 버전에서는 Java Configuration 을 지원하는 다음의 세 가지 Builder class 를 제공한다.
8
8
` MyBatisPagingItemReaderBuilder ` , ` MyBatisCursorItemReaderBuilder ` 그리고 ` MyBatisBatchItemWriterBuilder ` 이다.
9
9
10
10
<span class =" label important " >중요</span >
11
11
이 문서는 [ 스프링 배치] ( http://static.springsource.org/spring-batch/ ) 에 대한 것으로 마이바티스 배치 ` SqlSession ` 을 다루지는 않는다.
12
- 배치 세션에 대해서는 [ SqlSession 사용] ( sqlsession.html ) 에서 좀더 다루었다.
12
+ 배치 세션에 대해서는 [ SqlSession 사용] ( sqlsession.html ) 에서 좀 더 다루었다.
13
13
14
14
# MyBatisPagingItemReader
15
15
16
16
이 빈은 마이바티스로 페이지를 처리하는 형태로 데이터베이스 데이터를 읽어오는 ` ItemReader ` 이다.
17
17
18
18
요청된 데이터를 가져오기 위해 ` setQueryId ` 프로퍼티에 명시된 쿼리를 실행한다.
19
19
쿼리는 ` setPageSize ` 프로퍼티에 명시된 크기만큼 데이터를 가져오도록 실행된다.
20
- ` read() ` 메서드를 사용하면 필요할 때 현재 위치에서 정해진 수 만큼 더 추가 데이터를 가져온다.
21
- reader는 몇가지의 표준적인 쿼리 파라미터를 제공하고 명명된 쿼리의 SQL은 요청된 크기만큼의 데이터를 만들기 위해 파라미터의 일부 혹은 모두 사용한다.
22
- 여기서 사용가능한 파라미터이다.
20
+ ` read() ` 메서드를 사용하면 필요할 때 현재 위치에서 정해진 수만큼 더 추가 데이터를 가져온다.
21
+ reader는 몇 가지의 표준적인 쿼리 파라미터를 제공하고 명명된 쿼리의 SQL은 요청된 크기만큼의 데이터를 만들기 위해 파라미터의 일부 혹은 모두 사용한다.
22
+ 여기서 사용 가능한 파라미터이다.
23
23
24
24
* ` _page ` : 읽을 페이지 수(0부터 시작)
25
25
* ` _pagesize ` : 페이지의 크기, 이를테면 리턴하는 로우 수
26
26
* ` _skiprows ` : ` _page ` 와 ` _pagesize ` 를 곱한 결과
27
27
28
- 각각의 파라미터는 selet구문에서 다음처럼 매핑될 수 있다.
28
+ 각각의 파라미터는 selet구문에서 다음처럼 매핑 될 수 있다.
29
29
30
30
``` xml
31
31
<select id =" getEmployee" resultMap =" employeeBatchResult" >
@@ -55,7 +55,7 @@ public class BatchAppConfig {
55
55
}
56
56
```
57
57
58
- ** 좀더 복잡한 예제를 보자.**
58
+ ** 좀 더 복잡한 예제를 보자.**
59
59
60
60
``` xml
61
61
<bean id =" dateBasedCriteriaReader"
@@ -107,14 +107,14 @@ public class BatchAppConfig {
107
107
}
108
108
```
109
109
110
- 앞의 예제와는 몇가지 차이점이 있다.
110
+ 앞의 예제와는 몇 가지 차이점이 있다.
111
111
112
- * ` sqlSessionFactory ` : reader에 별도로 구현한 sessionFactory를 지정할 수 있다. 이 옵션은 다양한 데이터베이스에서 데이터를 읽을때 유용하다.
113
- * ` queryId ` : 여러개의 테이블에서 데이터를 읽어야 하고 서로 다른 쿼리를 사용한다면 서로다른 네임스페이스를 가진 매퍼 파일을 사용하는게 좋을수 있다. 쿼리를 알아볼때, 매퍼 파일의 네임스페이스를 잊지 말아야 한다.
112
+ * ` sqlSessionFactory ` : reader에 별도로 구현한 sessionFactory를 지정할 수 있다. 이 옵션은 다양한 데이터베이스에서 데이터를 읽을 때 유용하다.
113
+ * ` queryId ` : 여러 개의 테이블에서 데이터를 읽어야 하고 서로 다른 쿼리를 사용한다면 서로 다른 네임스페이스를 가진 매퍼 파일을 사용하는 게 좋을 수 있다. 쿼리를 알아볼때, 매퍼 파일의 네임스페이스를 잊지 말아야 한다.
114
114
* ` parameterValues ` : 이 맵을 사용해서 추가로 파라미터를 전달할 수 있다. 위 예제는 ` jobExecutionContext ` 에서 값들을 가져오는 SpEL표현식을 사용하는 맵을 사용하고 있다.
115
- 맵의 키는 매퍼파일에서 마이바티스가 사용할 것이다. (예: * yesterday* 는 ` #{yesterday,jdbcType=TIMESTAMP} ` 로 사용될수 있다.).
116
- 맵과 reader 모두 ` jobExecutionContext ` 에서 SpEL표현식을 사용하기 위해 ` step ` 스코프를 사용한다. 마이바티스의 타입핸들러가 제대로 설정이 되었다면 JodaTime날짜를 맵을 사용해서 파라미터로 넘길수 있다.
117
- * ` pageSize ` : 배치가 청크크기가 지정된 형태로 처리가 되면 reader에 이 값을 전달하는게 적절하다.
115
+ 맵의 키는 매퍼파일에서 마이바티스가 사용할 것이다. (예: * yesterday* 는 ` #{yesterday,jdbcType=TIMESTAMP} ` 로 사용될 수 있다.).
116
+ 맵과 reader 모두 ` jobExecutionContext ` 에서 SpEL표현식을 사용하기 위해 ` step ` 스코프를 사용한다. 마이바티스의 타입핸들러가 제대로 설정이 되었다면 JodaTime날짜를 맵을 사용해서 파라미터로 넘길 수 있다.
117
+ * ` pageSize ` : 배치가 청크 크기가 지정된 형태로 처리가 되면 reader에 이 값을 전달하는게 적절하다.
118
118
119
119
## MyBatisCursorItemReader
120
120
@@ -159,11 +159,11 @@ public class BatchAppConfig {
159
159
160
160
# MyBatisBatchItemWriter
161
161
162
- 모든 아이템을 배치로 구문을 일괄실행하기 위해 ` SqlSessionTemplate ` 에서 배치로 작업을 처리하는 ` ItemWriter ` 이다. ` SqlSessionFactory ` 는 ` BATCH ` 실행자로 설정할 필요가 있다.
162
+ 모든 아이템을 배치로 구문을 일괄 실행하기 위해 ` SqlSessionTemplate ` 에서 배치로 작업을 처리하는 ` ItemWriter ` 이다. ` SqlSessionFactory ` 는 ` BATCH ` 실행자로 설정할 필요가 있다.
163
163
164
- 사용자는 ` write() ` 메서드가 호출될때 실행될 매핑구문 아이디를 제공해야 한다. ` write() ` 메서드는 트랜잭션내에서 호출되는 것으로 예상된다.
164
+ 사용자는 ` write() ` 메서드가 호출될 때 실행될 매핑구문 아이디를 제공해야 한다. ` write() ` 메서드는 트랜잭션 내에서 호출되는 것으로 예상된다.
165
165
166
- 다음의 코드는 샘플설정이다 .
166
+ 다음의 코드는 샘플 설정이다 .
167
167
168
168
``` xml
169
169
<bean id =" writer" class =" org.mybatis.spring.batch.MyBatisBatchItemWriter" >
@@ -246,16 +246,16 @@ public class BatchAppConfig {
246
246
</bean >
247
247
```
248
248
249
- ** 여러개의 테이블에 데이터를 쓰려면 한꺼번에 처리할 수 있도록 만든 writer(몇가지 규칙을 가지고)를 사용하자.**
249
+ ** 여러 개의 테이블에 데이터를 쓰려면 한꺼번에 처리할 수 있도록 만든 writer(몇 가지 규칙을 가지고)를 사용하자.**
250
250
251
251
이 기능은 마이바티스 3.2이상에서만 사용할 수 있다. 이전의 버전에서는 예상과 다르게 동작하는데 그 내용은 [ 이슈] ( http://code.google.com/p/mybatis/issues/detail?id=741 ) 를 참고하면 된다.
252
252
253
- 배치가 관계를 가지는 데이터나 여러개의 데이터베이스를 다루는 것처럼 복잡한 데이터를 작성할때 필요하다면 insert구문이 한개에 테이블에만 데이터를 넣을수 있다는 사실만 피하면 가능하기도 하다.
253
+ 배치가 관계를 가지는 데이터나 여러 개의 데이터베이스를 다루는 것처럼 복잡한 데이터를 작성할 때 필요하다면 insert구문이 한 개에 테이블에만 데이터를 넣을 수 있다는 사실만 피하면 가능하기도 하다.
254
254
이런 복잡한 데이터를 처리하기 위해 writer가 작성하는 <em >아이템(Item)</em >을 준비해야 한다. 다음의 기술을 사용하면 단순한 관계를 가진 데이터나 관계가 없는 테이블을 처리하는 아이템에서 사용할 수 있다.
255
255
256
- 이러한 방법으로 스프링 배치 아이템은 모든 레코드를 * 다룰것이다 * .
257
- 여기에는 1:1 * 관계* 를 가지는 * InteractionMetadata* , 관계가 없는 두개의 로우는 * VisitorInteraction* 와 * CustomerInteraction* 이 있다.
258
- 이 각각의 객체는 다음과 같이 볼수 있다.
256
+ 이러한 방법으로 스프링 배치 아이템은 모든 레코드를 * 다룰 것이다 * .
257
+ 여기에는 1:1 * 관계* 를 가지는 * InteractionMetadata* , 관계가 없는 두 개의 로우는 * VisitorInteraction* 와 * CustomerInteraction* 이 있다.
258
+ 이 각각의 객체는 다음과 같이 볼 수 있다.
259
259
260
260
``` java
261
261
public class InteractionRecordToWriteInMultipleTables {
@@ -271,7 +271,7 @@ public class Interaction {
271
271
}
272
272
```
273
273
274
- 그리고 스프링 설정에는 각각의 레코드를 처리하기위해 특별히 설정된 전용(delegates) writer를 사용하는 ` CompositeItemWriter ` 가 있다.
274
+ 그리고 스프링 설정에는 각각의 레코드를 처리하기 위해 특별히 설정된 전용(delegates) writer를 사용하는 ` CompositeItemWriter ` 가 있다.
275
275
276
276
``` xml
277
277
<bean id =" interactionsItemWriter" class =" org.springframework.batch.item.support.CompositeItemWriter" >
@@ -304,7 +304,7 @@ public class BatchAppConfig {
304
304
}
305
305
```
306
306
307
- 각각의 전용(delegate) writer는 필요할 만큼 설정할 수 있다. 예를들면 * Interaction* 과 * InteractionMetadata* 를 위한 writer가 있다.
307
+ 각각의 전용(delegate) writer는 필요할 만큼 설정할 수 있다. 예를 들면 * Interaction* 과 * InteractionMetadata* 를 위한 writer가 있다.
308
308
309
309
``` xml
310
310
<bean id =" interactionMetadataWriter"
@@ -319,7 +319,7 @@ public class BatchAppConfig {
319
319
p : statementId =" com.my.name.space.batch.InteractionRecordToWriteInMultipleTablesMapper.insertInteraction" />
320
320
```
321
321
322
- reader와 동일하게 ` statementId ` 는 네임스페이스를 가진 구문을 가리킬수 있다.
322
+ reader와 동일하게 ` statementId ` 는 네임스페이스를 가진 구문을 가리킬 수 있다.
323
323
324
324
매퍼 파일에서 구문은 다음과 같은 방법으로 각각의 레코드를 위해 만들어져있다.
325
325
@@ -345,9 +345,9 @@ reader와 동일하게 `statementId`는 네임스페이스를 가진 구문을
345
345
</insert >
346
346
```
347
347
348
- 먼저 ` insertInteractionMetadata ` 가 호출될것이고 update구문은 jdbc드라이버에 의해(` keyProperty ` 와 ` keyColumn ` ) 생성된 아이디들을 리턴하기 위해 설정되었다.
349
- ` InteractionMetadata ` 객체가 이 쿼리에 의해 업데이트되면 다음의 쿼리는 ` insertInteraction ` 를 통해 상위객체인 ` Interaction ` 를 작성하기 위해 사용될수 있다.
348
+ 먼저 ` insertInteractionMetadata ` 가 호출될 것이고 update구문은 jdbc드라이버에 의해(` keyProperty ` 와 ` keyColumn ` ) 생성된 아이디들을 리턴하기 위해 설정되었다.
349
+ ` InteractionMetadata ` 객체가 이 쿼리에 의해 업데이트되면 다음의 쿼리는 ` insertInteraction ` 를 통해 상위객체인 ` Interaction ` 를 작성하기 위해 사용될 수 있다.
350
350
351
- *** 방금 언급한 내용에 관련하여 JDBC드라이버가 똑같이 동작하지 않을수 있다.
351
+ *** 방금 언급한 내용에 관련하여 JDBC드라이버가 똑같이 동작하지 않을 수 있다.
352
352
이 글을 쓰는 시점에 H2 드라이버 1.3.168버전(` org.h2.jdbc.JdbcStatement#getGeneratedKeys ` 를 보라)만 배치모드에서 마지막 인덱스를 리턴한다.
353
353
반면에 MySQL 드라이버는 기대한 것과 동일하게 동작하고 모든 아이디를 리턴한다.***
0 commit comments