반응형
사용자의 메일함에서 뉴스레터가 전송한 메일을 여러개를 JpaItemWriter를 통해서 Insert 처리를 해주려고 합니다.
하지만 배치를 돌려보니 "Class 'class java.util.ArrayList' is not an entity class" 예외가 발생했습니다.
- Stack trace를 확인해보니 JpaItemWriter에서 write메서드가 수행되는데 받아온 객체가 Entity가 아니라 List.class라서 발생한 문제였습니다.
- doWrite를 호출하면서 SessionImpl 클래스에서 persist를 하기전에 체크하는 메서드들이 호출될 때 ArrayList는 Entity가 아니라서 예외가 발생하게 됩니다.
- 즉 write 메서드에 T가 Article이 아니라 List<Article>이 들어오고 ArrayList는 Entity 클래스가 아니기 때문에 오류가 발생했다.
JpaItemWriter클래스의 write 메서드를 override해서 내부에서 Article이 처리될 수 있게 수정해주면 됩니다.
- 이동욱님이 쓰신글을 찾아 쉽게 재정의할 수 있었습니다.
- 빨간색 블럭을 보시면 JpaItemWriter의 T를 List<T>로 지정해줍니다.
JpaItemWriter의 T가 List<T>라서 상속받은 write 메서드를 사용하더라도 List를 넘겨줘야 합니다.
- 따라서 파란색 블럭처럼 주 생성자에서 <T> 타입으로 엔티티를 받을 수 있는 JpaItemWriter를 주입 받아줘서 로직을 수행하면 됩니다.
batch config 수정하기
ItemWriter 두개 전부 EntityManagerFactory를 지정해줘야 합니다.
- 하나라도 지정하지 않으면 EntityManagerFactory가 필요하다고 예외가 발생하게 됩니다.
반응형
'개발 > Spring Boot' 카테고리의 다른 글
spring batch에서 DataSource 분리 (1) | 2024.06.02 |
---|---|
회원 탈퇴 로직 Spring Event로 처리하기 (0) | 2024.04.06 |
[Spring] 스레드 풀 (1) | 2024.01.29 |
토큰 재발급 로직을 테스트하면서 발생한 문제 (2) | 2024.01.18 |
Test에서 deleteAll과 deleteAllInBatch() (0) | 2023.07.18 |