강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

빈빠님의 프로필 이미지
빈빠

작성한 질문수

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

2장. 작전1: FlatFileItemReader (시스템의 마지막 기록을 읽어내다 ☠️)

2장.작전1. 실행시 오류에 대해서 문의.

작성

·

16

1

,로분리된 csv파일로 하고
public FlatFileItemReader<SystemFailure> systemFailureItemReader( @Value("#{jobParameters['inputFile']}") String inputFile) { return new FlatFileItemReaderBuilder<SystemFailure>() .name("systemFailureItemReader") .resource(new FileSystemResource(inputFile)) .delimited() .delimiter(",") .names("errorId", "errorDateTime", "severity", "processId", "errorMessage") .targetType(SystemFailure.class) .linesToSkip(1) .strict(true) .build(); }
----------
실행하면, 오류가 발생합니다.


PS D:\Test\springboot\kill-batch-system> ./gradlew bootRun --args='--spring.batch.job.name=systemFailureJob inputFile=d:/Test/springboot/kill-batch-system/system-failures.csv'


.....

Caused by: org.springframework.batch.item.file.transform.IncorrectTokenCountException: Incorrect number of tokens found in record: expected 5 actual 1

.....

 

PS D:\Test\springboot\kill-batch-system>

그런데, \t으로 구분하고,
.delimiter("\t")
로 하면 정상작동합니다. 이유가 뭘까요?
윈도우 환경입니다.

그리고, 실행시 파일의 위치를 절대경로로 주어야 하나요?
상대경로일경우, 파일의 위치를 어디에 두어야 하나요?

답변 2

1

KILL-9님의 프로필 이미지
KILL-9
지식공유자

오늘도 보는구나 빈빠형 반갑다! 💀 (출퇴근 이슈로 답변이 느린점 양해바란다)

 

사실 진정한 시스템 처형자는 윈도우 따위는 극혐하는 법이지만... 너의 학습 열기가 상당한 수준에 도달한 듯하여 특별히 너에게는 Windows 봉인을 풀도록 하겠다 💀

 

자, 너는 우리 강의에서 echo -e 명령을 사용해 데이터를 입력하도록 지시받았을 것이다. 안타깝게도 이게 Windows에서는 동작하지 않는다!

 

왜 그런가?echo -e이스케이프 시퀀스(\n, \t 같은 특수문자)를 해석하는 기능으로, Linux/macOS 전용 무기다. Windows의 cmd는 이런 고급 기술을 이해하지 못한다.

 

Windows에서의 시스템 파괴법

PowerShell 버전

@"
에러ID,발생시각,심각도,프로세스ID,에러메시지
ERR001,2024-01-19 10:15:23,CRITICAL,1234,SYSTEM_CRASH
ERR002,2024-01-19 10:15:25,FATAL,1235,MEMORY_OVERFLOW
"@ | Out-File -FilePath system-failures.csv -Encoding UTF8

 

CMD 버전

echo 에러ID,발생시각,심각도,프로세스ID,에러메시지 > system-failures.csv
echo ERR001,2024-01-19 10:15:23,CRITICAL,1234,SYSTEM_CRASH >> system-failures.csv
echo ERR002,2024-01-19 10:15:25,FATAL,1235,MEMORY_OVERFLOW >> system-failures.csv

 

킬구 스타일 간단한 해결책(강추)

: 그냥 메모장 열고 복붙하라! Windows도 감히 거부할 수 없는 방법이다!

에러ID,발생시각,심각도,프로세스ID,에러메시지
ERR001,2024-01-19 10:15:23,CRITICAL,1234,SYSTEM_CRASH
ERR002,2024-01-19 10:15:25,FATAL,1235,MEMORY_OVERFLOW

 

킬구의 조언: Linux 명령어가 그리우면 Git Bash를 설치하라. 그러면 진정한 시스템 파괴가 가능하다. 이제.. Windows도 너의 앞에 무릎 꿇을 것이다

 

오 PS라.. 역시 학습이 빠르군 💀

대답하자면 PS(PowerShell)로 절대경로로 주면 된다

inputFile=D:/Test/springboot/kill-batch-system/system-failures.csv

 

PS.

kill9.no.mercy@gmail.com:~$ cat /etc/sudoers

이틀 연속 질문을 올린 너에게는 특별히.. 
답변이 느릴 경우에 한해 메일로 찡찡대기 권한을 부여한다. 
단, ACK는 보장하지 않는다. (Best Effort.. ) 

0

안녕하세요, 인프런 AI 인턴입니다.

빈빠님, 실행 중에 발생한 오류와 관련하여 도움을 드리고자 합니다. 주어진 상황에서 FlatFileItemReader를 사용하여 CSV 파일을 읽을 때 특정 오류가 발생한 것으로 보입니다. 다음은 문제의 주요 원인과 해결 방법에 대한 간략한 설명입니다.

문제 요약

  1. IncorrectTokenCountException 오류: 오류 메시지에서 나타나듯이, FlatFileItemReader가 기대하는 토큰(컬럼의 수)과 실제 데이터의 열 수가 일치하지 않아서 발생한 오류입니다. 이 경우, CSV 파일이 쉼표(,)로 제대로 구분되지 않았을 가능성이 있습니다. Windows 환경에서는 일반 텍스트 편집기에서 CSV 파일이 다른 형태로 저장될 수 있습니다.

  2. 탭 구분자로 정상 작동되는 이유: .delimiter("\t")를 사용했을 때 정상 작동한다면, CSV 파일이 실제로 쉼표 대신 탭으로 데이터가 구분되어 있는지를 확인해보실 필요가 있습니다. 일반적으로 CSV 파일은 쉼표로 구분되지만, 경우에 따라 다른 구분자가 사용될 수 있습니다.

해결 방법 제안

  1. 파일 내용 확인: 파일을 메모장이나 다른 텍스트 편집기로 열어보시고, 실제 데이터가 쉼표(,) 혹은 다른 구분자로 이루어져 있는지를 확인해 보세요.

  2. 파일 저장 형식 확인: 파일이 CSV 형식으로 제대로 저장되지 않았거나, 파일을 생성할 때 다른 구분자가 사용되었을 수 있습니다. 파일이 올바르게 쉼표로 구분되어 있는지 다시 저장해보세요.

  3. 절대경로 vs 상대경로:

    • 절대경로: 전체 경로를 지정하는 것이며, 이 경우 파일의 정확한 위치를 지정해야 합니다.
    • 상대경로: 프로젝트 디렉토리를 기준으로 하는 경로입니다. 상대경로를 사용할 때는 실행 환경에서 파일이 있는 위치를 정확히 이해하고 있어야 합니다.

상대경로를 사용할 경우, 프로젝트의 루트 디렉토리나 실행하는 JAR 파일의 위치를 기준으로 파일 경로를 설정해 주셔야 합니다. 실행 위치에 따라 경로가 달라질 수 있습니다.

구체적으로 CSV 파일의 구분자를 확인하고, 필요 시 파일을 다시 저장하거나, 해당 파일의 구분자 설정을 업데이트해 보시기 바랍니다.

유사한 오류 해결 사례를 참조하려면 예시코드 오타 제보를 참고해 보시면 도움이 될 수 있습니다. 이 외에도 추가 질문이 있으시면 주저하지 말고 문의해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

빈빠님의 프로필 이미지
빈빠

작성한 질문수

질문하기