개발/BACKEND

Spring Batch JpaItemWriter에서 List<Entity> 처리하기

uhanuu 2024. 7. 10. 10:52

사용자의 메일함에서 뉴스레터가 전송한 메일을 여러개를 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가 필요하다고 예외가 발생하게 됩니다.