Spring Data JPA를 이용하는 것은 많은 양의 코드를 줄여줄 수 있다.
기존에 스프링과 Hibernate를 이용하는 것은 많은 양의 코드를 직접 작성하게 했지만 그에 비해 Spring Data JPA는 내부적으로 클래스를 생성하는 방식으로 동작하면서 코드가 없는 형식의 개발이 가능하다.
- 기존 페이징 처리와 정렬: SQL을 공부하는데 반드시 필요한 부분이다.
페이지처리는 DB마다 사용되는 기법이 달라서 별도의 학습이 가능했다.
ex) 오라클 - inline view, MySQL - limit
- JPA는 내부적으로 이러한 처리를 'Dialect'를 이용해서 처리한다.
자동으로 설정되어 있는 DB에 맞게 Dialect가 설정된다.
프로젝트 로딩 시점에 출력되는 로그를 통해 확인이 가능하다.
application.properties 등을 이용해서 설정이 가능하다.
- JPA가 이처럼 실제 DB에서 사용하는 SQL의 처리를 자동으로 하기 때문에 개발자들은 SQL이 아닌 API의 객체와 메서드를 사용하는 형태로 페이징 처리를 할 수 있게 된다.
findAll() - 페이징처리/정렬을 위한 메소드
- PagingAndSortRepository의 메소드이다.
- PagingAndSortRepository는 JpaRepository의 상위 인터페이스이다.
- findAll(Pageable pageable) 파라미터로 전달되는 Pageable타입의 객체에 의해서 실행되는 쿼리를 결정한다.
- findAll()의 리턴타입을 Page T 타입으로 지정하는 경우엔 반드시 파라미터로 Pageable 타입을 이용해야 한다.
Pageable 인터페이스 - 페이지 처리를 위한 가장 중요한 존재
- org.springframework.data.domain.Pageable 인터페이스
- Pageable 인터페이스는 페이지 처리에 필요한 정보를 전달하는 용도의 타입
- 인터페이스이기에 실제 객체 구현시엔 구현체인 org.springframework.data.domain.PageRequest 클래스를 이용한다.
- PageRequest 클래스의 생성자는 특이하게 protected로 선언되어 new를 이용할 수 없다.
- 객체 생성시 static한 of()를 이용해서 처리한다.
- PageRequest 생성자를 보면 page,size, Sort를 이용해서 객체를 생성한다.
Reference https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/PageRequest.html
static 메서드인 of()의 경우 몇 가지 형태가 존재한다.
아래의 메소드를 통해 정렬조건을 같이 지정할 수 있다.
public static PageRequest of(int page, int size)
public static PageRequest of(int page, int size, Sort sort)
public static PageRequest of(int page, int size, Sort.Direction direction,
String... properties)