1 ItemWriter
- ItemWriter는 Spring Batch에서 데이터를 출력하는 역할을 담당하는 핵심 인터페이스입니다.
- ItemReader와는 반대 개념으로, 데이터를 읽어오는 대신 데이터를 써내는 작업을 수행합니다.
- 데이터베이스 삽입/업데이트, 파일 쓰기, 메시지 큐 전송 등 다양한 출력 작업을 처리할 수 있습니다.
- ItemWriter는 ItemReader와 함께 Spring Batch의 청크 지향 처리(Chunk-oriented Processing)에서 핵심적인 역할을 합니다.
- Reader가 데이터를 읽어오면, Processor가 가공하고, Writer가 최종 결과를 출력하는 구조입니다.
1.1 인터페이스
@FunctionalInterface
public interface ItemWriter<T> {
void write(@NonNull Chunk<? extends T> chunk) throws Exception;
}
- ItemWriter는 매우 간단한 구조의 제네릭 인터페이스입니다.
- 단일 메서드 write()만을 정의하고 있어 구현이 용이합니다.
- 이 인터페이스는 제네릭 타입 T를 사용하여 다양한 종류의 데이터를 처리할 수 있습니다.
1.2 write 메서드의 특징
- write 메서드는 개별 아이템이 아닌 Chunk 단위로 데이터를 받습니다.
- ItemReader 인터페이스와 비교하면 read() 메서드가 단일 아이템을 반환하는 것과 달리, write() 메서드는 아이템의 목록을 받습니다.
- 이는 배치 처리에서 성능 최적화를 위해 여러 아이템을 묶어서 처리하기 때문입니다.
- Spring Batch는 설정된 청크 크기만큼의 아이템을 모아서 ItemWriter에 전달합니다.
- 예를 들어, 청크 크기가 100이면 100개의 아이템이 리스트 형태로 전달됩니다.
- 이를 통해 네트워크 왕복 횟수를 줄이고 성능을 향상시킬 수 있습니다.
- 청크 프로세싱에 대해서 더 자세히 알고 싶다면 아래 문서를 참고하세요.
2 데이터베이스 기반 구현체
- Spring Batch는 다양한 데이터베이스 기반 ItemWriter 구현체를 제공합니다.
- 구현체 목록을 확인하고 싶다면 아래 링크를 참고하세요.
2.1 JdbcBatchItemWriter
- JdbcBatchItemWriter는 JDBC를 사용하여 데이터베이스에 배치 처리로 데이터를 저장하는 ItemWriter 구현체입니다.
- JdbcBatchItemWriter는 내부적으로 JdbcTemplate를 감싸고 있는 래퍼에 지나지 않습니다.
- 청크 단위로 전달받은 아이템들을 JdbcTemplate의 배치 기능을 사용하여 한 번에 SQL을 실행하여 성능을 최적화합니다.
- SQL 파라미터를 채우는 방식에 따라 두 가지 구현 방법을 제공합니다.
- Named Parameter 방식: SQL 쿼리에서 파라미터 이름을 사용하여 매핑합니다.
- Positional Parameter 방식: 물음표(
?
)를 값의 플레이스홀더로 사용하여 파라미터 순서를 지정합니다.