스프링 데이터 JPA - WEB 확장 (도메인 클래스 컨버터 & 페이징)
도메인 클래스 컨버터
1
2
3
4
5
@GetMapping("/members/{id}")
public String findMember(@PathVariable("id") Long id) {
Member member = memberRepository.findById(id).get();
return member.getUsername();
}
다음과 같은 컨트롤러가 있다.
이때 도메인 클래스 컨버터를 사용하면 Member member = memberRepository.findById(id).get();
이걸 생략 할 수 있다.
1
2
3
4
@GetMapping("/members2/{id}")
public String findMember2(@PathVariable("id") Member member) {
return member.getUsername();
}
이런식으로 간단한 경우 Member 엔티티를 직접 반환할 수 있다.
- HTTP 요청은 회원
id를 받지만 도메인 클래스 컨버터가 중간에 동작해서 회원 엔티티 객체를 반환 - 도메인 클래스 컨버터도 리파지토리를 사용해서 엔티티를 찾음
주의 : 도메인 클래스 컨버터로 엔티티를 파라미터로 받으면, 이 엔티티는 단순 조회용으로만 사용해야 한다.(트랜션이 없는 범위에서 엔티티를 조회했으므로, 엔티티 변경해도 DB에 반영되지 않는다.)
굳이 쓸 필요는 없어 보인다. 알기만 해두자.. 사용 할려면 무조건 조회용
페이징과 정렬
스프링 데이터가 제공하는 페이징과 정렬 기능을 스프링 MVC에서 편리하게 사용할 수 있다.
1
2
3
4
@GetMapping("/members")
public Page<Member> list(Pageable pageable) {
return memberRepository.findAll(pageable);
}
- 파라미터로
Pageable을 받을 수 있다. Pageable은 인터페이스, 실제는org.springframework.data.domain.PageRequest객체 생성
요청 파라미터
- 예)
/members?page=0&size=3&sort=id,desc&sort=username,desc - page : 현재 페이지, 0 부터 시작한다.
- size : 한 페이지에 노출할 데이터 건수
-
sort : 정렬 조건을 정의 한다. 예) 정렬 속성,정렬 속성…(ASC DESC), 정렬 방향을 변경 하고 싶으면 sort파라미터 추가 (asc는 생략 가능)

미쳤다..
기본 값
- 글로벌 설정 : 스프링 부트
1 2
spring.data.web.pageable.default-page-size=20 /# 기본 페이지 사이즈/ spring.data.web.pageable.max-page-size=2000 /# 최대 페이지 사이즈/
- 개별 설정
@PageableDefault어노테이션을 사용1 2 3 4 5
@GetMapping("/members") public Page<Member> list(@PageableDefault(size = 12, sort = "username", direction = Sort.Direction.DESC) Pageable pageable) { return memberRepository.findAll(pageable); }
접두사
- 페이징 정보가 둘 이상이면 접두사로 구분
@Qualifier에 접두사명 추가 “{접두사명}_xxx”- 예제 :
/members?member_page=0&order_page=1
1
2
3
4
5
6
public String list(
@Qualifier("member") Pageable memberPageable,
@Qualifier("order") Pageable orderPageable, ...
) {
...
}
Page 내용을 DTO로 변환하기
스프링 데이터 JPA - 페이징 여기서 하긴 한거임.
- 엔티티를 AP로 노출하면 다양한 문제가 발생한다. 그래서 엔티티를 꼭 DTO로 변환해서 반환 해야 한다.
- Page는
map()을 지원해서 내부 데이터를 다른 것으로 변경할 수 있다.
Member DTO
1
2
3
4
5
6
7
@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;
}
페이지를 1부터 시작하기
- 스프링 데이터는 Page를 0부터 시작한다.
-
만약에 1부터 시작하고 싶다면?
-
- Pageable, Page를 파라미터와 응답 값으로 사용하지 않고, 직접 클래스를 만들어서 처리한다. 그리고 직접 PageRequest(Pageable 구현체)를 생성해서 리포지토리에 넘긴다. 물론 응답 값도 Page 대신에 직접 만들어서 제공해야 한다.
-
spring.data.web.pageable.one-indexed-parameters를true로 설정한다. 그런데 이 방법은 web에서Page파라미터를-1처리 할 뿐이다. 따라서 응답 값인Page에 모두 0 페이지 인덱스를 사용하는 한계가 있다.


page는 2로 결과도 나오지만, 밑에 page객체 정보는 그냥 1로 내보내 버린다.. 이게 한계다.
아무튼 이번 장에서 느낀건 페이징 기능은 엄청 편리해 보이고, DTO를 반환하자!!!!!!
댓글남기기