Querydsl 생성 후 EntityManager 를 통해 쿼리 결과를 반환할 수 있도록 JPAQueryFactory를 선언한다.
선언 방식은 3가지가 있다.
1.클래스 내부에 선언
@PersistenceContext
EntityManager em;
public void ex(){
...
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
...
}
2.필드 선언
@PersistenceContext
EntityManager em;
JPAQueryFactory queryFactory;
public void ex(){
queryFactory. ~~~~
}
JPAQueryFactory를 필드로 제공하면 동시성 문제는 어떻게 될까? 동시성 문제는 JPAQueryFactory를 생성할 때 제공하는 EntityManager(em)에 달려있다. 스프링 프레임워크는 여러 쓰레드에서 동시에 같은 EntityManager에 접근해도, 트랜잭션 마다 별도의 영속성 컨텍스트를 제공하기 때문에, 동시성 문제는 걱정하지 않아도 된다
3.Config 선언
@Configuration
public class QuerydslConfiguration {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
@Autowired
JPAQueryFactory queryFactory;
이렇게 Configuration 구현체를 만들어서 빈을 주입해놓고 사용하는 클래스에서 @Autowired로 빈을 땡겨와서 사용할 수 있다.