@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();
}
// 도메인 클래스 컨버터 사용 후
@GetMapping("/members2/{id}")
public String findMember2(@PathVariable("id") Member member) {
// 바로 찾아준다.
return member.getUsername();
}
@PostConstruct
public void init() {
memberRepository.save(new Member("userA"));
}
}
도메인 클래스 컨버터가 중간에 동작해서 id로 회원 엔티티 객체를 반환한다.
리파지토리를 사용해 엔티티를 찾는다.
이 방식을 사용하면 엔티티는 단순 조회용으로만 사용해야 한다.
트랜잭션이 없는 범위에서 엔티티를 조회하므로 엔티티를 변경해도 DB에 반영되지 않는다.
페이징과 정렬
@RestController
@RequiredArgsConstructor
public class MemberController {
...
@GetMapping("/members")
public Page<Member> list(Pageable pageable) {
Page<Member> page = memberRepository.findAll(pageable);
return page;
}
}
# 기본 페이지 사이즈
spring.data.web.pageable.default-page-size=20
# 최대 페이지 사이즈
spring.data.web.pageable.max-page-size=2000
개별 설정
@RestController
@RequiredArgsConstructor
public class MemberController {
...
@RequestMapping(value = "/members_page", method = RequestMethod.GET)
public String list(
@PageableDefault(
size = 12,
sort = "username",
direction = Sort.Direction.DESC)
Pageable pageable) {
...
}
}
@PageableDefault 설정이 우선하여 적용된다.
접두사
@RestController
@RequiredArgsConstructor
public class MemberController {
...
@RequestMapping(value = "/members_page", method = RequestMethod.GET)
public String list(
@Qualifier("member") Pageable memberPageable,
@Qualifier("order") Pageable orderPageable) {
...
}
}
/members?member_page=0&order_page=1
페이징 정보가 둘 이상이면 접두사로 구분한다.
@Qualifier
value에 접두사 이름을 추가하면 요청에서 접두사_xxx를 구분한다.
Page 내용을 DTO로 변환
엔티티를 API로 바로 노출하면 문제가 발생한다.
꼭 DTO로 변환해서 반환한다.
Page는 map()을 지원해서 내부 데이터를 변환할 수 있다.
@Data
public class MemberDto {
private Long id;
private String username;
public MemberDto(Member m) {
this.id = m.getId();
this.username = m.getUsername();
}
}
@RestController
@RequiredArgsConstructor
public class MemberController {
private final MemberRepository memberRepository;
@GetMapping("/members")
public Page<MemberDto> listPageMap1(Pageable pageable) {
Page<Member> page = memberRepository.findAll(pageable);
Page<MemberDto> pageDto = page.map(MemberDto::new);
return pageDto;
}
// Page.map() 최적화
@GetMapping("/members")
public Page<MemberDto> listPageMap2(Pageable pageable) {
return memberRepository.findAll(pageable).map(MemberDto::new);
}
}
Page를 1부터 시작하기
스프링 데이터는 Page를 0부터 시작한다.
1부터 시작하려면?
직접 클래스 생성
Pageable, Page를 파리미터와 응답 값으로 사용하지 않고 직접 클래스를 만들어서 처리한다.