BootTest 실습 ( 페이지 객체 , 불리언빌더, 큐보드 , 보드필터DTO ,쿼리스트링 활용)

Yeeun·2025년 4월 24일
0

SpringBoot

목록 보기
24/46

좋습니다! 이제 주어진 Board 클래스를 기준으로, 조건을 적용해 동적으로 쿼리를 생성하는 완성된 코드를 만들어 보겠습니다. 예시에서는 BoardFilter 클래스의 keyvalue를 이용해 조건을 적용하고, BooleanBuilderQBoard를 이용해 Querydsl을 사용한 동적 쿼리를 생성할 거예요.

완성된 코드:

package ruby.paper.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.querydsl.core.BooleanBuilder;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import ruby.paper.domain.Board;
import ruby.paper.domain.QBoard;
import ruby.paper.persistence.DynamicBoardRepository;

@Data
@Getter
@Setter
class BoardFilter {
    private String key;       // 검색할 필드명 (예: title, writer, content)
    private String value;     // 검색할 값 (예: test, 홍길동)
    private Integer pageNum = 0;   // 페이지 번호
    private Integer pageSize = 5;  // 페이지 크기
}

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private DynamicBoardRepository boardRepo;

    @GetMapping("/boardlist")
    public List<Board> getBoardList(BoardFilter bf) {
        BooleanBuilder builder = new BooleanBuilder();
        QBoard qboard = QBoard.board;  // QBoard는 Querydsl로 생성된 Board의 메타 모델 클래스입니다.

        // 필터 조건에 따라 쿼리 조건을 동적으로 추가
        if (bf.getKey() != null && bf.getValue() != null) {
            if (bf.getKey().equals("title")) {
                builder.and(qboard.title.contains(bf.getValue()));
            } else if (bf.getKey().equals("writer")) {
                builder.and(qboard.writer.contains(bf.getValue()));
            } else if (bf.getKey().equals("content")) {
                builder.and(qboard.content.contains(bf.getValue()));
            }
        }

        // 페이지 정보를 설정하여 결과 조회 (페이징 처리)
        Pageable paging = PageRequest.of(bf.getPageNum(), bf.getPageSize());
        Page<Board> boardList = boardRepo.findAll(builder, paging);

        // 결과 반환
        return boardList.getContent();  // 페이징된 결과에서 실제 콘텐츠만 반환
    }
}

주요 설명:

  1. BoardFilter:

    • key: 검색할 필드(예: title, writer, content)입니다.
    • value: 검색할 값(예: "test", "홍길동")입니다.
    • pageNumpageSize: 페이징을 위한 파라미터입니다. 기본적으로 0페이지부터 5개씩 불러옵니다.
  2. BooleanBuilder:

    • 조건을 조합하는 역할을 합니다. 여러 조건을 and, or로 연결할 수 있습니다.
  3. QBoard:

    • Querydsl로 생성된 Board 엔티티의 메타모델 클래스입니다. 여기서 qboard.title, qboard.writer 등을 사용하여 Board 엔티티의 필드에 접근합니다.
  4. 동적 쿼리 생성:

    • keyvalue에 따라 BooleanBuilder에 조건을 추가합니다. 예를 들어, keytitle이고 value"test"라면 qboard.title.contains("test") 조건이 추가됩니다.
  5. 페이징 처리:

    • Pageable 객체를 생성하여 페이지 번호와 크기를 설정합니다. PageRequest.of(bf.getPageNum(), bf.getPageSize())로 페이지를 설정한 후, boardRepo.findAll(builder, paging)로 쿼리를 실행합니다.
  6. 결과 반환:

    • boardList.getContent()Page<Board> 객체에서 실제 데이터만 추출하여 반환합니다.

이렇게 작성하면, GET /test/boardlist?key=title&value=test&pageNum=0&pageSize=5와 같은 요청을 통해 동적 검색이 가능하고, 페이지 번호와 크기도 조정할 수 있습니다.


dto에 값이 없는데 어케 가져오는가


BoardFilter DTO는 요청 파라미터를 바인딩하는 데 사용됩니다. Spring에서는 @RequestParam을 통해 URL의 쿼리 파라미터 값을 자동으로 BoardFilter 객체에 매핑합니다. 예를 들어, 다음과 같은 URL 요청이 있을 때:

