[spring batch] 따옴표 안 콤마 무시하기(구분자 콤마일 때)

괭이밥·2024년 1월 21일

spring

목록 보기
10/10
post-thumbnail

spring batch을 활용한 csv 파일 저장은 이전 글에서 볼 수 있다.


상황

  • csv 파일 읽어 DB에 저장하기 위해 spring batch 사용
  • 구분자로는 콤마(,) 사용
  • 따옴표("") 안에 있는 콤마는 무시하고 싶음
    • ex. fruit, "apple, banana", good 입력하면 fruit / apple, banana / good 으로 구분되어 DB 각 필드에 저장

순서

  1. DelimitedLineTokenizer 커스텀
  2. csvReader 코드 작성

1. DelimitedLineTokenizer 커스텀하기

  • DelimitedLineTokenizer를 상속
  • DEFAULT_QUOTE_CHARACTER 선언하여 무시할 문자 지정
  • isQuoteCharacter 메서드 오버라이딩
    • 주어진 문자가 구분자 내에서 따옴표로 둘러싸여 있는지 여부를 판단
class customDelimitedLineTokenizer extends DelimitedLineTokenizer {

    private static final char DEFAULT_QUOTE_CHARACTER = '"';

    @Override
    protected boolean isQuoteCharacter(char c) {
        return c == DEFAULT_QUOTE_CHARACTER;
    }

}

2. csvReader 코드 작성

  • 이전에 작성한 csvReader에서 DefaultLineMapper만 위에서 커스텀 한 내용으로 변경
  • 나머지 생략한 코드는 이전 포스팅에서 확인 가능
    @Bean
    public FlatFileItemReader<FacilityDto> csvFacilityReader(){
    
    	//...생략

        /* defaultLineMapper: 읽으려는 데이터 LineMapper을 통해 Dto로 매핑 */
        DefaultLineMapper<FacilityDto> defaultLineMapper = new DefaultLineMapper<>();

        /* delimitedLineTokenizer : csv 파일에서 구분자 지정하고 구분한 데이터 setNames를 통해 각 이름 설정 */
        DelimitedLineTokenizer delimitedLineTokenizer = new customDelimitedLineTokenizer(); //csv 파일에서 구분자
        delimitedLineTokenizer.setDelimiter(",");
        delimitedLineTokenizer.setNames(...); //행으로 읽은 데이터 매칭할 데이터 각 이름
        defaultLineMapper.setLineTokenizer(delimitedLineTokenizer); //lineTokenizer 설정

        //...생략
    }

profile
개발도 하고 싶은 클라우드 엔지니어

0개의 댓글