인프런 커뮤니티 질문&답변

지원님의 프로필 이미지
지원

작성한 질문수

실전! Querydsl

EntityManagerFactory를 활용한 페치조인 예제 에러(해결법있음 - 이유모름)

작성

·

327

·

수정됨

0

환경

 

조인 - 페치 조인 강의를 듣던 중

이 부분 예제를 따라 하다가 보니

java.lang.illegalstateexception: specified field type [interface jakarta.persistence.entitymanagerfactory] is incompatible with resource type [jakarta.persistence.entitymanager]

이라는 exception이 발생했습니다.

강의에서 새로운 프로젝트를 생성하거나 파일을 생성하지 않았으므로 상단에

@PersistenceContext
EntityManager em; 

가 있고 추가적으로

@PersistenceContext
 EntityManagerFactory emf;

를 넣어주고 테스트 코드에서

emf.getPersistenceUnitUtil().isLoaded(findMember.getTeam());

를 실행하였습니다.

 

일단 entitymanagerfactory는 yml에 있는 설정을 바탕으로 1개가 생성되고 해당 factory에서 요청에 의해 entitymanager를 생성해서 제공하는 형태라는 글을 발견하여 추가적인 의존성 주입에서 2개의 factory 생성되는 이슈가 발생해서가 아닌가 추측을 하고 우선적으로는 사용중인 em에서 factory를 가져올 수 있길래 이렇게 접근했는데

em.getEntityManagerFactory().getPersistenceUnitUtil().isLoaded(findMember.getTeam());

정상작동은 하긴 하지만 강사님의 경우 추가적인 entitymanagerfactory 주입에도 테스트코드가 돌아갔으므로 정확한 동작 이유를 잘 모르겠어서 혹시 확실한 이유를 알 수 있을까 하여 문의합니다.

바탕

답변 2

0

예제의 내용이 시간이 흘러 변경된 건지 모르겠으나

@PersistenceContext가 아니라

@PersistenceUnit 어노테이션을 사용하도록 돼 있네요.

저는 이렇게 했는데 emf.getPersistenceUnitUtil 사용 시
cannot resolve symbol... 오류가 떠서 검색 중이긴 합니다...

0

안녕하세요 지원님, 인프런 AI 인턴이에요.
문의 주신 내용을 확인해보니, EntityManagerFactory를 활용한 페치조인 예제에서 발생한 에러에 대한 이유에 대해 질문하시는 거 맞으시죠?

일단, 예외 메시지를 보면 “field type [interface jakarta.persistence.entitymanagerfactory] is incompatible with resource type [jakarta.persistence.entitymanager]“라고 나와있는 것으로 보입니다.
이 예외는 EntityManagerFactory와 EntityManager의 타입이 호환되지 않는다는 의미입니다.

그런데 예제 코드에서는 @PersistenceContext 어노테이션을 통해 EntityManager와 EntityManagerFactory를 주입받고 있습니다. 일반적으로 EntityManager와 EntityManagerFactory는 다음과 같은 용도로 사용됩니다.

  • EntityManager: 실제로 엔티티의 영속성 컨텍스트를 관리하고 데이터베이스 작업을 수행하는 객체입니다.
  • EntityManagerFactory: EntityManager를 생성하기 위한 팩토리 객체로, 일반적으로 애플리케이션의 실행 시점에 한 번만 생성되고 재사용됩니다.

따라서 EntityManagerFactory는 EntityManager의 생성과 관련된 역할을 수행하기 때문에, EntityManagerFactory를 EntityManager와 함께 주입받는 것은 일반적인 상황에서는 필요하지 않을 수 있습니다.

만약 예제 코드에서 EntityManagerFactory를 주입받지 않고도 정상적으로 동작한다면, 고의적인 페치 조인 예제일 수 있으며 기본적으로는 EntityManager를 사용하여 페치 조인을 수행해야 합니다. 추가적인 EntityManagerFactory 주입에 대한 테스트와 관련하여, 정확한 동작 이유는 수업 내용과 상황에 따라 다를 수 있으며, 실제 애플리케이션이나 프레임워크의 설정에 따라 달라질 수 있습니다.

현재 강의에 대한 자세한 내용을 알지 못하므로 정확한 이유를 말씀드리기는 어렵습니다. 이해를 돕기 위해 추가적인 예제 코드나 강의자의 해설을 참고하시는 것을 추천드립니다. 또한, 해당 예제에 대한 질문이 있을 경우, 수업 커뮤니티나 강의자에게 문의해보시는 것도 좋을 것 같습니다.
감사합니다!

지원님의 프로필 이미지
지원

작성한 질문수

질문하기