본문 바로가기
IT/Java

Spring Batch 파일 읽기_추가 설정(파일 인코딩, 첫행 무시, 에러 시 패스)

by 성준하이 2024. 6. 19.
반응형

이전 포스팅에서 Spring Batch 사용시 reader 부분에서 파일로 읽는것에 대해 다룬 포스팅이 있다.

 

해당 파일을 읽을때 몇가지 설정할수 있는것들이 있어 추가 포스팅으로 작성한다.

 

파일 인코딩 설정

파일을 읽을때 인코딩 설정을 할수가 있다.

FlatFileItemReader 를 return 하는 reader 메서드에 설정하며 아래와 같다.

..이상 생략
public FlatFileItemReader<T> reader (Class<T> type, String[] names, String delimiter) {

     return new FlatFileItemReaderBuilder<T>()
         .delimited()
         .delimiter(delimiter)
         .names(names)
         .targetType(type)
         .saveState(false)
         .name("BatchFileItemReader")
         .encoding("UTF-8")
         .build();
     }
..이하 생략

빨간 부분의 encoding("UTF-8") 를 추가로 옵션 넣어주면 된다.

 

csv 파일 읽을때 첫 라인 무시

csv 파일을 읽을때 첫 라인은 컬럼명일 경우가 있다.

그럴 경우엔 첫 라인 무시를 해줘야한다.

 

인코딩과 마찬가지로 FlatFileItemReader 에서 진행하고 코드는 아래와 같다.

..이상 생략
public FlatFileItemReader<T> reader (Class<T> type, String[] names, String delimiter) {

     return new FlatFileItemReaderBuilder<T>()
         .delimited()
         .delimiter(delimiter)
         .names(names)
         .targetType(type)
         .saveState(false)
         .name("BatchFileItemReader")
         .linesToSkip(1)
         .build();
     }
..이하 생략

빨간 부분의 linesToSkip(1) 를 추가로 옵션 넣어주면 된다.

에러시 패스

파일을 읽다가 에러가 발생시 설정해두는 코드이다.

이 설정은 step 에서 설정을 한다.

예시 코드는 아래와 같다.

..이상 생략

private final SkipListener skipListener;

@Bean
public Step mainStep() {
     return new StepBuilder("mainStep", jobRepository)
     .<TestDto,TestDto>chunk(chunkSize,platformTransactionManager)
     .reader(fileReader.reader(resources))
     //별도의 processor 작업은 없음.
     .writer(writer.writer())
     .faultTolerant()
     .skip(Exception.class)
     .skipLimit(Integer.MAX_VALUE)
     .listener(skipListener)
     .build();
}
}
..이하 생략

빨간 부분을 추가로 옵션 넣어주면 된다.
     .faultTolerant()
     .skip(Exception.class) - 에러 시 skip
     .skipLimit(Integer.MAX_VALUE) - skip 갯수 지정
     .listener(skipListener) - skip 시 event 지정

skipListener 은 별도로 구현을 해둬야하고 예시는 아래와 같다.

@Component
public class SkipListener extends SkipListenerSupport<Object, Object> {

     @Override
     @OnSkipInRead
     public void onSkipInRead(Throwable t) {
          // Read 단계에서 스킵된 경우 로그 출력
          System.err.println("Skipped in read due to: " + t.getMessage());
     }

     @Override
     @OnSkipInProcess
     public void onSkipInProcess(Object item, Throwable t) {
          // Process 단계에서 스킵된 경우 로그 출력
          System.err.println("Skipped in process for item " + item + " due to: " + t.getMessage());
     }

     @Override
     @OnSkipInWrite
     public void onSkipInWrite(Object item, Throwable t) {
          // Write 단계에서 스킵된 경우 로그 출력
          System.err.println("Skipped in write for item " + item + " due to: " + t.getMessage());
     }
}
반응형

댓글