JPA를 사용하여 새로운 기능을 구현하던 도중 두 가지의 오류를 만나게 되었다.
먼저 첫번째로 만난 오류는 다음과 같다.
No EntityManager with actual transaction available for current thread
구문대로 읽어보면 현재 스레드에 EntityManager이 없다고 한다.
해결 방법은 @Transactional 어노테이션을 사용하는 것인데 이러한 오류가 나타난 이유는 JPA가 transaction 기반으로 동작하고, transaction 단위에 따라 영속화 처리를 하기 때문이라고 한다.
두번째 오류는 다음과 같다.
No Default constructor for entity
엔티티에 대한 기본 생성자가 없다고 한다.
해결 방법은 당연하게도 엔티티 클래스에 기본 생성자를 생성해주거나 @NoArgsConstructor 어노테이션을 사용하는 방법인데, 이러한 오류를 발생시킨 이유는 JPA 엔티티는 반드시 파라미터가 없는 생성자가 있어야 하고, 이는 Public 또는 Protected 여야 한다.
라고 JPA 2.0 표준 스펙에 정의되어 있다고 한다.
두 가지 오류는 모두 간단한 문제이지만 한 번쯤은 알고 가는 게 좋을 것 같다.