JPA :: QueryDsl 사용법

태그
Java
Spring
날짜
2025/03/07
2 more properties

사전 지식

JPQL

JPA 환경에서 많은 동적 값을 편하게 처리하기 위한 라이브러리

QueryDsl 이란

JPQL이 갖는 단점을 보완해주는 라이브러리
JPQL의 단점
1.
Query를 문자열로 작성한다.
오타가 생기거나 잘못된 Query를 작성해도 컴파일 단계에서 알 수 없다.
2.
동적 Query를 작성할 때 조건에 맞게 조합하며 사용한다.
Query가 복잡해지기 때문에 에러 발생을 유발한다.
QueryDsl은 Java로 작성할 수 있기 때문에 Compile 단계에서 에러를 확인할 수 있다.
복잡한 동적 Query는 QClass, Method를 활용하여 쉽게 제어할 수 있다.

사용방법

0. Dependency 추가

//QueryDsl implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api"
Java
복사

1. Config 추가

@Configuration public class config { @PersistenceContext private EntityManager entityManager; @Bean public JPAQueryFactory getQueryFactory() { return new JPAQueryFactory(entityManager); } }
Java
복사
Querydsl 패키지 안의 JPAQueryFactoryBean으로 등록한다.
JPAQueryFactory 초기화 할 땐 EntityManager 를 인자로 사용한다.
EntityManager 에 걸린 @PersistenceContextEntityManager 를 빈으로 주입해준다.
EntityManager 는 동시성 문제 때문에 Thread 간 EntityManager 를 공유해선 안된다.
@PersistenceContext 를 통해 빈으로 주입되면, 동시성 문제가 발생하지 않는다.

2. Gradle Build를 통해 QClass 생성 (Build 시 자동 생성)

/** * QUser is a Querydsl query type for User */ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QUser extends EntityPathBase<User> { private static final long serialVersionUID = -1846082033L; public static final QUser user = new QUser("user"); public final StringPath email = createString("email"); public final NumberPath<Long> id = createNumber("id", Long.class); public final StringPath name = createString("name"); public final StringPath phone = createString("phone"); public QUser(String variable) { super(User.class, forVariable(variable)); } public QUser(Path<? extends User> path) { super(path.getType(), path.getMetadata()); } public QUser(PathMetadata metadata) { super(User.class, metadata); } }
Java
복사

3. Query Method 구현

public interface PostCustomRepository { List<Post> findByUserId(long user_id); } @Repository @RequiredArgsConstructor public class PostCustomRepositoryImpl implements PostCustomRepository { private final JPAQueryFactory queryFactory; @Override public List<Post> findByUserId(long user_id) { return queryFactory.selectFrom(post) .where(post.user.id.eq(user_id)) .fetch(); } }
Java
복사
JPAQueryFactory 를 주입하여 사용한다.