What to do?
API 개발 #2
부분 검색기능 구현하기
게시글(Article)을 검색하는 경우를 생각해보자.
게시글의 제목을 통해 검색을 하는데, 제목을 정확히 알고 하는 경우는 드물다.
보통은 부분 검색을 통해서 검색을 한다.
Querydsl을 사용해서 부분검색 기능을 만들어보자
Querydsl 설정
build.gralde 파일을 다음과 같이 수정해주자
- Querydsl 의존성 추가
- Q Class 파일 생성 경로 지정
- Querydsl을 사용하면 빌드 시에 Q class를 생성한다.
- 예를 들어 Article이라는 Entity가 있으면 QArticle이라는 Q class를 자동을 생성한다.
dependencies {
...
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"
}
# Q class파일 생성 경로 지정
def generated = 'src/main/generated'
tasks.withType(JavaCompile) {
options.getGeneratedSourceOutputDirectory().set(file(generated))
}
sourceSets {
main.java.srcDirs += [ generated ]
}
# build clean할 때 Q class도 삭제
clean {
delete file(generated)
}
Repository 코드 수정
- ArticleRepostiory
@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.hashtags, root.createdAt, root.createdBy);
// 검색 옵션
// 제목 - 대소문자 무시, 부분검색
bindings.bind(root.title).first(StringExpression::containsIgnoreCase);
// 해쉬태그 - 대소문자 무시, 부분검색
bindings.bind(root.hashtags).first(StringExpression::containsIgnoreCase);
// 생성일시 - Exact match
bindings.bind(root.createdAt).first(DateTimeExpression::eq);
// 작성자 - 대소문자 무시, 부분검색
bindings.bind(root.createdBy).first(StringExpression::containsIgnoreCase);
}
}
- CommentRepository
@RepositoryRestResource
public interface CommentRepository extends
JpaRepository<Comment, Long>,
QuerydslPredicateExecutor<Comment>,
QuerydslBinderCustomizer<QComment>
{
@Override
default void customize(QuerydslBindings bindings, QComment root){
// 검색기능을 부여할 필드 설정
bindings.excludeUnlistedProperties(true);
bindings.including(root.content, root.createdBy);
// 검색 옵션
// 댓글, 작성자 - 대소문자 무시, 부분검색
bindings.bind(root.content).first(StringExpression::containsIgnoreCase);
bindings.bind(root.createdBy).first(StringExpression::containsIgnoreCase);
}
}
Test해보기
hal explorer를 열어서 테스트 해보았다.
제목에 sbellingham 이 포함된 게시글을 검색하였다.
그러자 제목이 sbellingham16 인 게시글이 조회된걸 확인할 수 있다.
부분 검색이 잘 동작하는걸 확인했다.
'Java > Spring' 카테고리의 다른 글
[Spring] 게시판 만들기 #6 (0) | 2022.11.21 |
---|---|
[Spring] 게시판 만들기 #5 (0) | 2022.11.14 |
[Spring] 게시판 만들기 #3 (0) | 2022.11.13 |
[Spring] 게시판 만들기 #2 (0) | 2022.11.13 |
[Tableau] Plot #2 (0) | 2022.11.10 |