SPRING

[SPRING] JPAQueryFactory

도원좀비 2025. 3. 30. 21:02

1️⃣ JPAQueryFactory란?

  • QueryDSL의 쿼리 생성과 실행을 담당하는 핵심 클래스
  • EntityManager를 활용하여 JPQL 쿼리 작성 및 실행

2️⃣ JPAQueryFactory 빈 등록하기

@Configuration
public class QuerydslConfig {
    @PersistenceContext
    private EntityManager em;

    @Bean
    public JPAQueryFactory queryFactory() {
        return new JPAQueryFactory(em);
    }
}

3️⃣ 실무에서 권장하는 JPAQueryFactory 활용 방법

JpaRepository(기본 CRUD 제공)와 JPAQueryFactory(복잡한 쿼리 처리)의 조합

public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom {}

public interface UserRepositoryCustom {
    List<User> findDynamic(String name, Integer age);
}

@Repository
public class UserRepositoryCustomImpl implements UserRepositoryCustom {

    private final JPAQueryFactory queryFactory;

    public UserRepositoryCustomImpl(JPAQueryFactory queryFactory) {
        this.queryFactory = queryFactory;
    }

    @Override
    public List<User> findDynamic(String name, Integer age) {
        BooleanBuilder builder = new BooleanBuilder();
        if(name != null) builder.and(QUser.user.name.eq(name));
        if(age != null) builder.and(QUser.user.age.goe(age));

        return queryFactory.selectFrom(QUser.user)
                           .where(builder)
                           .fetch();
    }
}

4️⃣ JpaRepository와 JPAQueryFactory를 함께 사용할 때의 장점

  • 기본 CRUD는 JpaRepository에서 편리하게 관리
  • 복잡한 쿼리는 JPAQueryFactory로 관리하여 가독성과 유지보수성 향상
  • 인터페이스 다중 상속은 스프링에서 자동 관리되어 문제없음

'SPRING' 카테고리의 다른 글

[SPRING] Spring Security + JWT 인증 예외 처리 흐름  (1) 2025.04.01
[SPRING] JWT  (2) 2025.04.01
[SPRING] QueryDSL  (1) 2025.03.30
[SPRING] 동적 쿼리  (1) 2025.03.30
[SPRING BOOT + JPA] 일정 관리 앱 회고  (2) 2025.03.28