Customizing PageImpl - Page 구현체 커스텀

Yunny.Log ·2022년 6월 2일
2

Spring Boot

목록 보기
64/80
post-thumbnail

문제 상황

현재 PageImpl을 통해서 내 리스트를 Page로 반환하게 한 후의 결과 값이다

{
    "success": true,
    "code": 0,
    "result": {
        "data": {
            "totalElements": 11,
            "totalPages": 6,
            "hasNext": true,
            "content": [
                {
                    "id": 458,
                    "name": "뚜레쥬르 얼그레이 크림빵 ",
                    "type": "TYPE4",
                    "itemNumber": 4000020,
                    "revision": 65,
                    "status": "WORKING"
                },
                {
                    "id": 456,
                    "name": "SATURDAY",
                    "type": "TYPE4",
                    "itemNumber": 4000691,
                    "revision": 65,
                    "status": "WORKING"
                }
            ]
        }
    }
}

그러나 내가 진행하는 프로젝트에서는 프론트 분께서는 내가 건네주는 데이터로 아래와 같은 표를 만들어야 한다.

그래서 나는 저 열에 해당하는 인덱스 값들을 넘겨줘야 한다.
아래와 같이 한 변수를 더 추가하고 싶은 것이다~

과정

public class CustomPageImpl<T> extends PageImpl<T> {
  • 먼저 PageImpl을 상속받아주었다.
    private final List<String> indexes;
    //새로운 인스턴스 변수 생성
  • 그러려면 구현체 안에 새로운 변수 필드를 넣어줘야 하므로, 추가로 만들어주었고,
    @JsonCreator
    public CustomPageImpl(List content, Pageable pageable, long total, List indexes) {
        super(content,pageable.getSort().isSorted() ? pageable : PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by("createdAt").descending()), total);
        this.indexes = indexes;
        // 생성자를 통해 인스턴스 변수 추가 초기화
    }

    @JsonCreator
    public CustomPageImpl(List content, List<String> indexes) {
        super(content);
        this.indexes = indexes;
        // 생성자를 통해 인스턴스 변수 추가 초기화
    }

이를 생성자를 통해 초기화를 진행해주었다.
참고로 디폴트 생성자는

    public CustomPageImpl(List<T> content, Pageable pageable, long total, List<String> indexes) {
        super(content, pageable, total);
    }

    public CustomPageImpl(List<T> content, List<String> indexes) {
        super(content);
    }
  • 이와 같이 생겼었는데, 내가 새로 추가한 필드도 같이 초기화해준 것이다.

  • 그리고 그냥 이렇게만 해도 안생김, Jsongetter을 통해서 get해주는 것 추가!

    @JsonGetter(value = "indexes")
    public List getPaging() {
        return indexes;
    }

결과

  • CustomPageImpl 의 최종코드는 아래와 같다.
public class CustomPageImpl<T> extends PageImpl<T> {
    private final List<String> indexes;
    //새로운 인스턴스 변수 생성

    @JsonCreator
    public CustomPageImpl(List content, Pageable pageable, long total, List indexes) {
        super(content,pageable.getSort().isSorted() ? pageable : PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), Sort.by("createdAt").descending()), total);
        this.indexes = indexes;
        // 생성자를 통해 인스턴스 변수 추가 초기화
    }

    @JsonCreator
    public CustomPageImpl(List content, List<String> indexes) {
        super(content);
        this.indexes = indexes;
        // 생성자를 통해 인스턴스 변수 추가 초기화
    }

    @JsonGetter(value = "contents")
    @Override
    public List getContent() {
        return super.getContent();
    }

    @JsonGetter(value = "indexes")
    public List getPaging() {
        return indexes;
    }

}
  • 제가 원하던 모습으로 와주었습니다! 역시 커스텀은 짜릿해 , 자바의 상속은 대단하다는 생각을 다시 한번 해주었답니다

참고 블로그 : https://lion-king.tistory.com/entry/SpringPageable-Page-%EA%B0%9D%EC%B2%B4%EC%9D%98-%EA%B5%AC%ED%98%84%EC%B2%B4-PageImpl%EC%9D%98-%EC%BB%A4%EC%8A%A4%ED%84%B0-%EB%A7%88%EC%9D%B4%EC%A7%95


참고로 오늘 자바의 정석 스터디에서 배운 내용도 리마인드 할 수 있어서 좋았습니다! 바로~

  • 생성자는 인스턴스 초기화용!
  • 생성자는 객체 생성용이 아니다~

0개의 댓글