프로젝트

18일차

사랑박 2023. 3. 9. 15:21

오늘은 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);
    }

}

모든 데이터에 대해서 검색이 이루어지지 않고 선택된 데이터에 대해서만 검색이 이루어 지도록 설정해주었다.
 

'프로젝트' 카테고리의 다른 글

20일차  (0) 2023.03.11
19일차  (0) 2023.03.10
17일차  (0) 2023.03.08
16일차  (0) 2023.03.07
15일차  (0) 2023.03.06