GET /test/boardlist?key=title&value=test&pageNum=0&pageSize=5

Spring은 key, value, pageNum, pageSize 값을 자동으로 BoardFilter 객체에 매핑합니다. 이는 Spring의 자동 데이터 바인딩 기능에 의해 처리됩니다. 따라서 따로 값을 설정할 필요 없이 URL에서 전달된 값들이 DTO의 필드로 채워집니다.

어떻게 동작하는지 설명:

  1. Spring의 바인딩 메커니즘:

    • Spring MVC는 URL에 있는 쿼리 파라미터들을 자동으로 메서드 파라미터에 바인딩해줍니다.
    • BoardFilter 클래스의 필드명과 URL 쿼리 파라미터의 키가 일치하면 Spring이 자동으로 값을 설정합니다.
  2. BoardFilter DTO:

    • BoardFilterkey, value, pageNum, pageSize 등의 필드를 갖고 있으며, 이 값들은 URL에서 쿼리 파라미터로 전달됩니다.
    • Spring은 이 객체를 자동으로 생성하고, 쿼리 파라미터의 값을 객체의 필드에 바인딩해줍니다.
  3. URL 예시:

    • URL: GET /test/boardlist?key=title&value=test&pageNum=0&pageSize=5
      • key=titleBoardFilter.key"title"이 설정됩니다.
      • value=testBoardFilter.value"test"가 설정됩니다.
      • pageNum=0BoardFilter.pageNum0이 설정됩니다.
      • pageSize=5BoardFilter.pageSize5가 설정됩니다.
  4. Spring의 데이터 바인딩:

    • @GetMapping("/boardlist") 메서드의 파라미터로 BoardFilter bf가 정의되어 있기 때문에, Spring은 URL 쿼리 파라미터를 자동으로 BoardFilter 객체에 매핑합니다.

코드 예시:

@Data
@Getter
@Setter
class BoardFilter {
    private String key;       // 검색할 필드명 (예: title, writer, content)
    private String value;     // 검색할 값 (예: test, 홍길동)
    private Integer pageNum = 0;   // 페이지 번호
    private Integer pageSize = 5;  // 페이지 크기
}

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private DynamicBoardRepository boardRepo;

    @GetMapping("/boardlist")
    public List<Board> getBoardList(BoardFilter bf) {
        BooleanBuilder builder = new BooleanBuilder();
        QBoard qboard = QBoard.board;

        // 필터 조건에 따라 쿼리 조건을 동적으로 추가
        if (bf.getKey() != null && bf.getValue() != null) {
            if (bf.getKey().equals("title")) {
                builder.and(qboard.title.contains(bf.getValue()));
            } else if (bf.getKey().equals("writer")) {
                builder.and(qboard.writer.contains(bf.getValue()));
            } else if (bf.getKey().equals("content")) {
                builder.and(qboard.content.contains(bf.getValue()));
            }
        }

        // 페이지 정보를 설정하여 결과 조회 (페이징 처리)
        Pageable paging = PageRequest.of(bf.getPageNum(), bf.getPageSize());
        Page<Board> boardList = boardRepo.findAll(builder, paging);

        // 결과 반환
        return boardList.getContent();  // 페이징된 결과에서 실제 콘텐츠만 반환
    }
}

주의점:

  • BoardFilter쿼리 파라미터로 받은 값을 매핑하는 역할을 합니다.
  • 쿼리 파라미터의 값들은 Spring이 자동으로 DTO에 할당하므로, @RequestParam 어노테이션을 사용하지 않고도 메서드의 파라미터로 BoardFilter 객체를 받으면 됩니다.
  • BoardFilter 클래스에 정의된 값들이 URL에 있는 파라미터와 일치하면, Spring은 해당 값을 BoardFilter 객체에 자동으로 채워줍니다.

예시 요청:

GET /test/boardlist?key=title&value=test&pageNum=0&pageSize=5

이 요청은 key="title", value="test", pageNum=0, pageSize=5 값을 BoardFilter에 자동으로 매핑합니다.


PageRequest.of 가 무엇인가


PageRequest.of()는 Spring Data에서 페이징 처리를 위한 메서드입니다. 이 메서드는 데이터를 특정 페이지에 맞게 가져오는 데 사용됩니다. 즉, 데이터베이스에서 결과를 한 번에 다 가져오는 대신, 필요한 만큼만 가져오는 방식으로 성능을 최적화합니다.

