[Spring] 목록 처리

[Spring] 목록 처리

목록을 처리해봅시다.


목록을 처리할 때 우선 처음으로 화면에 목록을 보여주기 위해서 목록 데이터에 대한 DTO가 필요합니다. 또한 화면에 보일 DTO를 Pageable 타입으로 전환해야 하며 Page 엔티티를 DTO 리스트로 변환해야 합니다. 마지막으로 화면에 필요한 페이지의 번호를 처리해야 합니다.



1. PageRequestDTO 작성



1

목록 페이지를 요청할 때 사용할 PageRequestDTO 클래스를 작성합니다.
목록 화면에서는 페이지 처리를 하는 경우가 자주 있습니다. 페이지 번호, 페이지 내 목록의 개수, 검색할 조건 등이 주로 사용됩니다. 이러한 요소를 처리할 PageRequestDTO를 위의 그림과 같은 디렉토리에 작성합니다.
페이지의 기본값은 1과 10으로 설정합니다. 일반적으로 페이지는 1페이지부터 시작한다고 생각하지만 JPA의 경우 페이지 번호는 0번부터 시작하기 때문에 파라미터를 page - 1로 작성합니다.

2. PageResultDTO 작성



2

JPA의 Repository는 페이지 처리의 결과를 Page<Entity> 타입으로 반환합니다. 따라서 서비스 계층에서 이를 처리하기 위해 PageResultDTO 클래스를 만들어 처리합니다.
이 PageResultDTO 클래스는 Page<Entity>의 객체를 DTO로 변환하고 화면 출력에 필요한 페이지의 정보를 구성해야 합니다.
PageResultDTO 클래스는 제너릭 타입을 이용해 DTO와 EN(엔티티) 타입으로 지정합니다.
PageResultDTO의 생성자는 Page<Entity> 타입과 Function을 이용해 생성하도록 합니다.
Function<EN, DTO>는 엔티티 객체를 매개변수로 받고 DTO 객체를 반환한다는 의미입니다.
엔티티로 구성된 Page를 받아와 이를 나열하고 Function을 통해 DTO로 변환합니다. 그 후 DTO로 변환된 데이터를 다시 배열로 만들어 dtoList를 생성합니다.

3. GuestbookService 인터페이스 수정



3

서비스 계층에서 PageRequestDTO를 받아 PageResultDTO로 반환하는 getList()와 엔티티 객체를 DTO 객체로 변환하는 entityToDto()를 추가로 작성합니다.
GuestbookDTO 타입을 리턴하는 entityToDto()는 entity.get을 통해 GuestbookDTO 타입의 객체를 build합니다.

4. getList() 구현



4

GuestbookService 인터페이스에 추가로 작성했던 getList()를 구현합니다.
getList()에서는 java.util.Function을 사용해 entityToDTO()를 수행하는 Function fn을 만듭니다. JPA의 처리 결과인 Page<Entity>와 Function을 전달해 엔티티 객체를 DTO의 리스트로 변환하고 페이지 처리에 필요한 dtoList를 생성하도록 합니다.

5. 목록 처리 테스트



5

앞서 작성한 코드들의 테스트를 수행하겠습니다.
엔티티 객체가 DTO 객체로 정상적으로 변환되는지 testList()를 통해 확인해보겠습니다.
PageRequestDTO를 생성한 뒤 getList()의 매개변수로 넘깁니다. getList를() 통해 생성된 값들은 PageResultDTO의 객체 resultDTO에 담습니다.
resultDTO의 dtoList의 값을 하나씩 출력하도록 코드를 작성합니다.

6. 목록 처리 테스트 결과



6

스택트레이스를 살펴본 결과 Page<guestbook>이 List<GuestBookDTO>로 정상적으로 변환된 것을 확인할 수 있습니다.

7. 페이지의 번호 처리



7

화면에 전달될 데이터인 PageResultDTO에 필요한 정보들을 추가로 작성해보겠습니다.
목록 화면에는 보통 아래쪽에 페이지의 번호들이 10개씩 출력됩니다. 이러한 페이지 번호의 처리를 위한 변수들을 만들고 페이지 번호를 계산하는 과정을 작성합니다.
작성한 변수들의 역할은 주석을 통해 알 수 있습니다.

8. 페이지의 번호 계산



8

페이지의 번호를 계산할 때 끝 번호를 먼저 계산한 뒤 시작 번호는 끝 번호에서 9를 빼는 것이 좋습니다. 이때 끝 번호는 마지막 글이 10개 미만일 경우가 있기 때문에 총 페이지 수보다 끝 번호가 작을 때와 아닐 때를 구분지어 참이라면 계산식 대로 끝 번호를 사용하고 거짓이라면 전체 페이지 크기가 끝 번호가 되도록 작성합니다.

9. 페이지의 번호 처리 테스트



9

앞서 사용한 testList()를 수정해 페이지의 번호 처리가 정상적으로 수행되는지 확인해보겠습니다.

10. 페이지의 번호 처리 테스트 결과



10

현재 데이터는 301개 존재하고 있으며 총 31페이지로 구성된 것을 확인할 수 있습니다. 페이지가 1 페이지기 때문에 PREV는 false로 NEXT는 True로 처리된 것을 알 수 있습니다.


© 2022. All rights reserved.