JpaRepository
JpaRepository
를 통해 데이터베이스 작업을 추상화합니다. JpaRepository
는 기본적인 CRUD 기능을 제공하며, 이 인터페이스를 확장한 리포지토리 빈은 스프링 컨테이너가 자동으로 관리하고 EntityManager
를 내부적으로 사용합니다.EntityManager
주입: JpaRepository
를 사용할 때, EntityManager
는 스프링이 자동으로 주입해줍니다. 즉, EntityManager
를 명시적으로 주입받거나 빈으로 등록할 필요가 없습니다. 스프링이 애플리케이션 컨텍스트에서 EntityManager
를 관리하며, 이를 JpaRepository
내부에서 사용합니다.JPAQueryFactory
JpaRepository
처럼 스프링에서 자동으로 관리되는 추상화된 객체가 아닙니다. 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
를 직접 설정해야 하는 이유입니다.