1 분 소요


도메인 클래스 컨버터

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

도메인 클래스 컨버터 사용 전

@RestController
@RequiredArgsConstructor
public class MemberController {

    private final MemberRepository memberRepository;

    @GetMapping("/members/{id}")
    public String findMember(@PathVariable("id") Long id) {
        Member member = memberRepository.findById(id).get();
        return member.getUsername();
    }
}

도메인 클래스 컨버터 사용 후

@RestController
@RequiredArgsConstructor
public class MemberController {

    private final MemberRepository memberRepository;

    @GetMapping("/members/{id}")
    public String findMember(@PathVariable("id") Member member) {
        return member.getUsername();
    }
}
  • HTTP 요청은 회원 id를 받지만, 도메인 클래스 컨버터가 중간에 동작해서 회원 엔티티 객체를 반환
  • 도메인 클래스 컨버터도 Repository를 사용해서 엔티티를 찾음

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


페이징과 정렬

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

예제

@GetMapping("/members")
public Page<Member> list(Pageable pageable) {
    Page<Member> page = memberRepository.findAll(pageable);
    return page;
}
  • 파라미터로 Pageable을 받을 수 있다.
  • Pageable은 인터페이스, 실제는 org.springframework.data.domain.PageRequest 객체 생성

요청 파라미터

  • Ex) /members?page=0&size=3&sort=id,desc&sort=username,desc
  • page : 현재 페이지, 0부터 시작한다.
  • size : 한 페이지에 노출할 데이터 건수
  • sort : 정렬 조건을 정의한다.
    • Ex) 정렬 속성(ASC | DESC)

기본값

  • 글로벌 설정 : 스프링 부트
    spring.data.web.pageable.default-page-size=20 /# 기본 페이지 사이즈/
    spring.data.web.pageable.max-page-size=2000 /# 최대 페이지 사이즈/
    
  • 개별 설정 : @PageableDefault 어노테이션 사용
    @RequestMapping(value = "/members_page", method = RequestMethod.GET)
    public String list(@PageableDefault(size = 12, sort = "username",
                       direction = Sort.Direction.DESC) Pageable pageable) {
    
      ...
    }
    

접두사

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

Page 내용 -> DTO

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

Member DTO

@Data
public class MemberDto {
    
    private Long id;
    private String username;

    public MemberDto(Long id, String username) {
        this.id = id;
        this.username = username;
    }
}

Page.map() 사용

@GetMapping("/members")
public Page<MemberDto> list(Pageable pageable) {
    Page<Member> page = memberRepository.findAll(pageable);
    Page<MemberDto> pageDto = page.map(member -> new MemberDto(member.getId(), member.getUsername()))
    return PageDto;
}


<출처 : 인프런 - 실전! 스프링 데이터 JPA(김영한)>

댓글남기기