2 분 소요

도메인 클래스 컨버터

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부터 시작하고 싶다면?

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

page는 2로 결과도 나오지만, 밑에 page객체 정보는 그냥 1로 내보내 버린다.. 이게 한계다.

아무튼 이번 장에서 느낀건 페이징 기능은 엄청 편리해 보이고, DTO를 반환하자!!!!!!

태그: ,

카테고리:

업데이트:

댓글남기기