실전! 스프링 데이터 JPA

Ch04. 확장 기능 - Web 확장(도메인 클래스 컨버터, 페이징과 정렬)

webmaster 2021. 12. 27. 11:35
728x90

도메인 클래스 컨버터

HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩

  • HTTP 요청은 회원 id를 받지만 도메인 클래스 컨버터가 중간에 동작해서 회원 엔티티 객체를 반환
  • 도메인 클래스 컨버터도 리파지토리를 사용해서 엔티티를 찾음

주의

도메인 클래스 컨버터로 엔티티를 파라미터로 받으면, 이 엔티티는 단순 조회용으로만 사용해야 한다. (트랜잭션이 없는 범위에서 엔티티를 조회했으므로, 엔티티를 변경해도 DB에 반영되지 않는다.)

페이징과 정렬

스프링 데이터가 제공하는 페이징과 정렬 기능을 스프링 MVC에서 편리하게 사용할 수 있다.

파라미터로 페이징을 받을 수 있다.파라미터로 페이징을 받으면 springboot가 다 메핑 해준다.

  • 파라미터로 Pageable 을 받을 수 있다.
  • Pageable 은 인터페이스, 실제는 org.springframework.data.domain.PageRequest 객체 생성
  • 요청 파라미터
    • page: 현재 페이지, 0부터 시작한다.
    • size: 한 페이지에 노출할 데이터 건수
    • sort: 정렬 조건을 정의한다.
      • 예) 정렬 속성,정렬 속성...(ASC | DESC), 정렬 방향을 변경하고 싶으면 sort 파라미터 추가 ( asc 생략 가능)

기본값 변경

요청 파라미터의 기본값은 SpringBoot에서 다 설정되어 있으면 변경하고 싶을경우 아래와 같은 방법을 사용하면 된다.

글로벌 설정

YML 수정

  • yml 수정하여 글로벌 설정을 변경한다.

해당 메서드만 특별한 설정

@PageableDefault 어노테이션 사용

  • @PagealbeDefault를 사용해서 설정가능
  • 메소드마다 특별하게 설정이 가능하다.

접두사

접두사로 페이징 구분

  • 페이징 정보가 둘 이상이면 접두사로 구분
  • @Qualifier에 접두사명 추가 "{접두사명}_xxx”
  • 예제: /members? member_page=0&order_page=1

Page 내용을 DTO로 변환하기

Entity -> Dto 변환
변경할 DTO, Strean에서 사용할 생성자 작성

  • 엔티티를 API로 노출하면 다양한 문제가 발생한다. 그래서 엔티티를 꼭 DTO로 변환해서 반환해야 한다.
  • Page는 map()을 지원해서 내부 데이터를 다른 것으로 변경할 수 있다.

Page를 1부터 시작하기

SpringDataJPA 는 Page를 0부터 시작한다. -> 1부터 시작하기 위해서는?

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

 

728x90