spring-data-jpa, web 확장 -도메인 클래스 컨버터

도메인 클래스 컨버터

  • 컨트롤러에서도 도메인을 조회할 수 있다.

기본적인 형태

  • 아래의 코드를 보면 id를 api의 인자로 받고, 해당 인자를 바로 Member 로 컨버팅하여 컨트롤러 코드블럭에서 사용한다.
@RestController
@RequiredArgsConstructor
public class MemberController {

    private final MemberRepository memberRepository;

    @GetMapping("/members1/{id}")
    public String findMember1(@PathVariable("id") Long id){
        return memberRepository.findById(id).get().getUsername();
    }

    @GetMapping("/members2/{id}")
    public String findMember2(@PathVariable("id") Member member){
        return member.getUsername();
    }

    @PostConstruct
    private void intit(){
        memberRepository.save(new Member("kim", 15));
    }
}
  • 위의 경우 트랜잭션 외부에서 진행하기 때문에, 변경과 관련하여 사용하기에 신경써야 할 부분이 너무 많다.
  • pk 값을 기준으로 Member를 가져오기 때문에 제한적인 상황에서만 사용 가능하다.
  • 그러므로 아주 간단한 조회 기능을 위해서만 사용하는 것을 권장한다.

페이징과 정렬

  • 페이징과 정렬을 사용할 수 있다.
  • 기본 형태는 페이지가 0부터 시작한다.
@PostConstruct
private void intit(){
    for(int i=0; i<100; i++){
        memberRepository.save(new Member("kim"+i, i));
    }
}

@GetMapping("/members")
public Page<MemberDto> list(@PageableDefault(size = 5) Pageable pageable){
    final Page<Member> page = memberRepository.findAll(pageable);
    final Page<MemberDto> map = page.map(MemberDto::new);
    return map;
}
  • http://localhost:8080/members?page=2&size=3&sort=id,desc
  • 다양한 인자를 사용할 수 있다.

  • 페이징과 관련해서는 프로퍼티스에서 설정 가능하다.
spring:
  data:
    web:
      pageable:
        default-page-size: 10
        max-page-size: 2000
#        one-indexed-parameters: true

페이지를 1부터 시작하려면?

spring.data.web.one-indexed-parameters: true 로 설정한다.

  • 실제 page로 선별된 값은 page를 3으로 하면, page가 2인 데이터를 추출한다. 하지만 page 객체의 값들도 page를 2에 맞춰서 리턴한다. 그러니까 일관성이 없으며 이러한 한계를 이해하고 사용해야 한다.

  • http://localhost:8080/members?page=3

{   "content": {
    <!-- 중략 -->
},"pageable": {
    "sort": {
        "empty": true,
        "sorted": false,
        "unsorted": true
    },
    "offset": 10,
    "pageNumber": 2,
    "pageSize": 5,
    "unpaged": false,
    "paged": true
},
"last": false,
"totalPages": 20,
"totalElements": 100,
"size": 5,
"number": 2,
    "sort": {
        "empty": true,
        "sorted": false,
        "unsorted": true
    },
    "first": false,
    "numberOfElements": 5,
    "empty": false
}

pageable 을 직접 정의한다.

  • 위의 문제로 사실상 정의하는 것이 나아 보인다.
  • 가장 빠르고 쉬운 방법은 페이지가 0부터 시작됨을 인정하는 방식..이다.