Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Web 확장 : 도메인 클래스 컨버터, 페이징 & 정렬 본문

인프런/[인프런] Spring Data JPA

Web 확장 : 도메인 클래스 컨버터, 페이징 & 정렬

Seung__ 2021. 8. 31. 20:32

 1. 도메인 클래스 컨버터


  • HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩해줌
  • 쉽게말해 @Pathvariable로 id를 받으면 스프링이 id를 가지고 엔티티를 바인딩함.
  • findMember : id를 파라미터로 받아 직접 member를 찾아옴.
  • fimdMember2 : id를 파라미터로 받으면 스프링이 member와 바인딩함.
@GetMapping("/members/{id}")
    public String findMember(@PathVariable("id") Long id){
        Member member = memberRepository.findById(id).get();
        return member.getUserName();
    }


    @GetMapping("/members2/{id}")
    public String findMember2(@PathVariable("id") Member member){
       //Member member = memberRepository.findById(id).get();
        return member.getUserName();
    }
  • 주의: 도메인 클래스 컨버터로 엔티티를 파라미터로 받으면,
  • 이 엔티티는 단순 조회용으로만 사용해야 한다.
  • (트랜잭션이 없는 범위에서 엔티티를 조회했으므로, 엔티티를 변경해도 DB에 반영되지 않는다.)

 

 

 

2. 페이징, 정렬


1) 페이징

  • 파라미터로 Pageable을 받으면
  • HTTP 파리미터에 page=?&size=? 가 있으면
    http://localhost:8080/members?page=0&size=3​
  • 넘어온 파라미터를 가지고 Pageable의 구현체인 PageRequest를 만들어서 메서드에 넘겨줌
 @GetMapping("/members")
    public Page<Member> list(Pageable pageable){
        Page<Member> page = memberRepository.findAll(pageable);
        return page;
    }
  • 애플리케이션을 실행시키고 위의 url로 접속해보자.
{
    "content": [
        {
            "createdDate": "2021-08-31T20:02:40.485596",
            "lastModifiedDate": "2021-08-31T20:02:40.485596",
            "createdBy": "9ecef417-7e8c-41ed-9854-df21d3506706",
            "lastModifiedBy": "9ecef417-7e8c-41ed-9854-df21d3506706",
            "id": 1,
            "userName": "user0",
            "age": 0,
            "team": null
        },
        {
            "createdDate": "2021-08-31T20:02:40.53407",
            "lastModifiedDate": "2021-08-31T20:02:40.53407",
            "createdBy": "d574508b-bb42-4c72-9201-a5b662f11725",
            "lastModifiedBy": "d574508b-bb42-4c72-9201-a5b662f11725",
            "id": 2,
            "userName": "user1",
            "age": 1,
            "team": null
        },
        {
            "createdDate": "2021-08-31T20:02:40.537071",
            "lastModifiedDate": "2021-08-31T20:02:40.537071",
            "createdBy": "4a3424ef-cbee-4abc-bc08-1c6f984565b5",
            "lastModifiedBy": "4a3424ef-cbee-4abc-bc08-1c6f984565b5",
            "id": 3,
            "userName": "user2",
            "age": 2,
            "team": null
        }
    ],
    "pageable": {
        "sort": {
            "sorted": false,
            "unsorted": true,
            "empty": true
        },
        "offset": 0,
        "pageNumber": 0,
        "pageSize": 3,
        "paged": true,
        "unpaged": false
    },
    "last": false,
    "totalPages": 34,
    "totalElements": 100,
    "size": 3,
    "number": 0,
    "sort": {
        "sorted": false,
        "unsorted": true,
        "empty": true
    },
    "first": true,
    "numberOfElements": 3,
    "empty": false
}
  • 기본적으로 20개씩 나온다. 기본 설정을 바꾸고 싶으면??
  • 글로벌 설정 : Application.yml에 설정을 해주면 됨.
  data:
    web:
      pageable:
        default-page-size: 10
        max-page-size: 2000
  • 특정 메서드만 : @PageableDefault
 @GetMapping("/members")
    public Page<Member> list(@PageableDefault(size = 5) Pageable pageable){
        Page<Member> page = memberRepository.findAll(pageable);
        return page;
    }

 

 

2) 정렬

  • 정렬 : 쿼리 파라미터를 추가하며됨.
    • sort=대상,정렬방법
    • 여러개도 가능
localhost:8080/members?page=0&size=3&sort=id,desc
localhost:8080/members?page=0&size=3&sort=id,desc&sort=userName,desc

 

 

3) 접두사

  • 페이징 정보가 둘 이상이면 접두사로 구분
  • @Qualifier 에 접두사명 추가 "{접두사명}_xxx”
  • 예제: /members?member_page=0&order_page=1
public String list(
@Qualifier("member") Pageable memberPageable,
@Qualifier("order") Pageable orderPageable, ...

 

 

4) Page 내용을 DTO로 변환

  • map을 통해 page내부의 member를 memberDto로 변환.
 @GetMapping("/members")
    public Page<MemberDto> list(@PageableDefault(size = 5) Pageable pageable){
        Page<Member> page = memberRepository.findAll(pageable);
        Page<MemberDto> map = page.map(member -> new MemberDto(member.getId(), member.getUserName(), null));
        return map;
    }

 

5)페이지 번호가 기본 0인데,, 1부터 시작하고 싶으면?

  • Pageable, Page를 파리미터와 응답 값으로 사용히지 않고, 직접 클래스를 만들어서 처리한다.
    그리고 직접 PageRequest(Pageable 구현체)를 생성해서 리포지토리에 넘긴다. 
    물론 응답값도 Page 대신에 직접 만들어서 제공해야 한다.
  • spring.data.web.pageable.one-indexed-parameters 를 true 로 설정한다.
    그런데 이 방법은 web에서 page 파라미터를 -1 처리 할 뿐이다. 
    따라서 응답값인 Page 에 모두 0 페이지 인덱스를 사용하는 한계가 있다.
    그래서 Pageable 내의 데이터 가 맞지 않음
    왜냐? Pageable의 데이터는 인덱스 0을 기준으로 함.ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

3. GitHub : 210831 Web, Paging, Sorting


 

 

GitHub - bsh6463/SpringDataJpa

Contribute to bsh6463/SpringDataJpa development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] Spring Data JPA' 카테고리의 다른 글

Query By Example  (0) 2021.08.31
SpringDataJpa의 구현체  (0) 2021.08.31
Auditing  (0) 2021.08.30
사용자 정의 Repository  (0) 2021.08.30
JPA Hint & Lock  (0) 2021.08.29
Comments