JPA with Springboot, paging, sorting 방법 Pageable, Sort
Sprincboot JPA paging, sorting 방법 Pageable, Sort
Springboot JPA 설정 방법과 Entity mapping 방법은 아래의 Link를 참고하세요.
Link : aljjabaegi.tistory.com/561
Link : aljjabaegi.tistory.com/562
위의 Entity mapping Link의 Service, ServiceImpl, Repository 코드를 활용하기 때문에
Link의 내용을 확인하셔야 아래의 내용을 이해하는데 도움이 되실꺼에요.
Paging 처리 방법을 먼저 알아보겠습니다.
기존에 MemberRepository 에서 JpaRepository를 상속받던 부분을
PagingAndSortingRepository를 상속받게 수정합니다.
[MemberRepository Interface]
@Repository
public interface MemberRepository extends PagingAndSortingRepository<Member, String> {
}
ServiceImpl에서도 List<Member> 를 리턴받는 것을 Page<Member>를 리턴받게 수정합니다.
그리고 페이징 처리를 위한 기본정보를 map으로 전달받아야 합니다. (firstIdx, lastIdx)
[MemberListServiceImpl Interface]
public interface MemberListServiceImpl {
Page<Member> getGridList(Map<String, Object> map) throws Exception;
}
Service class 에서는 Pageable 정보를 repository의 findAll 메소드 파라메터로 전달합니다.
[MemberListService class - page 정보 추가]
import java.util.Map;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
@Service("memberService")
public class MemberListService implements MemberListServiceImpl{
@Autowired private MemberRepository repo;
@Override public List<Member> getMemberList(Map<String, Object> map) throws Exception {
int firstIdx = (int) map.get("pageIdex")-1;
int lastIdx = (int) mape.get("recordCountPerPage");
Pageable paging = PageReqeust.of(firstIdx, lastIdx);
return repo.findAll(paging);
}
}
테스트를 해보면 해당 index 사이의 값만 출력되는 것을 확인하실 수 있습니다.
Sorting 하는 방법은 PageRequest에 정렬할 정보를 전달하시면 됩니다.
아래 예시의 경우 파라메터 Map 에 정렬할 컬럼(ex - id, name, useYn...)과 정렬방식 (asc, desc) 을 전달하여
해당 컬럼에 대한 정렬을 하게 합니다.
[MemberListService class - sort 정보 추가]
import java.util.Map;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
@Service("memberService")
public class MemberListService implements MemberListServiceImpl{
@Autowired private MemberRepository repo;
@Override public List<Member> getMemberList(Map<String, Object> map) throws Exception {
int firstIdx = (int) map.get("pageIdex")-1;
int lastIdx = (int) mape.get("recordCountPerPage");
Pageable paging = PageRequest.of(firstIdx, lastIdx
, GetSort.getSort((String) map.get("sortColumn"), (String) map.get("sortOrder")));
return repo.findAll(paging);
}
}
[GetSort - static class]
public class GetSort {
public static final Sort getSort(String column, String order) {
Sort sort = null;
if("asc".equals(order)) {
sort = Sort.by(column).ascending();
}else if("desc".equals(order)){
sort = Sort.by(column).descending();
}else {
sort = Sort.by("id").ascending();
}
return sort;
}
}
테스트 해보면 정렬된 페이징 정보가 출력되는 것을 확인하실 수 있습니다.
Link : aljjabaegi.tistory.com/564