사용자의 메일함에서 뉴스레터가 전송한 메일을 여러개를 JpaItemWriter를 통해서 Insert 처리를 해주려고 합니다
하지만 배치를 돌려보니 "Class 'class java.util.ArrayList' is not an entity class" 예외가 발생했습니다.
- Stack trace를 확인해보니 JpaItemWriter에서 write메서드가 수행되는데 받아온 객체가 Entity가 아니라 List.class라서 발생한 문제였습니다.
- doWrite를 호출하면서 SessionImpl 클래스에서 persist를 하기전에 체크하는 메서드들이 호출될 때 ArrayList는 Entity가 아니라서 예외가 발생하게 됩니다.
SessionImpl 클래스의 contains 메서드
- 즉 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가 필요하다고 예외가 발생하게 됩니다.
'개발 > BACKEND' 카테고리의 다른 글
PK를 어떻게 설정하는 것이 좋을까? 🤔 (0) | 2024.07.10 |
---|---|
[Query dsl]hibernate.query.SemanticException : Could not interpret path expression (0) | 2024.07.10 |
[에러 해결] cannot resolve class or package 'cj' (1) | 2024.07.10 |
java에서 이미지 작업 및 최적화하기 (0) | 2024.07.10 |
spring batch에서 DataSource 분리 (0) | 2024.07.10 |