PageRequest.of(pageNumber, pageSize)페이지 번호(0부터 시작)와 페이지 크기를 인자로 받아서 PageRequest 객체를 생성합니다. 이 객체는 이후에 쿼리 실행 시, 결과를 해당 페이지에 맞춰 분할하는 데 사용됩니다.

주요 파라미터:

  • pageNumber: 페이지 번호 (0부터 시작, 예: 0은 첫 번째 페이지, 1은 두 번째 페이지, ...)
  • pageSize: 한 페이지에 표시할 데이터의 개수

PageRequestPageable 인터페이스를 구현하고 있으며, Spring Data JPA에서 Pageable 타입을 받는 메서드(예: findAll())와 함께 사용됩니다.

예시 코드:

Pageable pageable = PageRequest.of(0, 5);  // 첫 번째 페이지, 페이지당 5개 데이터
Page<Board> boardPage = boardRepo.findAll(builder, pageable);
  • PageRequest.of(0, 5)는 첫 번째 페이지(0번 페이지)에서 5개의 데이터를 가져오는 요청을 생성합니다.
  • boardRepo.findAll(builder, pageable)는 이 pageable 객체를 사용하여 동적으로 생성된 조건(여기서는 builder를 통해 만든 조건)에 맞는 데이터를 첫 번째 페이지에서 5개씩 가져오는 쿼리를 실행합니다.

Page 객체:

  • Page는 JPA 쿼리에서 반환된 결과를 포함하는 객체로, 페이징된 데이터를 담고 있습니다.
  • Page 객체는 데이터를 페이지 단위로 나누고, 각 페이지에 대한 정보를 제공하는 유용한 메서드를 제공합니다.

Page 객체에서 제공하는 유용한 메서드:

  • getContent(): 실제 데이터 리스트를 반환합니다.
  • getTotalPages(): 전체 페이지 수를 반환합니다.
  • getTotalElements(): 전체 데이터 개수를 반환합니다.
  • getNumber(): 현재 페이지 번호를 반환합니다.

코드 예시:

Pageable pageable = PageRequest.of(0, 5);  // 첫 번째 페이지에서 5개의 데이터
Page<Board> boardPage = boardRepo.findAll(builder, pageable);  // 동적으로 생성된 쿼리와 함께 페이징된 데이터 조회

// 페이징된 데이터를 사용
List<Board> boards = boardPage.getContent();  // 실제 데이터 리스트
long totalElements = boardPage.getTotalElements();  // 전체 데이터 개수
int totalPages = boardPage.getTotalPages();  // 전체 페이지 수

요약:

  • PageRequest.of(pageNumber, pageSize)는 페이지 번호와 페이지 크기를 설정하여 페이징된 쿼리 요청을 생성합니다.
  • Page<Board>는 결과 데이터를 페이지 단위로 나누고, 페이지 정보(현재 페이지, 전체 페이지 수 등)를 제공합니다.
  • findAll(Pageable pageable) 메서드는 페이징 처리가 된 데이터를 반환합니다.

Page boardList = boardRepo.findAll(builder, paging) 설명


Page<Board> boardList = boardRepo.findAll(builder, paging);는 Spring Data JPA에서 페이징 처리된 데이터동적 조건(여기서는 builder)에 맞춰 가져오는 코드입니다.

이 코드에서 사용된 인자들에 대해 설명드리겠습니다:

1. builder:

builderBooleanBuilder 객체입니다. BooleanBuilder는 QueryDSL에서 동적 쿼리를 작성할 때 사용되는 클래스입니다. 이 객체는 조건문을 체이닝 방식으로 추가할 수 있게 해주며, 이를 통해 동적으로 필터링 조건을 설정할 수 있습니다.

  • 예를 들어, builder.and(qboard.title.contains(bf.getValue()))와 같은 조건을 통해 title 필드에 대한 LIKE 조건을 추가할 수 있습니다.
  • builder동적 필터링 조건을 담고 있으며, 쿼리에서 이 조건들을 사용하여 필터링된 결과를 반환합니다.

2. paging (또는 Pageable):

