✍학습 키워드
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
'개발 공부 기록 > 07. TIL' 카테고리의 다른 글
스프링 부트 핵심가이드 TIL - 8장 (유효성 검사와 예외처리) (0) | 2023.10.11 |
---|---|
스프링 부트 핵심가이드 TIL - 7장 (연관관계매핑) (0) | 2023.10.10 |
스프링 부트 핵심가이드 TIL - 5장 (테스트 코드 작성하기) (0) | 2023.10.07 |
스프링 부트 핵심가이드 TIL - 4장 (ORM) (0) | 2023.09.29 |
스프링 부트 핵심가이드 TIL - 3장 (기본 API 개발) (0) | 2023.09.29 |