SpringData 쿼리와 QueryDSL

more·2023년 7월 27일
0

JPA 심화 2일차

목록 보기
2/5

SpringData 쿼리

기능

  • SprintData Common 의 CRUDRepository + PagingAndSortingRepository 이 쿼리기능을 제공

사용 방법

접두어Find, Get, Query, Count, ...
도입부Distinct, First(N), Top(N)
프로퍼티 표현식Person.Address.ZipCode => find(Person)ByAddress_ZipCode(...)
조건식IgnoreCase, Between, LessThan, GreaterThan, Like, Contains, ...
정렬 조건OrderBy{프로퍼티}Asc
리턴 타입E, Optional, List, Page, Slice, Stream
매개변수Pageable, Sort
  • 예시 코드
// 기본 -> name과 password로 해당 user 찾아오기
List<User> findByNameAndPassword(String name, String password);

// distinct (중복제거)
// name이나 password로 해당 유저 찾아오기 + 중복 제거
List<User> findDistinctUserByNameOrPassword(String name, String password);
List<User> findUserDistinctByNameOrPassword(String name, String password);

// ignoring case (대소문자 무시)
// name 대소문자 구분하지 말고 user 찾기
List<User> findByNameIgnoreCase(String name);
// name과 password 대소문자 구분하지 말고 user 찾기
List<User> findByNameAndPasswordAllIgnoreCase(String name, String password);

// 정렬
// name으로 찾아오되 name의 오름차순으로 찾아오기
List<Person> findByNameOrderByNameAsc(String name);
// name으로 찾아오되 name의 내람차순으로 찾아오기
List<Person> findByNameOrderByNameDesc(String name);

// 페이징
Page<User> findByName(String name, Pageable pageable);  // Page 는 카운트쿼리 수행됨
Slice<User> findByName(String name, Pageable pageable); // Slice 는 카운트쿼리 수행안됨
List<User> findByName(String name, Sort sort);
List<User> findByName(String name, Pageable pageable);

// 스트림 (stream 다쓴후 자원 해제 해줘야하므로 try with resource 사용추천)
Stream<User> readAllByNameNotNull();

QueryDSL

기능

  • QueryDSL의 Predicate 인터페이스로 조건문을 여러개를 구성하여 따로 관리
    • findOne(Predicate), findAll(Predicate) 주로 이 2개 메소드가 사용된다.
      • findOne = Optional 리턴
      • findAll = List | Page | Iterable | Slice 리턴
  • Type Safe 기능
    • 조건문 구성시에 사용되는 객체, 필드 조건이 실제 타입과 일치한지 체크해준다.

장점

  1. 문자가 아닌 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 오류를 쉽게 확인할 수 있다.
  2. 자동 완성 등 IDE의 도움을 받을 수 있다.
  3. 동적인 쿼리 작성이 편리하다.
  4. 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다.

원리

  • QueryDSL 의존성을 추가하면 SpringData에 의해 QueryDslPredicateExecutor 인터페이스가 추가된다.
    • QueryDslPredicateExecutor 는 Repository가 QueryDsl 을 실행할 수 있는 인터페이스를 제공하는 역할을 합니다.

사용 방법

  • Spring 3.X 버전 (이전 버전은 QueryDSL 빌드 Task 를 따로 설정해주어야함)

    // application.yml
    
    dependencies {
            ....
    
            // 9. QueryDSL 적용을 위한 의존성 (SpringBoot3.0 부터는 jakarta 사용해야함)
        implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
        annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
        annotationProcessor "jakarta.annotation:jakarta.annotation-api"
        annotationProcessor "jakarta.persistence:jakarta.persistence-api"
    }
profile
조금 더

0개의 댓글