QueryDSL이란

아빠는 외계연·2022년 8월 30일
0
post-thumbnail

QueryDSL이란

  • 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해주는 프레임워크
  • SQL, JPQL을 코드로 작성할 수 있게끔 도와주는 오픈소스 빌더 API

사용 목적

  • String방식의 쿼리문을 작성할 시 생기는 문법 오류들을 예방해줌
  • IDE의 코드 자동완성 기능을 사용
  • 동적 쿼리를 만들기 쉽다
  • 리펙토링에 용이하다 -> 코드를 분석하기 용이

의존성 설정(build.gradle)

plugins {
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

dependencies {
	implementation 'com.querydsl:querydsl-jpa'
}

def querydslDir = "$buildDir/generated/querydsl"

querydsl {
	jpa = true
	querydslSourcesDir = querydslDir
}

sourceSets {
	main.java.srcDir querydslDir
}

configurations {
	querydsl.extendsFrom compileClasspath
}

compileQuerydsl {
	options.annotationProcessorPath = configurations.querydsl
}

컴파일 이후 gradle-> 프로젝트 파일 -> Tasks -> other-> compileQuerydsl을 두 번 클릭 시 build -> generated -> querydls파일이 생성됨

QueryDSL방식

1. JPAQuery객체 이용

  • 엔티티 매니저를 활용해 생성
  • 빌더 형식으로 쿼리를 작성

메서드

  • List fetch() : 조회 결과를 리스트로 반환
  • T fetchOne() : 단 건의 조회 결과를 반환
  • T fetchFirst() : 여러 건의 조회 결과 중 1건을 반환
  • Long fetchCount() : 조회 결과의 개수를 반환
  • QueryResult fetchResults() : 조회 결과 리스트와 개수를 포함한 QueryResults를 반환

2. JPAQueryFactory

3. 인터페이스 이용

QuerydslPredicateExecutor

  • repository에 상속받아서 사용한다.
  • Predicate 타입을 매개변수로 받는다
    • Predicate : 표현식을 작성할 수 있게 QueryDSL에서 제공하는 인터페이스
@Autowired
AccountRepository accountRepository;
public void crud() {
  	QAccount account = QAccount.account;
  	Predicate predicate = account
  						.firstName.containsIgnoreCase("name")
  						.and(account.lastName.startsWith("kim"));
  	Optional<Account> one = accountRepository.findOne(predicate);
메서드
  • Optional findById(Predicate predicate) : Predicate에 매칭되는 하나의 entity를 반환
  • Iterable findAll(Predicate predicate) : Predicate에 매칭되는 모든 Entitiy를 반환
  • long count(Predicate predicate) : Predicate에 매칭되는 Entity의 수를 반환
  • boolean exists(Predicate predicate) : Predicate에 매칭되는 결과가 있는지 여부를 반환

QuerydslRepositorySupport 클래스 -> Spring Data JPA에서 제공

  • QueryDSL 사용을 support해주는 추상클래스
  • CustomRepository를 활용해 리포지토리를 구현 -> 구현해주는 클래스 따로 존재
기본 적용법
public class Repository extends QuerydslRepositorySupport{
  	public Repository() {
  		super(Member.class);
  	}
}
원리
  1. 기본 Repository는 Spring data JPA와 Custom Repository상속
  2. Custom Repository Impl은 QuerydslRepositorySupport를 상속
    -> Repository를 DI하는 것만으로도 Spring data JPA와 QueryDSL문법을 동시에 사용 가능
profile
Backend Developer

0개의 댓글