[에러노트] QueryDsl 페치조인 미적용 테스트 중 에러 발생

hyewon jeong·2023년 6월 6일
0

에러노트

목록 보기
27/45

1 발생

QueryDsl 페치조인 미적용 테스트 중 결과가
member.getTeam() 조회했을때 Lazy 타입으로 지연로딩이 되어 false가 나와야 하는데 true 가 나와 테스트 실패 했다.


2 코드

@PersistenceUnit
EntityManagerFactory emf;
  @Test
  @DisplayName("페치조인 미적용")
  void fetchJoin_no(){


    Member member1 = jpaQueryFactory.selectFrom(member)
        .where(member.username.eq("member1"))
        .fetchOne();

    boolean loaded1 = emf.getPersistenceUnitUtil().isLoaded(member1.getTeam());
    assertThat(loaded1).as("페치조인 미적용").isFalse();
  }
}

3 원인

영속성 컨텍스트에 혹시 모를 남아 있을 데이터에 의해서 true를 반환 했다.


4 해결

  em.flush();
  em.clear();

정리하면, flush() 및 clear()를 적용하면 영속성 컨텍스트를 초기화하고, 다시 로딩되어야 할 연관 객체를 초기화된 상태로 가져올 수 있습니다. 따라서 loaded1 값이 false가 되는 것으로 예상한 대로 동작하게 됩니다.

@PersistenceUnit
EntityManagerFactory emf;
  @Test
  @DisplayName("페치조인 미적용")
  void fetchJoin_no(){
  em.flush();
  em.clear();

    Member member1 = jpaQueryFactory.selectFrom(member)
        .where(member.username.eq("member1"))
        .fetchOne();

    boolean loaded1 = emf.getPersistenceUnitUtil().isLoaded(member1.getTeam());
    assertThat(loaded1).as("페치조인 미적용").isFalse();
  }
}
profile
개발자꿈나무

0개의 댓글