반응형
250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- JPQL
- 스프링 데이터 JPA
- 자바의 정석
- 컬렉션 조회 최적화
- Spring data JPA
- fetch join
- 데이터베이스
- 그룹함수
- 데이터모델링
- JPA
- 값 타입
- 친절한 SQL 튜닝
- index
- SQL
- SQL 튜닝
- 성능최적화
- 정렬
- 스프링 컨테이너
- 오라클
- 스프링
- DTO
- 엔티티
- 페치조인
- 서브쿼리
- TCP/IP
- Spring
- @MappedSuperclass
- querydsl
- INDEX SCAN
- 페이징
Archives
- Today
- Total
nu_s
[Spring Data JPA] Web 확장 - 페이징과 정렬 🍀 본문
728x90
반응형
페이징과 정렬
예제
@GetMapping("/members")
public Page<Member> list(Pageable pageable) {
Page<Member> page = memberRepository.findAll(pageable);
return page;
}
// 테스트용 데이터
@PostConstruct
public void init() {
for (int i = 0; i < 100; i++) {
memberRepository.save(new Member("user"+i, i));
}
}
- 파라미터로 Pageable을 받을 수 있다.
- Pageable은 인터페이스이다.
- 실제로는 org.springframework.data.domain.PageRequest 객체를 생성한다.
요청 파라미터
- page : 현재 페이지, 0부터 시작한다.
- size : 한 페이지에 노출할 데이터 건수 (설정하지 않으면 20개씩 노출된다.)
- sort : 정렬 조건을 정의한다. (Ex. sort=id,desc)
기본값 설정
- 한 페이지에 노출되는 데이터 건수는 기본이 20이다.
- 이것을 10개로 변경하고 싶다면?
글로벌 설정
Application.yml
spring:
data:
web:
pageable:
default-page-size: 10 // 기본 페이지 사이즈
max-page-size: 2000 // 최대 페이지 사이즈
개별 설정
@GetMapping("/members")
public Page<Member> list(@PageableDefault(size = 10) Pageable pageable) {
return memberRepository.findAll(pageable);
}
- @PageableDefault 어노테이션을 사용한다.
- size 뿐만 아니라 page, sort, direction 등 다양한 개별 설정이 가능하다.
접두사
- 페이징 정보가 둘 이상이면 접두사로 구분한다.
- @Qualifier에 접두사명을 추가한다.
- Ex. "/members?member_page=0&order_page=1"
public String list(
@Qualifier("member") Pageable memberPageable,
@Qualifier("order") Pageable orderPageable,
...
)
Page 내용을 DTO로 변환
- 엔티티를 API로 노출하면 다양한 문제들이 발생한다.
- 그래서 반드시 엔티티를 DTO로 변환하여 반환해야 한다.
- Page는 map()을 지원해서 내부 데이터를 다른 것으로 변경할 수 있다.
MemberDto
@Data
@AllArgsConstructor
public class MemberDto {
private Long id;
private String username;
private String teamName;
public MemberDto(Member member) {
this.id = member.getId();
this.username = member.getUsername();
}
}
@GetMapping("/members")
public Page<MemberDto> list(@PageableDefault(size = 10) Pageable pageable) {
return memberRepository.findAll(pageable)
.map(MemberDto::new); // map()으로 MemberDto로 변환
}
Page를 1부터 시작하기
- 스프링 데이터는 Page를 0부터 시작한다.
- 1부터 시작하고 싶다면 두 가지 방법이 있다.
- Pageable, Page를 파라미터와 응답 값으로 사용하지 않고 직접 클래스를 만들어서 처리한다.
- 직접 PageRequest(Pageable 구현체)를 생성해서 리포지토리에 넘긴다.
- 물론 응답값도 Page 대신에 직접 만들어서 제공해야 한다.
- spring.data.web.pageable.one-indexed-parameters를 true로 설정한다.
- 이 방법은 web에서 page 파라미터를 -1 처리할 뿐이다.
- 따라서 응답값인 Page에 모두 0 페이지 인덱스를 사용하는 한계가 있다.
Application.yml
spring:
data:
web:
pageable:
one-indexed-parameters: true
- Page 객체 안에 데이터들이 잘 안맞는다.
- Ex. 파라미터로 넘긴 page는 2지만 pageNumber, number는 1이다.
출처 : 인프런 실전! 스프링 데이터 JPA
728x90
반응형
'Spring Data JPA' 카테고리의 다른 글
[Spring Data JPA] 나머지 기능들 🍀 (0) | 2024.01.06 |
---|---|
[Spring Data JPA] 스프링 데이터 JPA 분석 🍀 (0) | 2024.01.05 |
[Spring Data JPA] Web 확장 - 도메인 클래스 컨버터 🍀 (0) | 2023.12.14 |
[Spring Data JPA] Auditing 🍀 (0) | 2023.12.14 |
[Spring Data JPA] 사용자 정의 Repository 구현 🍀 (0) | 2023.12.05 |