개발 공부 기록/07. TIL

스프링 부트 핵심가이드 TIL - 6장 (Spring Data JPA 활용하기)

박세류 2023. 10. 9. 11:00

✍학습 키워드

Spring Data JPA 활용하기

JPQL

  • JPQL은 JPA Query Language의 줄임말로 JPA에서 사용할 수 있는 쿼리를 의미한다.
  • JPQL의 문법은 SQL과 매우 비슷하다.
  • SQL과의 차이점은 테이블이나 칼럼의 이름을 사용하는 것이 아니라 엔티티 객체를 대상으로 수행하는 쿼리이기 때문에 매핑된 엔티티의 이름과 필드의 이름을 사용한다.

@Query 어노테이션 사용하기

  • 데이터베이스에서 값을 가져올 때는 JPA와 같이 메서드의 이름만으로 쿼리 메서드를 생성 할 수도 있고 @Query 어노테이션을 사용해 직접 JPQL을 사용할 수도 있다.
  • JPQL을 사용하면 JPA 구현체에서 자동으로 쿼리 문장을 해석하고 실행하게 됩니다.
    • 주로 튜닝된 쿼리를 사용하고자 할때 직접 SQL을 작성한다.
    @Query("SELECT p FROM Product AS p WHERE p.name = ?1")List<Product> findByName(String name);
    • 위는 가장 기본적인 JPQL 방식이나, 오류가 발생할 가능성이 있어 @Param 어노테이션을 사용하는 것이 좋다.

QueryDSL 적용하기

  • 쿼리의 문자열이 잘못된 경우 애플리케이션 실행 후 로직이 실행되고 나서야 오류를 발견할 수 있지만, 이 같은 문제를 해결하기 위해 사용되는 것이 QueryDSL이다. 코드로 쿼리를 작성할 수 있도록 도와준다.
  • 정적 타입을 이용해 SQL과 같은 쿼리를 생성할 수 있도록 지원하는 프레임워크이다.
    • 문법 적으로 잘못된 쿼리를 허용하지 않으며, 동적 쿼리를 생성할 수 있는 장점이있다.
    • APT는 어노테이션으로 정의된 코드를 기반으로 새로운 코드를 생성하는 기능이다.
  • QueryDSL은 작성한 엔티티 클래스와 Q도메인이라는 쿼리 타입의 클래스를 자체적으로 생성해서 메타데이터로 사용한다.
  • QueryDSL을 비지니스 로직에서 활용하기 위해선 JPAQueryFactory를 @Bean 객체로 등록하여 가져다 쓸 수 있다.

QuerydslPredicateExecutor 인터페이스

  • JpaRepository와 함께 리포지토리에서 QueryDSL을 사용할 수 있는 인터페이스

QuerydslRepositorySupport 클래스

  • QueryDSL 라이브러리를 사용하는 데 유용한 기능을 제공한다.

📝새로 배운 개념

쿼리 메서드

리포지토리는 JpaRepository를 상속받는 것만으로도 다양한 CRUD 메서드를 제공한다. 주제와 서술어로 구분하며 주요 키워드는 다음과 같다.

  • find…By
  • exists…By
    • 특정 데이터가 존재하는지 확인하는 키워드. 리턴 타입으로는 boolean 타입 사용한다.
  • count…By
    • 조회 쿼리를 수행한 후 쿼리 결과로 나온 레코드 개수 리턴한다.
  • delete…By, remove…By
    • 삭제 쿼리를 수행한다. 리턴 타입이 없거나 삭제한 횟수를 리턴한다.
  • First.., Top..
    • 쿼리를 통해 조회된 결괏값의 갯수를 제한하는 키워드 단 건으로 조회하기 위해서는 를 생략하면 된다.

쿼리 메서드의 조건자 키워드

JPQL의 서술어 부분에서 사용하는 조건자 키워드이다

  • ls
    • 값의 일치를 조건으로 사용하는 조건자 키워드. Equals와 동일한 기능을 수행한다.
  • Is(Not)
    • 값의 불일치를 조건으로 사용하는 조건자 키워드이다. Is는 생략하고 Not 키워드만 사용할 수도 있다.
  • (Is)Null, (ls)NotNull
    • 값이 null인지 검사하는 조건자 키워드이다.
  • (Is)True, (Is)False
    • boolean 타입으로 지정된 컬럼값을 확인하는 키워드이다.
  • And, Or
    • 여러 조건을 묶을때 사용한다.
  • (Is)GreaterThan, (Is)LessThan, (Is)Between
    • 숫자나 datetime 칼럼을 대상으로 한 비교 연산에 사용할 수 있는 조건자 키워드이다. GreaterThan, LessThan 키워드는 비교 대상에 대한 초과/미만의 개념으로 비교 연산을 수행하고, 경곗값을 포함하려면 Equal 키워드를 추가하면 된다.
  • (Is)StartingWith(==StartsWith), (Is)EndingWith(==EndsWith), (Is)Containing(==Contains), (Is)Like
    • 칼럼값에서 일부 일치 여부를 확인하는 조건자 키워드입니다. sql 쿼리문에서 ‘%’와 비슷한 역할

정렬과 페이징 처리

정렬 처리하기

  • List findByNameOrderByNumberAsc(String name); 이거거나
  • List findByName(String name, Sort sort); 이렇게도 쓰인다

페이징 처리

  • 페이징이란 데이터베이스의 레코드를 개수로 나눠 페이지를 구분하는 것을 의미하며, JPA 에서는 이와 같은 페이징 처리를 위해 Page와 Pageable을 사용한다.
    • Page findByName(String name, Pageable pageable);
    • 해당 메서드는 Page productPage = productRepository.findByName(”펜”, PageRequest.of(0, 2)); 위와같이 호출한다
    • ⇒ PageRequest는 Pageable의 구현체이다.

PageRequest의 메소드 of

  • of(int page, int size) ⇒ 페이지 번호, 페이지당 데이터 개수 (데이터 정렬 X)
  • of(int page, int size, Sort) ⇒ 페이지 번호, 페이지당 데이터 개수, 정렬 (sort에 의한)
  • of(int page, int size, Driection, String … properties) ⇒ 페이지 번호, 페이지당 데이터 개수, 정렬 방향, 속성(칼럼) Sort.by에 의한 정렬

728x90