본문 바로가기
Java/ORM

JAVA ORM - Spring Data JPA(웹 페이징,정렬)

by 티코딩 2024. 8. 27.

https://thcoding.tistory.com/264

 

JAVA ORM - Spring Data JPA(페이징, 슬라이스, countQuery)

페이징(Paging)페이징은 데이터를 페이지단위로 나눠 가져오는 기술. Spring data Jpa에서는 'pageable'인터페이스와 'Page' 객체를 사용해 페이징을 처리한다.public interface UserRepository extends JpaRepository { Pag

thcoding.tistory.com

 

저번 페이징 처리에 이어서 웹에서 편리하게 사용할 수 있도록 spring data jpa가 제공해주는 페이징,정렬방법에 대해 알아보자.

1. 먼저 컨트롤러에 아래와같이 member를 100명 만들어주도록 하자.

@PostConstruct
    public void init() {
        for(int i = 0; i < 100; i++){
            memberRepository.save(new Member("user" + i, i));
            }
    }

 

2. 그다음 컨트롤러에 list라는 메서드를 만들어주자.

@GetMapping("/members")
    public Page<Member> list(Pageable pageable) {
     Page<Member> page = memberRepository.findAll(pageable);
     return page;
    }

저번포스팅에서 썼던 Pageable 객체를 사용한다.

이렇게 했을때, members api로 요청을 보내면 어떻게 응답이 올까?

"content": [
        {
            "createdDate": "2024-08-27T22:55:15.832833",
            "updatedDate": "2024-08-27T22:55:15.832833",
            "id": 1,
            "age": 0,
            "username": "user0",
            "team": null
        },
        {
            "createdDate": "2024-08-27T22:55:15.846281",
            "updatedDate": "2024-08-27T22:55:15.846281",
            "id": 2,
            "age": 1,
            "username": "user1",
            "team": null
        },
        {
            "createdDate": "2024-08-27T22:55:15.847625",
            "updatedDate": "2024-08-27T22:55:15.847625",
            "id": 3,
            "age": 2,
            "username": "user2",
            "team": null
        },
        ...

이런식으로 데이터 10개가 페이징 되어서 응답을 보내주게 된다. 요청에서 파라미터로 size = 3 하면 한페이지에 데이터가 3개가 들어가게 된다. 다른 파라미터로 sort를 사용할 수 도 있다.

 

3. 기본값의 size는 10이지만 yml 파일에서 따로 설정해줄 수 도 있다.

  data:
    web:
      pageable:
        default-page-size: 10
        max-page-size: 2000

기본 페이지 사이즈는 10, 최대 페이지사이즈는 2000이 된다.

 

4. 하지만 어노테이션을 붙혀서 기본페이지 사이즈를 정할 수도 있다.

@GetMapping("/members")
    public Page<Member> list(@PageableDefault(size = 12, sort = "username")Pageable pageable) {
        Page<Member> page = memberRepository.findAll(pageable);
        return page;
    }

@PageableDefault를 붙혀서 옵션을 넣어주면 이게 우선순위가 된다.

 

5. Page내용을 변환(DTO로)

@GetMapping("/members")
    public Page<MemberDto> list(@PageableDefault(size = 5) Pageable pageable) {
        return memberRepository.findAll(pageable).map(member -> new MemberDto(member.getId(),member.getUsername(),null));
    }

이렇게 바꿔주면 응답 메시지바디에는 우리가 설정했던 MemberDto로 변환이되어 담겨온다.