Page

랏 뜨·2025λ…„ 1μ›” 3일

πŸ”Ž Overview

Β  λ°±μ—”λ“œ κ°œλ°œμžλ“€μ€ μ•„λ§ˆ μ ˆλŒ€λ‹€μˆ˜κ°€ CRUDλ₯Ό ν†΅ν•œ κ²Œμ‹œνŒ λ§Œλ“€κΈ° ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•œ κ²½ν—˜μ΄ μžˆμ„ 것이닀.
Β  ν•„μžλ„ λ§ˆμ°¬κ°€μ§€λ‘œ CRUDλ₯Ό ν†΅ν•œ κ²Œμ‹œνŒ λ§Œλ“€κΈ°λ₯Ό μ§„ν–‰ν•˜λ˜ 도쀑, μ΄μƒν•˜κ²Œ ν—·κ°ˆλ¦¬λ˜ κ°œλ…μ΄ μžˆμ—ˆλ‹€.
λ°”λ‘œ νŽ˜μ΄μ§• μž‘μ—…μ΄λ‹€.

Β  κ·Έλ‹Ήμ‹œμ—λŠ” μ§€κΈˆλ³΄λ‹€λ„ 훨씬 더 ν”„λ‘œκ·Έλž˜λ°κ³Ό μžλ°”μ— λŒ€ν•œ 지식이 μ μ—ˆλ‹€.
Β  κ·ΈλŸ¬λ‹€λ³΄λ‹ˆ κΈ°μ‘΄ μ§€μ‹μœΌλ‘œ μ–΄λŠμ •λ„ ν•΄κ²°ν•  수 μžˆλŠ” 기초적인 CRUD μž‘μ—…μ„ ν•˜λŠ” 것은 크게 μ–΄λ ΅μ§€ μ•Šμ•˜μ§€λ§Œ, 처음으둜 νŽ˜μ΄μ§• μž‘μ—…μ„ μ§λ©΄ν–ˆμ„ λ•Œ 땀을 뻘뻘 흘리며 κ³ μ „ν–ˆλ˜ 기얡이 μžˆλ‹€.

Β  μ§€κΈˆμ€ κ·Έλ•Œμ²˜λŸΌ νŽ˜μ΄μ§• μž‘μ—…μ— λŒ€ν•œ 어렀움이 μ—†μ§€λ§Œ, 자주 μ¨μ„œ μ΅μˆ™ν•΄μ§„ λŠλ‚Œμ΄μ§€ Page에 λŒ€ν•œ κ°œλ…μ„ μžμ„Ένžˆ μ•„λŠλƒκ³  μŠ€μŠ€λ‘œμ—κ²Œ 물어보면 κ·Έ λŒ€λ‹΅μ€ 'No'에 가깝닀.

Β  κ·ΈλŸ¬λ―€λ‘œ λ‚΄μΉœκΉ€μ— Pageλ₯Ό ν™•μ‹€ν•˜κ²Œ μ •λ¦¬ν•΄λ³΄κ³ μž 이번 ν¬μŠ€νŒ…μ„ μ§„ν–‰ν•˜κ²Œ λ˜μ—ˆλ‹€.


πŸ“• Page 객체

  • νŽ˜μ΄μ§• μž‘μ—…μ— μ‚¬μš©λ˜λŠ” 데이터 ꡬ쑰
  • Page 와 Pageable μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 νŽ˜μ΄μ§• 처리λ₯Ό μ‰½κ²Œ ν•  수 있음
  • DB 쿼리 κ²°κ³Όλ₯Ό νŽ˜μ΄μ§• μ²˜λ¦¬ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©
  • Spring Data JPA μ—μ„œ μ œκ³΅ν•˜λŠ” org.springframework.data.domain.Page λ₯Ό importν•˜μ—¬ μ‚¬μš©


πŸ“‘ Page μ£Όμš” ꡬ성 μš”μ†Œ

1) 데이터 κ΄€λ ¨

  • getContent()
    • ν˜„μž¬ νŽ˜μ΄μ§€μ— ν¬ν•¨λœ 데이터 리슀트 λ°˜ν™˜
    • νŽ˜μ΄μ§• 처리 된 데이터
  • getSize()
    • ν•œ νŽ˜μ΄μ§€ λ‹Ή 데이터 개수
  • getNumber()
    • ν˜„μž¬ νŽ˜μ΄μ§€ 번호 (0λΆ€ν„° μ‹œμž‘ν•˜λ―€λ‘œ μ λ‹Ήν•œ μ‘°μž‘ ν•„μš”)
  • getTotalElement()
    • νŽ˜μ΄μ§• 처리 된 전체 데이터 개수
  • getTotalPages()
    • νŽ˜μ΄μ§• 처리 된 전체 νŽ˜μ΄μ§€ 개수

2) νŽ˜μ΄μ§• μƒνƒœ κ΄€λ ¨

  • hasNext()
    • λ‹€μŒ νŽ˜μ΄μ§€κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ μ—¬λΆ€
  • hasPrevious()
    • 이전 νŽ˜μ΄μ§€κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ μ—¬λΆ€
  • isFirst()
    • ν˜„μž¬ νŽ˜μ΄μ§€κ°€ 첫 νŽ˜μ΄μ§€μΈμ§€ μ—¬λΆ€
  • isLast()
    • ν˜„μž¬ νŽ˜μ΄μ§€κ°€ λ§ˆμ§€λ§‰ νŽ˜μ΄μ§€μΈμ§€ μ—¬λΆ€


⏰ Page μ‚¬μš© μ‹œκΈ°

