[Spring Data JPA] No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call 에러 해결

JPA 관련 학습을 하는 도중에 일반적인 비즈니스 로직은 다 짰고 테스트로 돌려보고싶어서 테스트코드를 작성하는 도중에 다음과 같은 에러가 발생했다.

 

No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call

일단 내용을 읽어보니 현재 스레드에 EntityManager가 없다고 persist할수 없다고 한다는것 같았다.

 

하지만 자세히 읽어보니 actual transaction available for current thread 라는 워딩이 있었고, 내가 하는 작업에 트랜잭션 선언을 했었나 확인해보니 역시나..

 

@Transactional 어노테이션을 빼먹었었다.

 

기본적으로 JPA는 transaction을 기반으로 작동하게 되어있다.

 

transaction 단위에 따라 1차캐시영역에 있는 객체들이 db에 flush되어 영속화되기 때문이다.

 

하지만 그러한 영속작업을 하는 persist() 메소드에 객체가 들어갔으나 가능한 transaction이 존재하지 않았기에 저런 에러를 낸것이다.

 

고로 서비스 혹은 클래스에 미리 @Transactional을 선언해두자!!

 

클래스에는 @Transactional(readOnly = true) / 메소드에는 @Transactional 을 붙여 read 트랜잭션과 write 트랜잭션을 구분하는 것도 잊지말자!

 

JPA에 대한 아키텍처가 궁금하신분은 아래의 글도 참고해주세요!!

https://sas-study.tistory.com/339

 

[번역글] JPA(Java Persistence API) 아키텍처에 대한 소개/개요/설명

JPA 아키텍처에 대한 소개 이번 포스팅에서는 JAVA Persistence API의 핵심 클래스/인터페이스인 JPA의 구조에 대해서 알아보겠습니다. Java Persistence API(JPA)는 관계형 데이터베이스(RDBMS)객체를 자바 객��

sas-study.tistory.com

 

댓글

Designed by JB FACTORY