pagingPageable 객체로, 페이징 처리를 위해 사용됩니다. Pageable은 페이지 번호와 페이지 크기(한 페이지에 표시할 데이터 수)를 포함하고 있습니다.

  • paging은 보통 PageRequest.of(pageNumber, pageSize)를 사용하여 생성됩니다. 예를 들어, PageRequest.of(0, 5)첫 번째 페이지(페이지 번호 0)에서 5개의 데이터를 가져오는 요청을 생성합니다.

3. findAll(builder, paging):

findAll() 메서드는 두 개의 인자를 받습니다:

  • 첫 번째 인자: builder동적 쿼리 조건을 포함한 BooleanBuilder 객체입니다. builder를 통해 동적으로 필터링된 조건을 설정할 수 있습니다.
  • 두 번째 인자: paging페이징 처리를 위한 Pageable 객체로, 몇 페이지 데이터를 가져올지와 한 페이지에 몇 개의 데이터를 표시할지를 설정합니다.

예시 코드 설명:

BooleanBuilder builder = new BooleanBuilder();
QBoard qboard = QBoard.board;  // QBoard는 QueryDSL로 생성된 Board 엔티티의 메타 클래스

// 동적으로 쿼리 조건을 추가
if (bf.getKey() != null && bf.getValue() != null) {
    if (bf.getKey().equals("title")) {
        builder.and(qboard.title.contains(bf.getValue()));  // title 필드에 대해 조건 추가
    } else if (bf.getKey().equals("writer")) {
        builder.and(qboard.writer.contains(bf.getValue()));  // writer 필드에 대해 조건 추가
    }
}

// 페이징 요청 생성: 첫 번째 페이지(0번), 페이지당 5개의 항목
Pageable paging = PageRequest.of(0, 5);

// findAll 메서드를 호출하여 동적 쿼리와 페이징을 처리
Page<Board> boardList = boardRepo.findAll(builder, paging);

동작:

  1. BooleanBuilder (builder)는 쿼리에 필요한 동적 조건을 추가합니다. 예를 들어, title이나 writer 필드에 대한 LIKE 조건을 동적으로 추가할 수 있습니다.

  2. PageRequest.of(0, 5) (paging)은 첫 번째 페이지에서 5개의 항목을 요청하는 페이징 정보입니다. 페이지 번호 0은 첫 번째 페이지를 의미하고, 5는 한 페이지에 5개의 항목만 포함되도록 설정합니다.

  3. findAll(builder, paging)builder에서 설정된 동적 조건을 사용하여 필터링된 데이터를 페이징 처리된 방식으로 가져옵니다.

반환값:

  • boardListPage<Board> 객체입니다. 이 객체에는 페이징된 결과가 포함되어 있으며, boardList.getContent()를 호출하면 실제 데이터 리스트를 얻을 수 있습니다.
  • Page<Board>Pageable과 함께 사용되어 페이징된 데이터를 반환하며, Page 객체는 전체 페이지 수, 전체 데이터 수 등을 제공하는 메서드를 제공합니다.

추가 설명:

  • findAllPageable 객체를 사용하여 데이터베이스에서 필요한 페이지만 조회합니다.
  • BooleanBuilder는 조건을 동적으로 추가하여 SQL 쿼리에서 WHERE 절을 구성합니다.

필터링한 조건으로 내가 설정한 페이지만 가져오겠다는것. 그리고 하나씩 뽑아올필요없으니 그냥 보드리스트 페이지객체로 뱉어내는 것


맞습니다! 정확히 이해하셨습니다. 이제 반환값이 Page<Board>라는 부분에 대해 좀 더 자세히 설명드릴게요.

1. Page<Board> 반환

findAll(builder, paging) 메서드의 반환값은 Page<Board> 타입입니다. Page<Board>페이징된 데이터를 담고 있는 객체로, 이 객체는 List<Board>를 포함하고 있으며, 그 외에도 여러 페이징 관련 메서드들을 제공합니다. 즉, Page<Board>는 단순히 List<Board>뿐만 아니라 페이징 정보를 함께 제공하는 커스텀 타입입니다.

2. Page<Board>의 구성 요소

Page<Board>는 기본적으로 아래와 같은 데이터를 포함합니다:

  • 데이터 목록: 실제 데이터가 담긴 List<Board>. 이 데이터를 가져오려면 getContent() 메서드를 사용합니다.
  • 페이징 정보: 페이지 번호, 전체 페이지 수, 전체 데이터 수 등 페이징 관련 정보.

