SpringBatch : ItemWriterAdapter
- Spring/Spring Batch
- 2022. 3. 13.
이 게시글은 인프런 정수원님의 강의를 수강하고 복습하며 정리한 글입니다.
ItemWriterAdapter
ItemWriterAdapter는 이미 내부적으로 사용하고 있는 Service 계층의 메서드를 Spring Batch Job에서 사용할 수 있도록 제공된다. Spring Batch는 여러 형태의 ItemWrtier 구현체를 제공하고 있으나, 모든 조건을 만족하지는 않기 때문이다. 코드의 재사용성을 생각한다면 ItemWriterAdapter를 사용하는 것도 하나의 방법이 될 수 있다.
ItemWriterAdapater API
ItemWriterAdapter는 ItemWriterAdapter 클래스를 생성하고, 생성된 객체에 이런저런 파라메터를 설정해주면 된다.
- setTargetMethod : inovke로 사용될 Target 객체의 메서드의 이름을 String 타입으로 전달해줌.
- setTargetObject : invoke로 사용될 Target 객체를 만들어서 넣어줌.
- setArguments : 사용될 파라메터를 설정해줌.
ItemWriterAdapater의 구조
ItemWriterAdapter는 기존에 사용되던 ItemWriter와는 조금 다르다. ItemWriter는 기본적으로 Output Chunk를 전달받아 한꺼번에 처리를 하는 구조였다. 그렇지만 ItemWriterAdapater는 Output Chunk를 받아서, 내부적으로 for문을 이용해서 단건으로 Item을 넘겨주며 서비스를 호출한다. 즉, ItemWriterAdapter에서는 Chunk Size만큼 Invoke가 수행되는 것으로 이해할 수 있다.
ItemWriterAdapter는 ItemWriter를 구현하고 있고, 위를 위해 write 메서드를 오버라이딩 하고 있다. write 메서드는 items를 리스트 형태로 전달을 받기는 하지만, ItemWriterAdapter는 내부에서 for문을 돌면서, 각각의 item을 단건으로 invoke를 열심히 처리해주는 것을 볼 수 있다.
한번 더 타고 들어와보면, invoker를 만들고, 파라메터를 셋팅해서 doInvoke를 해서 자바 Reflection을 활용해 타겟 객체의 타겟 메서드를 호출하는 형식으로 설정된다.
테스트 코드
테스트 코드 실행 결과
public class CustomServiceList<T> {
public Customer joinMember() {
Customer customer = new Customer();
customer.setFirstName("abc");
customer.setLastName("qwe");
customer.setBirthDate(LocalDate.now());
return customer;
}
public void writeMember(T item) {
System.out.println("item = " + item);
}
}
나는 CustomerServiceList 라는 클래스가 있다고 가정하고, 그 클래스의 writerMember() 메서드를 itemWriterAdapter에서 계속 사용할 수 있도록 코드를 작성했다. 이 때, Generic 타입을 이용해서 적절하게 타입을 넘겨줘야한다.
실행 결과, 전달받은 Item이 잘 출력되는 것을 확인할 수 있었다.
'Spring > Spring Batch' 카테고리의 다른 글
SpringBatch : SpringBatch Test 하기 (0) | 2022.03.16 |
---|---|
SpringBatch : CompositeItemProcessor / ClassifierCompositeItemProcessor (0) | 2022.03.13 |
Spring Batch : JdbcBatchItemWriter / JpaItemWriter (0) | 2022.03.13 |
Spring Batch : ItemReaderAdapter (0) | 2022.03.13 |
SpringBatch : JpaPagingItemReader (0) | 2022.03.13 |