[파일처리] 1. FlatFileItemReader 내부 구조

y001·2026년 3월 8일

Spring Batch Guide

목록 보기
11/19
post-thumbnail

1. 시작하면서

Spring Batch에서 파일 기반 데이터를 처리할 때 가장 많이 사용하는 Reader가 FlatFileItemReader이다. 이름만 보면 단순히 파일을 읽는 도구처럼 보이지만 실제 역할은 그보다 훨씬 중요하다. FlatFileItemReader는 파일을 한 줄씩 읽은 뒤 그 문자열을 애플리케이션에서 사용하는 도메인 객체로 변환하여 Step으로 전달하는 Reader이다.

배치 시스템에서는 CSV, 로그 파일, 고정 길이 텍스트 파일 등 다양한 형태의 파일 데이터를 처리한다. 그러나 이러한 데이터는 대부분 문자열 형태이기 때문에 그대로 비즈니스 로직에서 사용할 수 없다. 문자열을 여러 필드로 분리하고, 각 값을 객체의 속성으로 매핑하는 변환 과정이 필요하다. FlatFileItemReader는 바로 이 과정을 여러 컴포넌트로 분리하여 처리하도록 설계되어 있으며, 이를 통해 파일 데이터를 객체 기반 데이터 흐름으로 변환한다.

2. FlatFileItemReader의 흐름

FlatFileItemReader의 동작을 단순화하면 다음과 같이 정리할 수 있다.

파일 한 줄 읽기
→ 문자열 분리
→ 중간 데이터 구조 생성
→ 도메인 객체로 변환
→ Step으로 전달

즉 FlatFileItemReader는 단순히 파일을 읽는 Reader가 아니라 파일 문자열을 객체로 변환하는 파이프라인의 시작점이다. Spring Batch는 이 변환 과정을 하나의 로직으로 처리하지 않고, 역할이 다른 여러 컴포넌트로 나누어 처리한다.

2-1. LineMapper

LineMapper는 파일에서 읽은 문자열 한 줄을 최종 도메인 객체로 변환하는 역할을 담당한다. FlatFileItemReader는 파일에서 문자열을 읽은 뒤 이를 그대로 LineMapper에 전달하고, LineMapper는 해당 문자열을 객체로 변환하여 반환한다.

Spring Batch에서 가장 많이 사용하는 구현체는 DefaultLineMapper이다. 이 클래스는 문자열을 직접 파싱하지 않고 내부적으로 두 개의 컴포넌트를 사용한다.

  • LineTokenizer
  • FieldSetMapper

즉 LineMapper는 문자열을 필드 단위로 분리하고, 분리된 데이터를 객체로 변환하는 과정을 조합하여 실행하는 역할을 한다.

LineMapper 인터페이스는 다음과 같이 정의되어 있다.

public interface LineMapper<T> {
    T mapLine(String line, int lineNumber) throws Exception;
}

mapLine() 메서드는 파일에서 읽은 문자열과 라인 번호를 전달받아 해당 데이터를 객체로 변환한다.

2-2. LineTokenizer

LineTokenizer는 문자열을 여러 개의 필드 값으로 분리하는 역할을 한다. 파일에서 읽은 한 줄의 문자열은 보통 여러 데이터가 하나의 문자열로 결합된 형태이기 때문에, 먼저 이를 필드 단위로 분리해야 한다.

예를 들어 다음과 같은 문자열이 있다고 가정해 보자.

ERR001,2024-01-19 10:15:23,CRITICAL,1234,SYSTEM_CRASH

LineTokenizer는 이 문자열을 다음과 같은 값으로 분리한다.

ERR001
2024-01-19 10:15:23
CRITICAL
1234
SYSTEM_CRASH

이렇게 분리된 값은 다음 단계에서 FieldSet 객체에 저장된다.

2-3. FieldSet

FieldSet은 분리된 필드 데이터를 보관하는 중간 객체이다. 단순히 값만 저장하는 것이 아니라 각 필드의 이름과 값을 함께 관리한다.

예를 들어 파일 데이터를 읽으면 FieldSet에는 다음과 같은 형태의 데이터가 저장된다.

errorId → ERR001
errorDateTime → 2024-01-19 10:15:23
severity → CRITICAL
processId → 1234
message → SYSTEM_CRASH

FieldSet은 파일에서 읽은 문자열 데이터와 실제 도메인 객체 사이를 연결하는 중간 데이터 구조이며, 이후 객체 매핑 단계에서 사용된다.

2-4. FieldSetMapper

FieldSetMapper는 FieldSet 데이터를 실제 도메인 객체로 변환하는 역할을 담당한다. 즉 파일 데이터를 애플리케이션에서 사용하는 객체 구조로 매핑하는 단계이다.

Spring Batch에서는 BeanWrapperFieldSetMapper 구현체를 가장 많이 사용한다. 이 클래스는 FieldSet의 필드 이름과 객체의 setter 메서드를 매칭하여 자동으로 객체를 생성한다.

예를 들어 FieldSet에 다음과 같은 데이터가 있다고 가정해 보자.

errorId = ERR001
severity = CRITICAL
processId = 1234

FieldSetMapper는 이 데이터를 객체의 setter 메서드와 연결한다.

errorId → setErrorId()
severity → setSeverity()
processId → setProcessId()

이 과정을 통해 파일의 한 줄 데이터는 하나의 도메인 객체로 변환된다.

0개의 댓글