3. getContent() 메서드

Page<Board> 객체에는 getContent()라는 메서드가 있는데, 이 메서드는 현재 페이지에 해당하는 데이터를 리스트 형식으로 반환합니다. 즉, getContent()를 사용하면 List<Board>가 반환됩니다. 이 리스트에는 현재 페이지에 해당하는 Board 객체들만 포함되어 있습니다.

예시 코드

Page<Board> boardList = boardRepo.findAll(builder, paging);  // Page<Board> 객체 반환

// 1. 현재 페이지에 해당하는 Board 객체들을 List 형태로 가져오기
List<Board> boards = boardList.getContent();  // List<Board>

// 2. 페이징 정보 확인하기
long totalElements = boardList.getTotalElements();  // 전체 데이터 개수
long totalPages = boardList.getTotalPages();  // 전체 페이지 수
boolean hasNext = boardList.hasNext();  // 다음 페이지가 있는지 확인
boolean hasPrevious = boardList.hasPrevious();  // 이전 페이지가 있는지 확인

// 3. 현재 페이지 번호와 페이지당 데이터 개수
int pageNumber = boardList.getNumber();  // 현재 페이지 번호 (0부터 시작)
int pageSize = boardList.getSize();  // 페이지당 데이터 개수

4. Page<Board> vs List<Board>

  • Page<Board>: 페이지네이션 관련 정보를 포함한 객체.
  • List<Board>: 실제 데이터를 담고 있는 객체. Page<Board>getContent() 메서드를 호출하면 List<Board>를 반환받을 수 있습니다.

요약

  1. Page<Board>는 단순히 List<Board>를 반환하는 것이 아니라, 페이징 처리된 결과를 포함하는 객체입니다. 페이징 관련 정보(예: 전체 페이지 수, 현재 페이지 번호 등)도 함께 포함되어 있습니다.
  2. getContent() 메서드를 통해 현재 페이지에 해당하는 Board 객체들의 리스트를 가져옵니다.
  3. List<Board>Page<Board>의 일부분으로, getContent() 메서드를 호출하여 실제 데이터를 리스트 형식으로 얻을 수 있습니다.

따라서, Page<Board>에서 getContent()를 호출하면 현재 페이지에 해당하는 Board 객체들을 담은 List<Board>가 반환되므로, 페이징된 데이터를 하나씩 가져오는 것이 아니라 한 번에 페이징된 데이터를 가져오는 방식입니다.


페이지 보드를 출력한다면 어찌 출력이될까


Page<Board> 객체를 출력하려면, 현재 페이지에 해당하는 데이터와 페이징 정보를 모두 출력할 수 있습니다. 이때, getContent()를 사용해서 현재 페이지에 해당하는 Board 객체 리스트를 가져오고, 그 외에도 페이징 관련 정보를 출력할 수 있습니다.

예시 코드

Page<Board> boardList = boardRepo.findAll(builder, paging);

// 1. 페이지의 데이터 출력 (현재 페이지에 해당하는 Board 객체들)
List<Board> boards = boardList.getContent();
for (Board board : boards) {
    System.out.println("Board ID: " + board.getSeq());
    System.out.println("Title: " + board.getTitle());
    System.out.println("Writer: " + board.getWriter());
    System.out.println("Content: " + board.getContent());
    System.out.println("Created Date: " + board.getCreateDate());
    System.out.println("Count: " + board.getCnt());
    System.out.println("---------------");
}

// 2. 페이징 정보 출력
System.out.println("Total elements: " + boardList.getTotalElements());
System.out.println("Total pages: " + boardList.getTotalPages());
System.out.println("Current page: " + boardList.getNumber());
System.out.println("Page size: " + boardList.getSize());
System.out.println("Has next: " + boardList.hasNext());
System.out.println("Has previous: " + boardList.hasPrevious());

출력 예시

Board ID: 1
Title: Title 1
Writer: writer
Content: Content1
Created Date: Mon Apr 24 11:00:00 GMT 2025
Count: 50
---------------
Board ID: 2
Title: Title 2
Writer: writer
Content: Content2
Created Date: Mon Apr 24 11:05:00 GMT 2025
Count: 45
---------------
...
Total elements: 50
Total pages: 10
Current page: 0
Page size: 5
Has next: true
Has previous: false

