JpaRepositoryJpaRepository를 통해 데이터베이스 작업을 추상화합니다. JpaRepository는 기본적인 CRUD 기능을 제공하며, 이 인터페이스를 확장한 리포지토리 빈은 스프링 컨테이너가 자동으로 관리하고 EntityManager를 내부적으로 사용합니다.EntityManager 주입: JpaRepository를 사용할 때, EntityManager는 스프링이 자동으로 주입해줍니다. 즉, EntityManager를 명시적으로 주입받거나 빈으로 등록할 필요가 없습니다. 스프링이 애플리케이션 컨텍스트에서 EntityManager를 관리하며, 이를 JpaRepository 내부에서 사용합니다.JPAQueryFactoryJpaRepository처럼 스프링에서 자동으로 관리되는 추상화된 객체가 아닙니다. QueryDSL을 사용하기 위해서는 JPAQueryFactory를 직접 생성해야 하며, 이를 위해 EntityManager가 필요합니다.EntityManager 주입: JPAQueryFactory는 스프링이 자동으로 관리하는 빈이 아니기 때문에, 이를 빈으로 등록할 때 EntityManager를 주입받아야 합니다. 따라서 QuerydslConfig 클래스에서 EntityManager를 주입받고, 이를 사용해 JPAQueryFactory를 빈으로 등록하는 것입니다.JpaRepository는 스프링이 자동으로 관리하는 빈이며, 스프링이 내부적으로 EntityManager를 주입하여 사용합니다. 개발자가 따로 EntityManager를 관리할 필요가 없습니다.JPAQueryFactory는 스프링이 자동으로 관리하지 않으므로, QueryDSL을 사용할 때는 직접 빈으로 등록해야 합니다. 이때, EntityManager를 주입받아 JPAQueryFactory를 생성합니다.EntityManager 주입 방법: @Configuration 클래스에서 EntityManager를 @PersistenceContext나 생성자 주입을 통해 주입받고, 이를 사용해 JPAQueryFactory를 빈으로 등록합니다.@Configuration
@RequiredArgsConstructor
public class QuerydslConfig {
private final EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
위와 같이 설정하면, EntityManager는 스프링이 자동으로 관리하므로, 생성자 주입을 통해 받아올 수 있고, JPAQueryFactory는 빈으로 직접 등록하여 스프링 컨텍스트에서 사용할 수 있게 됩니다.
이것이 스프링이 내부적으로 EntityManager를 자동으로 관리하는 이유와 QueryDSL을 사용할 때 JPAQueryFactory를 직접 설정해야 하는 이유입니다.