오늘은 QueryDSL을 활용해서 리뷰 검색 기능을 구현했다.
🔧 1. QueryDSL 설정
build.gradle 설정
plugins {
id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}
dependencies {
implementation 'com.querydsl:querydsl-jpa'
annotationProcessor 'com.querydsl:querydsl-apt'
annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
}
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
compileJava {
options.annotationProcessorPath = configurations.annotationProcessor
}
✅ 엔티티에 @QueryEntity 추가
@QueryEntity
@Entity
public class Review {
...
}
이후 ./gradlew clean build 또는 IntelliJ의 Gradle → build 실행을 통해 Q파일 생성 완료!
🔍 2. 검색 기능 구현
ReviewRepositoryCustom 인터페이스 생성
public interface ReviewRepositoryCustom {
List<Review> searchByCondition(String keyword);
}
ReviewRepositoryImpl 구현
public class ReviewRepositoryImpl implements ReviewRepositoryCustom {
private final JPAQueryFactory queryFactory;
public ReviewRepositoryImpl(EntityManager em) {
this.queryFactory = new JPAQueryFactory(em);
}
@Override
public List<Review> searchByCondition(String keyword) {
QReview review = QReview.review;
return queryFactory
.selectFrom(review)
.where(review.title.containsIgnoreCase(keyword)
.or(review.content.containsIgnoreCase(keyword)))
.fetch();
}
}
✨ 느낀 점
- 지난 프로젝트에서는 Q파일 생성도 제대로 못 해서 설정에 시간을 엄청 잡아먹었는데, 이번에는 구조부터 명확히 이해하고 접근해서 막힘 없이 빠르게 구현할 수 있었다.
- QueryDSL을 쓰면 컴파일 타임에 오류를 잡아줘서 확실히 안정감이 있다. 특히 조건문이 많을 때 유지보수하기도 훨씬 좋다.
- 실수하고 트러블 슈팅을 적었던 경험이 있었기에 이번에 훨씬 수월하게 구현할 수 있었던 것 같다. 한 번 해본 건 역시 다르다 💪