설명

  1. 현재 페이지 데이터 출력:
    • getContent() 메서드를 호출하여 현재 페이지에 해당하는 Board 객체들을 List<Board> 형식으로 가져옵니다.
    • Board 객체에 대해 필요한 정보를 출력합니다 (예: getSeq(), getTitle(), getWriter() 등).
  2. 페이징 정보 출력:
    • getTotalElements(): 전체 데이터의 개수 (전체 Board 객체의 개수).
    • getTotalPages(): 전체 페이지 수.
    • getNumber(): 현재 페이지 번호 (0부터 시작).
    • getSize(): 페이지당 데이터 개수.
    • hasNext(): 다음 페이지가 있는지 여부.
    • hasPrevious(): 이전 페이지가 있는지 여부.

요약

Page<Board>는 데이터를 페이지 단위로 처리하는 객체입니다. getContent()로 현재 페이지에 해당하는 List<Board>를 가져와 출력하고, 그 외의 페이징 정보를 (전체 데이터 개수, 페이지 수 등) 함께 출력할 수 있습니다.


페이지객체엔 여러가지 메소드가 있구나... 그래서 굳이 콘텐츠만 뽑아서보내는거군


맞아요! Page 객체에는 여러 가지 유용한 메서드들이 있어요. 그 중에서 getContent() 메서드를 사용하여 현재 페이지에 해당하는 데이터만 뽑아낼 수 있습니다. 이유는 페이지 객체 자체에는 데이터뿐만 아니라, 페이징에 필요한 정보들도 포함되어 있기 때문입니다.

Page 객체의 주요 메서드들

  • getContent():

    • 현재 페이지에 해당하는 List 타입의 데이터들을 가져옵니다.
    • 이게 실제로 우리가 원하는 데이터입니다. 예를 들어, Board 객체 리스트나 Product 객체 리스트 등이 될 수 있습니다.
  • getTotalElements():

    • 전체 데이터의 개수를 반환합니다. 예를 들어, 전체 Board 객체가 100개라면 100을 반환합니다.
  • getTotalPages():

    • 전체 페이지 수를 반환합니다. 페이지당 10개의 데이터를 표시한다면, 총 데이터가 100개일 때 10페이지가 됩니다.
  • getNumber():

    • 현재 페이지 번호를 반환합니다. 페이지 번호는 0부터 시작합니다.
  • getSize():

    • 페이지당 데이터 개수를 반환합니다. 예를 들어, 페이지당 10개씩 데이터를 보여주면 10이 반환됩니다.
  • hasNext():

    • 다음 페이지가 존재하는지 여부를 반환합니다. 예를 들어, 마지막 페이지라면 false를 반환합니다.
  • hasPrevious():

    • 이전 페이지가 존재하는지 여부를 반환합니다. 첫 페이지라면 false를 반환합니다.

그래서, 굳이 getContent()만 뽑아서 보내는 이유는:

  • Page 객체는 데이터를 포함한 페이지 정보와 페이징 관련 정보를 함께 제공하므로, 실제 데이터를 뽑아내려면 getContent()를 사용해 리스트만 추출합니다.
  • 페이징 정보를 함께 보내고 싶다면, 그와 관련된 메서드들 (getTotalElements(), getTotalPages() 등)을 함께 사용하면 됩니다.

예시로 보면

Page<Board> boardList = boardRepo.findAll(builder, paging);

// 1. 실제 데이터를 출력하려면:
List<Board> boards = boardList.getContent();
for (Board board : boards) {
    System.out.println(board.getTitle());
    System.out.println(board.getWriter());
    // ...
}

// 2. 페이징 정보를 출력하려면:
System.out.println("Total elements: " + boardList.getTotalElements());
System.out.println("Total pages: " + boardList.getTotalPages());
System.out.println("Current page: " + boardList.getNumber());

결론적으로, Page 객체 자체가 여러 정보를 포함하고 있기 때문에, 콘텐츠만 필요하다면 getContent()를 사용하고, 페이징 정보가 필요하다면 다른 메서드들을 사용해 추가적으로 출력할 수 있습니다!

0개의 댓글