카테고리 없음

TIL(2025-04-10)

dydwo6018 2025. 4. 10. 20:59

오늘은 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을 쓰면 컴파일 타임에 오류를 잡아줘서 확실히 안정감이 있다. 특히 조건문이 많을 때 유지보수하기도 훨씬 좋다.
  • 실수하고 트러블 슈팅을 적었던 경험이 있었기에 이번에 훨씬 수월하게 구현할 수 있었던 것 같다. 한 번 해본 건 역시 다르다 💪