Post

(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 메서드를 찾을 수 없다.

1
2
3
4
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로 복사만 하는게 훨씬 빠르다!
This post is licensed under CC BY 4.0 by the author.