[Spring Batch] FileItemWriter
JsonFileItemWriter
- java docs
- code
- `` [ {json object}, {json object}, {json object} ]`` 형식으로 만들 때.
- 근데 spring-batch-core 4.1 부터 지원이라... 구버전에는 없다.
구버전에서는?
- 구버전에서는 FlatFileItemWriter를 쓰거나 직접 ItemWriter 작성해야 하는데 그나마 FlatFileItemWriter가 좀 더 고수준이라 이걸 쓰는게 낫다. (덮어쓰기, 기존 파일 존재하면 삭제 등 설정 가능)
- 근데 문제는 `` [ {json object}, {json object}, {json object} ]`` 형식으로 만들기가 까다롭다는 점이다. (맨 앞과 뒤에 구분자 , 가 들어간다. JsonFileItemWriter에서는 이거 빼기 위해 state 체크 하고 있다)
- 근데 애초에, 배치 파일로 만들어서 전달해야 한다는건 파일 크기가 크다는 의미이므로, 어차피 파일 전체 데이터를 한꺼번에 가져올 수 없을 가능성이 크다. => `` [...]`` 형식의 json format을 꼭 맞출 필요 없이, newline으로 구분하는게 낫다.
FlatFileItemWriter 쓴다면 반환 타입은 ItemWriter가 아니라 FlatFileItemWriter 여야 한다.
`` open()``은 ItemWriter가 아니라 ItemStream에 속한 메서드라, ItemWriter를 반환하면 open 메서드를 찾을 수 없다.
public class FlatFileItemWriter<T> extends AbstractItemStreamItemWriter<T> ... {
public abstract class AbstractItemStreamItemWriter<T> extends ItemStreamSupport implements ItemStreamWriter<T> {
public interface ItemStreamWriter<T> extends ItemStream, ItemWriter<T> {
ItemStream에 대해서는 아래 참조
https://docs.spring.io/spring-batch/docs/current/reference/html/step.html#registeringItemStreams
전달 목적으로 owfs + file? VS kafka?
- 기존에 사용하던 kafka 인터페이스가 있다면 그걸 그대로 사용하는게 낫다. 기존에 kafka 개발한게 있다 해도 이걸 kafka가 아니라 file로 바꾸는데 풀타임으로 반나절 정도는 써야함.
- 하지만 매우 대용량 전송해야 하는 경우(e.g., 과거 데이터 소급 전송) 카프카 용량이 부족 할 수 있어서 어차피 file(ftp, owfs)로 전달해야 할 수도 있음. 꼭 검토해보아야 함.
- 게다가 파일이 제대로 다 써지지 않고 오류나는 경우도 있기 때문에 이 것도 신경써야 함. (stackoverflow)
- case 1 : 디스크 용량 모자른 경우
- case 2 : owfs같은 공유 파일시스템에 바로 파일 생성하고 쓰는 경우. 일단 로컬에 쓰고 owfs로 copy 해야 한다.
- 실제로 owfs에 대용량 파일 바로 쓰다가 중간에 꽤 높은 확률로 위 에러 마주쳤음.
- owfs 바로 쓰는 것 보다, 로컬에 쓰고 owfs로 복사만 하는게 훨씬 빠르다!
'Java Stack > Spring Batch' 카테고리의 다른 글
[Spring Batch] cli 실행 - JobLauncherApplicationRunner (0) | 2023.06.16 |
---|---|
Spring Boot 3 에서 변경된 부분 (Batch) (0) | 2023.06.14 |
Spring Batch Multi-threaded Step 사용 시 chunk 구성에 대한 오해 (0) | 2022.12.16 |
[Spring Batch] 병렬 처리 방법 모음 (0) | 2022.09.15 |
[Spring Batch] Scoped Bean 초기화 시 생성자 로깅 누락 문제 (0) | 2022.07.27 |