API 구현

ttaho·2023년 2월 22일
0

Project-board

목록 보기
6/16

검색 API 구현을 위해 Querydsl을 사용하자.

Querydsl이란?

Querydsl은 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임 워크이다.
실제로 Query를 사람이 짜다보면 수많은 쿼리를 수작업으로 생성해야하므로 컴파일 단계에서 오류가 있는지 알 수 없다.
Querydsl을 사용하여 Query 생성을 자동화 할 수 있다.

build.gradle에 관련사항을 추가해준다.

  • dependencies에 추가
// 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로 해주는게 적절하다.

  • excludeUnlistedProperties
    QuerydslPredicateExecutor에 의해서 Article의 모든 필드들에대한 검색이 열려있는데, 해당 메소드에서 true로 설정해주면 선택적으로 검색을 열어준다.
  • including
    원하는 필드를 추가하면 해당필드의 검색을 허용한다.
  • bind
    exact 검색을 풀 필드들을 설정해준다.
  • first
    검색 파라미터를 하나만 받는다. 문자열은 StringExpression, 시간은 DateTimeExpression으로 하고, containsIgnoreCase는 대소문자 구분을 하지않는 설정이다.

결과확인

댓글 중에 작성자가 Lind인 사람 검색결과 1개의 댓글이 나왔다.

댓글 중에 작성자에 L이 들어가있는 사람 검색결과 여러개가 나오고 대소문자 구분이 안되는것을 볼 수 있다.

profile
백엔드 꿈나무

0개의 댓글