일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Token
- diary
- 변수의 다양성
- 클래스
- TiL_1st_0419
- 내일배움캠프
- 해우소
- Git
- 감사기록
- JVM
- 스레드
- Github_token
- 스파르타내일배움캠프TIL
- #스파르타내일배움캠프TIL
- GitHub
- 포맷은 최후의 보루
- 생성자
- Java
- 성장기록
- KPT
- static
- #스파르타내일배움캠프
- Diary 해우소
- 스파르타내일배움캠프
- 인스턴스
- #내일배움캠프
- 객체지향 언어
- 메서드
- 회고록
- Java의 이점
- Today
- Total
몬그로이
페이징 본문
PagingAndSortingRepository : 여기에서 페이징 & 소팅 기능을 제공
페이징 처리 프로세스
- PageRequest 를 사용하여 Pageable에 페이징 정보를 담아 객체화 한다.
- Pageable을 JpaRepository가 상속된 인터페이스의 메서드에 T(Entity)와 함꼐 파라미터로 전달한다.
- 2번의 메서드의 return 으로 Page<T>가 응답 된다.
- 응답된 Page<T>에 담겨진 Page 정보를 바탕으로 로직을 처리하면 된다
Pageable 객체 생성을 위한 메서드 정의
*PageRequest 객체에 만들고, service 단에서 사용한다
PageRequest.of(int page, int size) : 0부터 시작하는 페이지 번호와 개수. 정렬이 지정되지 않음
PageRequest.of(int page, int size, Sort sort) : 페이지 번호와 개수, 정렬 관련 정보
PageRequest.of(int page int size, Sort sort, Direction direction, String ... props) : 0부터 시작하는 페이지 번호와 개수, 정렬의 방향과 정렬 기준 필드들
Pageable 메서드 정의
pageable.getTotalPages() : 총 페이지 수
pageable.getTotalElements() : 전체 Data 개수
pageable.getNumber() : 현재 페이지 번호
pageable.getSize() : 페이지 당 데이터 개수
pageable.hasnext() : 다음 페이지 존재 여부
pageable.isFirst() : 시작페이지 여부
pageable.hasPrevious() : 이전 페이지 존재 여부
pageable.isLastPage() : 마지막 페이지 여부
pageable.nextPageable() : 다음 페이지 객체
pageable.previousPageable() : 이전 페이지 객체
pageable.getSort() : 검색시 사용된 Sort 정보
pageable.getContent(), PageRequest.get() :
실제 컨텐츠를 가지고 오는 메서드. getContent는 List<Entity>, get()은 Stream<Entity> 반환
페이지 반환 타입
Page<T> 타입
- 게시판 형태의 페이징에서 사용된다.
- 전체 요소 갯수도 함께 조회한다. (totalElements)
Slice<T> 타입
- 더보기 형태의 페이징에서 사용된다.
- 전체 요소 갯수 대신 offset 필드로 조회할 수 있다.
따라서 count 쿼리가 발생되지 않고 limit+1 조회를 한다. (offset 은 성능이 안좋아서 현업에서 안씁니다)
List<T> 타입
- 전체 목록보기 형태의 페이징에서 사용된다.
- 기본 타입으로 count 조회가 발생하지 않는다.
정렬하기
컬럼 값으로 정렬하기 : Sort 클래스를 사용
Sort sort1 = Sort.by("name").descending(); // 내림차순
Sort sort2 = Sort.by("password").ascending(); // 오름차순
Sort sortAll = sort1.and(sort2); // 2개이상 다중정렬도 가능하다
Pageable pageable = PageRequest.of(0, 10, sortAll); // pageable 생성시 추가
컬럼이 아닌값으로 정렬하기 : @Query 사용
Alias(쿼리에서 as 로 지정한 문구) 를 기준으로 정렬할 수 있다
// 아래와 같이 AS user_password 로 Alias(AS) 를 걸어주면
@Query("SELECT u.user_name, u.password AS user_password FROM user u WHERE u.username = ?1")
List<User> findByUsername(String username, Sort sort);
// 이렇게 해당 user_password 를 기준으로 정렬할 수 있다.
List<User> users = findByUsername("user", Sort.by("user_password"));
SQL 함수를 사용해서 정렬하기 : JpaSort 를 사용해서 쿼리 함수를 기준으로 정렬
// 아래와 같이 일반적인 쿼리에서
@Query("SELECT u FROM user u WHERE u.username = ?1") // 이건 없어도됨
List<User> findByUsername(String username, Sort sort);
// 이렇게 쿼리함수 LENGTH() 조건을 걸어서 password 문자길이 기준으로 정렬할 수 있다.
List<User> users = findByUsername("user", JpaSort.unsafe("LENGTH(password)"));
'Organizing Docs > Java Docs' 카테고리의 다른 글
ORM (0) | 2024.06.28 |
---|---|
Spring Data JPA (0) | 2024.06.28 |
MyBatis (0) | 2024.06.27 |
데이터베이스Driver >> JDBCTemplate (0) | 2024.06.26 |
자바의 정석 6. 객체지향 프로그래밍1 (1) | 2024.06.19 |