사전 지식
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 패키지 안의 JPAQueryFactory를 Bean으로 등록한다.
•
JPAQueryFactory 초기화 할 땐 EntityManager 를 인자로 사용한다.
•
EntityManager 에 걸린 @PersistenceContext 는 EntityManager 를 빈으로 주입해준다.
◦
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 를 주입하여 사용한다.