moon
sun

JPA :: QueryDsl 사용법

태그
Java
Spring
3 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 패키지 안의 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 를 주입하여 사용한다.