2024.03.20 - [Spring/Batch Programming] - Spring Batch 3 - Items(Reader)
이전 까지 Item 세가지 중 Reader에 대해서 알아 보았다. 이 글에서는 Writer에 대해서 알아 본다.
chunk를 받아서 무엇인가를 작성하는 것을 볼 수있다.
출력도 마찬가지로 입력하기 에서의 종류와 같이 여러가지 타입으로 출력할 수 있다.
각각 어떻게 쓰는지 알아본다.
Flat File
- shouldDeleteIfEmpty() : 배치가 끝났는데 해당 파일이 비어있으면 제거 or 그대로둠?(footer, header를 제외한 본문만 해당)
- shouldDeleteIfExists() : 이미 파일이 존재하면 덮어쓸지?
ex) 이미 파일이 존재하는데 인자로 false를 주면 에러가 난다. 디폴트 값은 true이다. append()와 같이 쓰면 중복되어 쓴다.
- append() : 존재하면 아래에 덧 붙일건지?
- lineAggregator() : 객체를 받아서 라인을 그림
실습
@Bean
public ItemWriter<User> flatFileItemWriter(){
return new FlatFileItemWriterBuilder<User>()
.name("flatFileItemWriter")
.resource(new PathResource("spring-batch/src/main/resources/new_users.txt"))
.delimited().delimiter("__")
.names("name", "age", "region", "telephone")
.build();
}
@Bean
public ItemWriter<User> formattedFlatFileItemWriter(){
return new FlatFileItemWriterBuilder<User>()
.name("formattedFlatFileItemWriter")
.resource(new PathResource("spring-batch/src/main/resources/new_formatted_users.txt"))
.formatted()
.format("%s의 나이는 %s입니다. 사는곳은 %s, 전화번호는 %s입니다.")
.names("name", "age", "region", "telephone")
.build();
}
String에서의 format과 동일한 형태이다.
JSON
JSON의 경우 형태가 갖춰져 있어 표준화가 되어있기 때문에, 읽기와 차이가 없다.
@Bean
public JsonFileItemWriter<User> jsonFileItemWriter(){
return new JsonFileItemWriterBuilder<User>()
.name("jsonFileItemWriter")
.resource(new PathResource("spring-batch/src/main/resources/new_users.json"))
.jsonObjectMarshaller(new JacksonJsonObjectMarshaller<>())
.build();
}
데이터베이스 쓰기
- JpaItemWriter
- JPA 이용
- 한 건씩 insert, update
실습
@Bean
public JpaItemWriter<User> jpaItemWriter(EntityManagerFactory entityManagerFactory){
return new JpaItemWriterBuilder<User>()
.entityManagerFactory(entityManagerFactory)
.build();
}
매우 간단하게 EntityManagerFactory만 가지고 테이블에 Reader에서 읽은 데이터를 저장하는걸 확인할 수있다.
- JdbcBatchItemWriter(데이터가 많은 경우 성능 향상)
- 벌크 insert, update 제공
- SQL의 사소한 변경이 힘들수도 있다.
실습
@Bean
public ItemWriter<User> jdbcBatchItemWriter(DataSource dataSource){
return new JdbcBatchItemWriterBuilder<User>()
.dataSource(dataSource)
.sql("""
INSERT INTO
USER(name, age, region, telephone)
VALUES
(:name, :age, :region, :telephone)
""")
.beanMapped()
.build();
}
DataSource를 주입받아서 사용한다.
jdbc와 jpa의 선택 기준은 데이터의 양에 따라서 유동적으로 선택하는 것이좋다.
오래걸리고 데이터가 많으면 jdbc 아니면 jpa!
2024.03.25 - [Spring/Batch Programming] - Spring Batch 3 - Items(Processor)
'Spring > Batch Programming' 카테고리의 다른 글
Spring Batch 확장 (0) | 2024.03.25 |
---|---|
Spring Batch 3 - Items(Processor) (0) | 2024.03.25 |
Spring Batch 3 - Items(Reader) (0) | 2024.03.20 |
Spring Batch Step (0) | 2024.03.13 |
Spring Batch Job (0) | 2024.03.13 |