본문 바로가기
백엔드/Spring

[JPA] List to Page - List를 Page로 변환해서 사용하기

by 작은소행성 2023. 8. 7.

JPA 에서 제공하는 Page를 사용하고 싶은데 

데이터를 가공해서 사용하다 보니 List 로 결과가 나오고 있어서 

List를 Page로 변환해서 사용하고자 한다. 

 

아래 코드를 참고해서 List 를 Page로 변환해서 사용하면 된다.  

 

방법1

Page<CompanyResponse.CompanyDto> pageResult = (Page<CompanyResponse.CompanyDto>) PageUtils.makePageResponse(list, pageable);

 

페이징 처리를 위한 공통 코드 

public static Page<?> makePageResponse(List<?> list, Pageable paging, int totalCount) {
        try {
            return (new PageImpl<>(list, paging, totalCount));
        } catch (Exception e) {
            return (new PageImpl<>(new ArrayList<>(), paging, totalCount));
        }
    }

 

응답값

@Getter
@SuperBuilder
public class CompanyResponse extends PagingDto {

    private final List<CompanyDto> companyDtos;

    @Data
    @Builder
    public static class CompanyDto {

        @Schema(name = "회사 아이디")
        private Long companyId;

        @Schema(name = "회사명")
        private String companyName;

    }
}

 

응답값에서 사용하는 페이지 DTO

@Getter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class PagingDto {

    @Builder.Default
    private int size = 15;

    @Builder.Default
    private int page = 1;

    @Builder.Default
    private long totalCount = 0;

    @Builder.Default
    private int totalPages = 0;
}

 

 

 

방법2

위의 방법으로 안될때는 아래 내용처럼 페이징 처리를 위한 값을 하나씩 다 처리해서 사용해도 된다. 

List<Company> listResult = companyRepotiroy.findAllByName(name);
// 요청으로 들어온 page와 한 page당 원하는 데이터의 갯수
PageRequest pageRequest = PageRequest.of(page, size);
int start = (int) pageRequest.getOffset();
int end = Math.min((start + pageRequest.getPageSize()), listResult.size());
nt totalCount = listResult.size() < pageable.getPageSize() ? 1 : (int) Math.ceil((double) listResult.size() / pageable.getPageSize()); // 페이지 사이즈에 따른 페이지 전체 카운트
Page<Company> userPage = new PageImpl<>(listResult.subList(start, end), pageRequest, listResult.size());

 

 

 

 

 

참고 

https://www.baeldung.com/spring-data-jpa-convert-list-page

반응형