지금 까지 배운 QueryDsl을 Repository에서 사용하기 위해서는 Respository에 JPAQueryFactory 를 주입해주어야한다. 주입하는 방법은 2가지가 있다.
생성자 주입으로 JPAQueryFactory를 주입해주자! 매개변수는 EntityManager 만 있어도 된다.
//순수 jpa 레퍼지토리
@Repository
public class MemberJpaRepository {
private EntityManager em;
private final JPAQueryFactory queryFactory;
public MemberJpaRepository(EntityManager em) {
this.em = em;
this.queryFactory = new JPAQueryFactory(em);
}
- 프로젝트의 메인 어플리케이션에 스프링 빈으로 등록해주자
@SpringBootApplication
public class JpadataApplication {
public static void main(String[] args) {
SpringApplication.run(JpadataApplication.class, args);
}
@Bean
JPAQueryFactory jpaQueryFactory(EntityManager em) {
return new JPAQueryFactory(em);
}
}
- @RequiredArgsConstructor를 사용하여 주입해주자!
//순수 jpa 레퍼지토리
@Repository
@RequiredArgsConstructor
public class MemberJpaRepository {
private EntityManager em;
private final JPAQueryFactory queryFactory; // 메인application에 bean 으로 등록
참고: 동시성 문제는 걱정하지 않아도 된다. 왜냐하면 여기서 스프링이 주입해주는 엔티티 매니저는 실제동작 시점에 진짜 엔티티 매니저를 찾아주는 프록시용 가짜 엔티티 매니저이다. 이 가짜 엔티티 매니저는 실제 사용 시점에 트랜잭션 단위로 실제 엔티티 매니저(영속성 컨텍스트)를 할당해준다.