검색 API 구현을 위해 Querydsl을 사용하자.
Querydsl은 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임 워크이다.
실제로 Query를 사람이 짜다보면 수많은 쿼리를 수작업으로 생성해야하므로 컴파일 단계에서 오류가 있는지 알 수 없다.
Querydsl을 사용하여 Query 생성을 자동화 할 수 있다.
build.gradle에 관련사항을 추가해준다.
// queryDSL 설정
implementation "com.querydsl:querydsl-jpa"
implementation "com.querydsl:querydsl-core"
implementation "com.querydsl:querydsl-collections"
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정
annotationProcessor "jakarta.annotation:jakarta.annotation-api" // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드
annotationProcessor "jakarta.persistence:jakarta.persistence-api" // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드
// Querydsl 설정부
def generated = 'src/main/generated'
// querydsl QClass 파일 생성 위치를 지정
tasks.withType(JavaCompile) {
options.getGeneratedSourceOutputDirectory().set(file(generated))
}
// java source set 에 querydsl QClass 위치 추가
sourceSets {
main.java.srcDirs += [ generated ]
}
// gradle clean 시에 QClass 디렉토리 삭제
clean {
delete file(generated)
}
추가 후, build 시켜주면 generated에 Qclass들이 추가된다.
이제 인터페이스들에 querydsl을 extend시켜주자.
ArticleRepository에 ''QuerydslPredicateExecutor"을 추가시켜준다.
해당 기능으로 title이 'Quisque ut erat.'인 게시글을 찾으면 1개의 게시글을 뱉는다.
하지만, 해당기능으로는 대소문자 구분이 불가능하고, 일부검색도 불가능하다.
가능하게 QuerydslBinderCustomizer 기능으로 커스터마이징 구현해보자.
ctrl + O로 customize 메소드를 만들어준다.
default 메소드를 만들어준 이유는
현재 spring data jpa를 이용해서 인터페이스만 가지고 기능을 사용하게끔 접근하고 있으므로 여기서 메소드를 사용하려면 default로 해주는게 적절하다.
댓글 중에 작성자가 Lind인 사람 검색결과 1개의 댓글이 나왔다.
댓글 중에 작성자에 L이 들어가있는 사람 검색결과 여러개가 나오고 대소문자 구분이 안되는것을 볼 수 있다.