1) λŒ€λŸ‰ 데이터 쑰회

  • 데이터가 λ§Žμ•„μ„œ, DB μ—μ„œ 데이터λ₯Ό ν•œ λ²ˆμ— κ°€μ Έμ˜€λŠ” 것보닀 νŽ˜μ΄μ§€ λ‹¨μœ„λ‘œ 효율적으둜 μž˜λΌμ„œ μ‘°νšŒν•˜λŠ” 것이 쒋을 λ•Œ μ‚¬μš©

2) μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ νŽ˜μ΄μ§• 처리

  • ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ pagination UIλ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄μ„œ, μ„œλ²„μ—μ„œ 데이터λ₯Ό νŽ˜μ΄μ§€ λ‹¨μœ„λ‘œ μ œκ³΅ν•΄μ•Ό ν•  λ•Œ μ‚¬μš©

3) REST-API 응닡

  • ν΄λΌμ΄μ–ΈνŠΈκ°€ 데이터λ₯Ό νŽ˜μ΄μ§€λ³„λ‘œ μš”μ²­ν•˜μ—¬, μ ν•©ν•œ λ°©μ‹μœΌλ‘œ 응닡해야 ν•  λ•Œ μ‚¬μš©

πŸ“ Pageable κ³Ό PageRequest

1️⃣ Pageable

  • νŽ˜μ΄μ§• 정보λ₯Ό μΆ”μƒν™”ν•œ μΈν„°νŽ˜μ΄μŠ€
  • νŽ˜μ΄μ§• μ²˜λ¦¬μ— ν•„μš”ν•œ 데이터λ₯Ό 제곡
  • PageRequest 클래슀λ₯Ό 톡해 이λ₯Ό κ΅¬ν˜„
// μ£Όμš” λ©”μ„œλ“œ
public interface Pageable {
	int getPageNumber();		// ν˜„μž¬ νŽ˜μ΄μ§€ 번호 λ°˜ν™˜ (0λΆ€ν„° μ‹œμž‘)
    int getPageSize();			// νŽ˜μ΄μ§€ λ‹Ή 데이터 개수
    int getOffset();			// νŽ˜μ΄μ§• μ‹œμž‘ μœ„μΉ˜ (pageNumber * pageSize)
    Sort getSort();				// ν˜„μž¬ μ •λ ¬ 정보 λ°˜ν™˜ (Sort 객체)
    Pageable next();			// λ‹€μŒ νŽ˜μ΄μ§€μ˜ Pageable 객체 λ°˜ν™˜
    Pageable previousOrFirst();	// 이전 νŽ˜μ΄μ§€μ˜ Pageable 객체, ν˜Ήμ€ 첫 νŽ˜μ΄μ§€λ₯Ό λ°˜ν™˜
    Pageable first();			// 첫 νŽ˜μ΄μ§€μ˜ Pageable 객체 λ°˜ν™˜
    boolean hasPrevious();		// 이전 νŽ˜μ΄μ§€ 쑴재 μ—¬λΆ€ λ°˜ν™˜
}

2️⃣ PageRequest

  • Pageable μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄
  • μ‹€μ œ νŽ˜μ΄μ§• 정보λ₯Ό 생성할 λ•Œ μ‚¬μš©
  • μ •λ ¬ 정보도 ν•¨κ»˜ μ„€μ • κ°€λŠ₯
public class myPageRequest {
	int page = 0, size = 10;
    
	// νŽ˜μ΄μ§€λ‹Ή 10κ°œμ”©, 1νŽ˜μ΄μ§€ νŽ˜μ΄μ§• (pageNumberλŠ” 0λΆ€ν„° μ‹œμž‘ν•˜λ―€λ‘œ)
	PageRequest pageRequest = PageRequest.of(page, size);

	// νŽ˜μ΄μ§• + "id"λ₯Ό κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ (1)
    Sort sort = Sort.by("id").ascending();
	pageRequest = PageRequest.of(page, size, sort);
    
    // νŽ˜μ΄μ§• + "id"λ₯Ό κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ (2)
    pageRequest = PageRequest.of(page, size, Sort.by(Sort.Order.asc("id")));
    
    // νŽ˜μ΄μ§• + "id"λ₯Ό κΈ°μ€€μœΌλ‘œ λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬ (1)
    sort = Sort.by("id").descending();
    pageRequest = PageRequest.of(page, size, sort);
    
    // νŽ˜μ΄μ§• + "id"λ₯Ό κΈ°μ€€μœΌλ‘œ λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬ (2)
    pageRequest = PageRequest.of(page, size, Sort.by(Sort.Order.desc("id")));
}

πŸ’‘ Page 객체 슀슀둜 λ§Œλ“€μ–΄λ³΄κΈ°

@Getter
public class MyPage<T> {
	private List<T> content;		// νŽ˜μ΄μ§• 된 데이터
    private int pageNumber;			// ν˜„μž¬ νŽ˜μ΄μ§€ 번호
    private int pageSize;			// νŽ˜μ΄μ§€ λ‹Ή 데이터 수
    private int totalItems;			// 총 데이터 수
    private int totalPages;			// 총 νŽ˜μ΄μ§€ 수
    private boolean isFirst;		// 첫 번째 νŽ˜μ΄μ§€μΈμ§€ μ—¬λΆ€
    private boolean isLast;			// λ§ˆμ§€λ§‰ νŽ˜μ΄μ§€μΈμ§€ μ—¬λΆ€
    
    public MyPage(List<T> content, int pageNumber, int pageSize, int totalItems) {
    	this.content = content;
        this.pageNumber = pageNumber;
        this.pageSize = pageSize;
        this.totalItems = totalItems;
        this.totalPages = (int) Math.ceil((double) totalItems / pageSize);
        this.isFirst = pageNumber == 0;
        this.isLast = pageNumber == totalPages - 1;
    }
}

μ°Έκ³ ) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/

profile
기둝

0개의 λŒ“κΈ€