- 데이터를 플랫 파일 형식으로 쓰는 작업을 담당 - 데이터를 파일에 쓸 때 흔히 발생하는 복잡한 저수준 작업들, 파일 포맷 맞추기, 데이터를 한 줄씩 작성, 내부적으로 버퍼링을 활용한 최적화 등의 귀찮은 일들을 직접 구현할 필요가 없음 - 선언적인 설정만으로 대량의 파일 쓰기 작업을 효율적으로 처리할 수 있음 - 어떻게 도메인 객체를 파일에 기록할까? -...
,)로 이어서 문자열을 만든다
FieldExtractorLineAggregator 컴포넌트가 맡는다 public interface FieldExtractor<T> {
Object[] extract(T item);
}+--------------------------------------------------+
| FlatFileItemWriter<T> |
|--------------------------------------------------|
| - lineAggregator : LineAggregator<T> |
+--------------------------------------------------+
|
v
+--------------------------------------------------+
| <<interface>> LineAggregator<T> |
|--------------------------------------------------|
| + aggregate(item : T) : String |
+--------------------------------------------------+
^
|
+--------------------------------------------------+
| <<abstract>> ExtractorLineAggregator<T> |
|--------------------------------------------------|
| - fieldExtractor : FieldExtractor<T> |
|--------------------------------------------------|
| + aggregate(item : T) : String |
| # doAggregate(fields : Object[]) : String |
+--------------------------------------------------+
^ ^
| |
+-------------------------------+ +-------------------------------+
| DelimitedLineAggregator<T> | | FormatterLineAggregator<T> |
|-------------------------------| |-------------------------------|
| - delimiter : String | | - format : String |
|-------------------------------| |-------------------------------|
| doAggregate(fields) | | doAggregate(fields) |
+-------------------------------+ +-------------------------------+Item<T>
|
v
FlatFileItemWriter.write()
|
v
LineAggregator.aggregate(item)
|
v
ExtractorLineAggregator.aggregate(item)
|
+--> FieldExtractor.extract(item)
| |
| v
| Object[] fields
|
+--> doAggregate(fields)
|
+--> DelimitedLineAggregator
| -> "a,b,c"
|
+--> FormatterLineAggregator
-> String.format(...)지금까지는 객체 하나를 문자열로 바꾸는 법을 살펴봤다
// FlatFileItemWriter.doWrite() -> write()에서 호출
public String doWrite(Chunk<? extends T> items) {
StringBuilder lines = new StringBuilder();
for (T item : items) {
lines.append(this.lineAggregator.aggregate(item)).append(this.lineSeparator);
}
return lines.toString();
}