1. 보다 쉬운 페이징 구현을 위해 queryDSL을 사용한다.
  2. SpringFramwork에서 제공하는 Page와 Pageable을 이용한다.

개발 순서

  1. repository에서 Page형식으로 서비스에 리턴 하도록 만드는 것이 우선으로 보인다. Keword와 페이징방식(Pageable)이 주어지면 해당 방식에 맞게 리턴할 수 있도록 만들 예정.

  2. 서비스의 경우 가져온 데이터를 dto로 변환해 return하는 과정이 필요해보인다.

  3. 컨트롤러의 경우 현재 페이지의 위치와 전체 페이지 수를 알 수 있어야 한다. 이 코드를 분리하기 위해 페이징으로 부터 정보를 가져오는 서비스를 하나 만드는 것이 필요해보인다.

queryDSL에서 커스텀 해야할 부분이 있는가?

검색 키워드를 바탕으로 페이징 하기 때문에 일정 부분 일치한다면 검색 될 수 있도록 커스텀할 필요가 있어보임. 아래는 선택 할 Binding 방식.

게시글 내용 + 제목과 같이 다중 검색 또한 가능하도록 하고 싶지만 이 경우는 리펙토링 요소로만 남겨두자. (MultiBinding에 대한 추가 공부 또한 필요할 뿐만 아니라, 서비스 운영시 게시글 내용에 대한 검색을 포함 시킬 지 미정이기에…)

Repository

Service

SearchType의 경우 enum으로 관리한다. 실제로 사용자에게 보여줄 searchType과 관리하기 위해 사용할 상수명이 다르기 때문. 또한 프런트로 넘겨줄 때 편한 구분을 위해서기도 하다.

Controller

service에서 searchType 또는 searchValue가 없을 경우 기본 정렬로 페이징하도록 하였음으로 required = false를 추가. 또한 앞서 말했듯 현재 페이지의 넘버를 알려주는 코드의 경우 따로 PaginationService에 분리하였다.

생각해볼 점.

  1. 현재는 게시글에 대한 페이징만 했지만, 사용자와 사용자가 가진 이용권을 페이징을 하는 작업이 남았다.

이 관계는 게시글과 댓글의 관계와 비슷해보이지만 연관관계 매핑을 하지 않았기에 이용권에 UserId로 접근하여 페이징을 시도해야한다.

또한 현재 프런트에게 이용권을 Json 형식으로 데이터를 내려주고 있기에, 방법에 대한 통일 또한 필요해보인다.