오늘은 Part2.게시판서비스 강의의 `API 구현` 부분을 학습하였다.
API 검색 기능을 개발하기 위하여 QueryDsl을 학습하였다.
QueryDsl
QueryDsl은 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임워크이다.
QueryDsl을 사용하면 Query 생성을 자동화하여, 자바 코드로 작성할 수 있다.
QueryDsl 의존성 설정
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"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
// 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)
}
QueryDsl을 사용해서 API 검색 기능을 추가
ArticleRepository
@RepositoryRestResource
public interface ArticleCommentRepository extends JpaRepository<ArticleComment, Long> ,
QuerydslPredicateExecutor<ArticleComment>, // 검색기능
QuerydslBinderCustomizer<QArticleComment>
{
@Override
default void customize(QuerydslBindings bindings, QArticleComment root) {
bindings.excludeUnlistedProperties(true);
bindings.including(root.content, root.createdAt,root.createdBy);
bindings.bind(root.content).first(StringExpression::containsIgnoreCase);
bindings.bind(root.createdAt).first(DateTimeExpression::eq);
bindings.bind(root.createdBy).first(StringExpression::containsIgnoreCase);
}
}
ArticleCommentRepository
@RepositoryRestResource
public interface ArticleRepository extends
JpaRepository<Article, Long>,
QuerydslPredicateExecutor<Article>, // 검색기능
QuerydslBinderCustomizer<QArticle>
{
@Override
default void customize(QuerydslBindings bindings, QArticle root) {
bindings.excludeUnlistedProperties(true);
bindings.including(root.title, root.content, root.hashtag,root.createdAt,root.createdBy);
bindings.bind(root.title).first(StringExpression::containsIgnoreCase);
bindings.bind(root.content).first(StringExpression::containsIgnoreCase);
bindings.bind(root.hashtag).first(StringExpression::containsIgnoreCase);
bindings.bind(root.createdAt).first(DateTimeExpression::eq);
bindings.bind(root.createdBy).first(StringExpression::containsIgnoreCase);
}
}
모든 데이터에 대해서 검색이 이루어지지 않고 선택된 데이터에 대해서만 검색이 이루어 지도록 설정해주었다.