๐Ÿšฉ[Spring Data JPA] ํŽ˜์ด์ง€๋„ค์ด์…˜

NtoZยท2023๋…„ 8์›” 4์ผ
0

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
1/1
post-thumbnail

๐ŸšฉํŽ˜์ด์ง€๋„ค์ด์…˜

๐Ÿ ํŽ˜์ด์ง€๋„ค์ด์…˜(Pagination)์ด๋ž€?

ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ •์˜

  • ์Šคํ”„๋ง(Spring)์€ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•œ ๋‹ค์–‘ํ•œ API(Spring Data JDBC, Spring Data JPA ๋“ฑ)๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ํŽ˜์ด์ง€๋„ค์ด์…˜(Pagination)โญ์€ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ์ ˆํ•œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด๋‹ค.

์Šคํ”„๋ง์—์„œ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ์ผ๋ฐ˜์  ๋ฐฉ๋ฒ•

  • Spring Data JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • Spring JDBC ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์—ฌ๊ธฐ์„œ๋Š” Spring Data JPA์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ๋‹ค.


๐Ÿ Spring Data JPA์˜ ํŽ˜์ด์ง€๋„ค์ด์…˜

ํŽ˜์ด์ง€๋„ค์ด์…˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ

  • ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ์— ํŽ˜์ด์ง•๊ณผ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก 2๊ฐ€์ง€ ํŠน๋ณ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    • org. springframework. data. domain. Sort๏ผš ์ •๋ ฌ ๊ธฐ๋Šฅ
    • org.springframework.data.domain.Pageable๏ผš ํŽ˜์ด์ง• ๊ธฐ๋Šฅ(๋‚ด๋ถ€์— Sort ํฌํ•จ)


Page, Pageable, PageRequest

  • ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋Š” Pageable์ด๋ผ๋Š” ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๋ฉด ๋œ๋‹ค. Pageable์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ๊ณ , ์ผ๋ฐ˜์ ์œผ๋กœ PageRequest.of()๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    (๐Ÿ˜Š PageRequest ํด๋ž˜์Šค๋Š” Pageable์˜ ๊ตฌํ˜„ ํด๋ž˜์Šค๋กœ ๋‹ค์–‘ํ•œ ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ of๋ฅผ ํ†ตํ•ด Pageable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.)
// Pageable ๊ฐ์ฒด๋Š” PageRequest.of๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    @Test
    public void testPagingO {
      //1 page order by bno desc
      Pageable pageable = PageRequest.of(0,10, Sort.by("bnoโ€).descending());
      Page<Board> resuLt = boardRepository.findALL(pageabLe);
    }
  • ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๊ฒฐ๊ณผ (์˜ˆ์‹œ)
select
  boardO_.bno as bnol_0_,
  boards..moddate as moddate2_0.
  boardG_.regdate as regdate3_0.
  board0_.content as content4_0.
  boarde_.title as title5_0_,
  board0_.writer as writer6_0_
from
	board boardO_
order by
	board0.bno desc limit ?

// โญ ๋ฐ˜ํ™˜ํƒ€์ž…์„ ํŽ˜์ด์ง€ ๊ด€๋ จ์œผ๋กœ ๋ฐ›์•˜์„ ๊ฒฝ์šฐ count(์ปฌ๋Ÿผ) ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
select
	count(boardO_.bno) as col_0_0_ 
from
	board boardO
  • findAll()์˜ ๋ฆฌํ„ด ํƒ€์ž…์œผ๋กœ ๋‚˜์˜ค๋Š” Page<T> ํƒ€์ž…์€ ๋‚ด๋ถ€์ ์œผ๋กœ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ํŽ˜์ด์ง€ ์กด์žฌ์—ฌ๋ถ€, ์ด์ „ ํŽ˜์ด์ง€ ์กด์žฌ์—ฌ๋ถ€, ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
// ๊ณผ๊ฑฐ์—๋Š” Slice ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ Iterable์„ ์ƒ์†๋ฐ›์•˜์—ˆ๋‹ค.
// ํ˜„์žฌ๋Š” Slice<T>๊ฐ€ Streamable<T>๋ฅผ ์ƒ์†๋ฐ›๊ณ , Streamable<T>๊ฐ€ Iterable<T>์™€ Supplier<Stream<T>>๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค.
public interface Page<T> extends Slice<T> // Slice<T>
int getNumber(); //ํ˜„์žฌ ํŽ˜์ด์ง€
int getSize(); //ํŽ˜์ด์ง€ ํฌ๊ธฐ
int getTotalPages(); //์ „์ฒด ํŽ˜์ด์ง€ ์ˆ˜
int getNumberOfElements(); //ํ˜„์žฌ ํŽ˜์ด์ง€์— ๋‚˜์˜ฌ ๋ฐ์ดํ„ฐ ์ˆ˜
long getTotalElements(); //์ „์ฒด ๋ฐ์ดํ„ฐ ์ˆ˜
boolean hasPreviousPage(); //์ด์ „ ํŽ˜์ด์ง€ ์—ฌ๋ถ€
boolean isFirstPage(); //ํ˜„์žฌ ํŽ˜์ด์ง€๊ฐ€ ์ฒซ ํŽ˜์ด์ง€ ์ธ์ง€ ์—ฌ๋ถ€
boolean hasNextPage(); //๋‹ค์Œ ํŽ˜์ด์ง€ ์—ฌ๋ถ€
boolean isLastPage(); //ํ˜„์žฌ ํŽ˜์ด์ง€๊ฐ€ ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€ ์ธ์ง€ ์—ฌ๋ถ€
Pageable nextPageable (); //๋‹ค์Œ ํŽ˜์ด์ง€ ๊ฐ์ฒด , ๋‹ค์Œ ํŽ˜์ด์ง€๊ฐ€ ์—†์œผ๋ฉด null
Pageable previousPageable ();//๋‹ค์Œ ํŽ˜์ด์ง€ ๊ฐ์ฒด, ์ด์ „ ํŽ˜์ด์ง€๊ฐ€ ์—†์œผ๋ฉด null
List<T> getContent(); //์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ
boolean hasContent(); //์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ ์กด์žฌ ์—ฌ๋ถ€
Sort getSort(); //์ •๋ ฌ ์ •๋ณด
  • Pageable๊ณผ Page๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง•์„ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

  • โญ Page๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” ํŽ˜์ด์ง• ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ฒ€์ƒ‰๋œ ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜๋ฅผ ์กฐํšŒํ•˜๋Š” count ์ฟผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ํ˜ธ์ถœํ•œ๋‹ค.

//count ์ฟผ๋ฆฌ ์‚ฌ์šฉ
Page<Member> findByName(String name, Pageable pageable);
//count ์ฟผ๋ฆฌ ์‚ฌ์šฉ ์•ˆ ํ•จ
List<Member> findByName (String name, Pageable pageable);
List<Member> findByName (String name, Sort sort);


- Sort ํด๋ž˜์Šค

  • Spring Domain ํด๋ž˜์Šค ์ค‘ org.springframework.data.domain.Sortโญ ํด๋ž˜์Šค๋Š” Spring Data ํ”„๋กœ์ ํŠธ์—์„œ DB ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค์ด๋‹ค. Spring Data JPA๋ฅผ ๋น„๋กฏํ•ด ๋‹ค์–‘ํ•œ Spring Data ๋ชจ๋“ˆ์—์„œ ์ด ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Sort ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค:

    • โ‘ ์ •๋ ฌ ์†์„ฑ๊ณผ ๋ฐฉํ–ฅ ์„ค์ •: Sort ๊ฐ์ฒด๋Š” ์ •๋ ฌ์— ์‚ฌ์šฉ๋  ์†์„ฑ๊ณผ ์ •๋ ฌ ๋ฐฉํ–ฅ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ์€ ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋ฐฉํ–ฅ์€ ์˜ค๋ฆ„์ฐจ์ˆœ(Ascending) ๋˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ(Descending)์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • โ‘ก๋‹ค์ค‘ ์ •๋ ฌ: Sort ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์†์„ฑ์— ๋Œ€ํ•ด ๋‹ค์ค‘ ์ •๋ ฌ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์ฒซ ๋ฒˆ์งธ ์†์„ฑ์œผ๋กœ ์ •๋ ฌํ•œ ํ›„, ๋™์ผํ•œ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋‘ ๋ฒˆ์งธ ์†์„ฑ์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • โ‘ขํŽ˜์ด์ง•๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ: Sort ๊ฐ์ฒด๋Š” Pageable๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋„ค์ด์…˜๋œ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ์†์„ฑ๊ณผ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ ํŠน์ • ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ ์˜ˆ์ œ
import org.springframework.data.domain.Sort;

// ๋‹จ์ผ ์†์„ฑ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ (name ์†์„ฑ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ)
Sort sort = Sort.by(Sort.Direction.ASC, "name");

// ๋‹จ์ผ ์†์„ฑ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ (name ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ)
Sort sort = Sort.by(Sort.Order.desc("name"));

// ๋‹ค์ค‘ ์†์„ฑ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ (์ฒซ ๋ฒˆ์งธ ์†์„ฑ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ , ๋™์ผํ•œ ๊ฐ’์ด ์žˆ์œผ๋ฉด ๋‘ ๋ฒˆ์งธ ์†์„ฑ์œผ๋กœ ์ •๋ ฌ)
Sort sort = Sort.by(Sort.Direction.ASC, "category").and(Sort.by(Sort.Direction.DESC, "price"));


// ๋‹ค์ค‘ ์†์„ฑ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ (category๋กœ ๋จผ์ € ์ •๋ ฌํ•˜๊ณ , ๋™์ผํ•œ category ๋‚ด์—์„œ๋Š” price๋กœ ์ •๋ ฌ)
Sort sort = Sort.by(Sort.Order.asc("category"), Sort.Order.asc("price"));

  • Pageable๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

// ์ฒซ ๋ฒˆ์งธ ํŽ˜์ด์ง€, ํŽ˜์ด์ง€๋‹น 10๊ฐœ์˜ ๊ฒฐ๊ณผ, category ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.ASC, "category"));

// ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ œ
Page<MyEntity> result = myEntityRepository.findAll(pageable);


ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•

1. JpaRepository ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†

  • Repository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  JpaRepository๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. JpaRepositoryโšก๋Š” CRUD(Create, Read, Update, Delete) ์ž‘์—…๊ณผ ํ•จ๊ป˜ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
import org.springframework.data.jpa.repository.JpaRepository;

public interface YourEntityRepository extends JpaRepository<YourEntity, Long> {
}

2. ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

  • Spring Data JPA๋Š” ํŽ˜์ด์ง•์„ ์œ„ํ•ด Pageable ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Pageableโšก์€ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ, ํŽ˜์ด์ง€ ํฌ๊ธฐ, ์ •๋ ฌ ๋ฐฉ์‹ ๋“ฑ์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

public interface YourEntityRepository extends JpaRepository<YourEntity, Long> {
    Page<YourEntity> findAll(Pageable pageable);
}

3. ์„œ๋น„์Šค๋‹จ์—์„œ DB์™€ ์—ฐ๋™๋œ ํŽ˜์ด์ง€ ๋ฐ›์•„์˜ค๊ธฐ

@Service
public class YourService {

    @Autowired
    private YourRepository yourRepository;

    public Page<YourEntity> getEntities(int page, int size) {
        PageRequest pageRequest = PageRequest.of(page, size);
        return yourRepository.findAll(pageRequest);
    }

    // ๋‹ค๋ฅธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋“ค...
}

4. ์ปจํŠธ๋กค๋Ÿฌ๋‹จ์—์„œ ํŽ˜์ด์ง€ ๋ฐ›๊ธฐ

@RestController
public class YourController {

    @Autowired
    private YourService yourService;

    @GetMapping("/entities")
    public ResponseEntity<List<YourEntity>> getEntities(@RequestParam(defaultValue = "0") int page,
                                                        @RequestParam(defaultValue = "10") int size) {
        Page<YourEntity> pageResult = yourService.getEntities(page, size);
        List<YourEntity> entities = pageResult.getContent();
        return new ResponseEntity<>(entities, HttpStatus.OK);
    }

    // ๋‹ค๋ฅธ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๋“ค...
}
  • ํ•„๋“œ์— @Autowired๋ฅผ ๋ถ™์˜€์ง€๋งŒ, ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ DI๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.
    • GPT:
      ์ƒ์„ฑ์ž ์ธ์ ์…˜์€ ๋ช…์‹œ์ ์ธ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž์— @Autowired๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ํ…Œ์ŠคํŠธ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ณ , ํด๋ž˜์Šค์˜ ์˜์กด์„ฑ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜์—ฌ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ƒ์„ฑ์ž ์ธ์ ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ํ•„๋“œ๋“ค์„ final๋กœ ์„ ์–ธํ•˜์—ฌ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ฝ”๋“œ ์•ˆ์ •์„ฑ๊ณผ ํ’ˆ์งˆ์„ ๋†’์ด๋Š”๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ”ฅ Controller์—์„œ ์ธ์ž๋ฅผ Pageable ํƒ€์ž…์œผ๋กœ ๋ฐ›์„ ๊ฒฝ์šฐ

  • Controller ๋‹จ์—์„œ ๋ฐ˜๋“œ์‹œ page, size๋ฅผ ๋ชจ๋‘ ๋ช…์‹œ์ ์œผ๋กœ ๋ฐ›์„ ํ•„์š”๋Š” ์—†๋‹ค.
    ์ธ์ž๋ฅผ Pageable ํƒ€์ž…์œผ๋กœ ๋ฐ›๋Š”๋‹ค๋ฉด Spring Data JPA ๋‚ด๋ถ€์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ „๋‹ฌ๋œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ?page=0&size=10 ๋“ฑ์„ ์ธ์‹ํ•˜์—ฌ ๋™ํƒ€์ž… ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค.

  • ์ฐธ๊ณ ) ์ด์ „ ์ฝ”๋“œ (@RequestParam ์‚ฌ์šฉ)

@Operation(summary = "Get All Member", description = "์ „์ฒด ๊ณ„์ • ์กฐํšŒ ๊ธฐ๋Šฅ")
    @GetMapping
    public ResponseEntity getAccounts(@Positive @RequestParam int page,
                                      @Positive @RequestParam int size) {
        Page<AccountPageResponseDto> accountsPage = accountService.findAccounts(page-1, size);
        List<AccountPageResponseDto> accounts = accountsPage.getContent();

        return new ResponseEntity<>(
                new MultiResponseDto<>(HttpStatusCode.OK.getStatusCode(), HttpStatusCode.OK.getMessage(), accounts, accountsPage)
        , HttpStatus.OK);
    }


๐Ÿ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ณต์‹๋ฌธ์„œ




๐Ÿ ์ถœ์ฒ˜

profile
9์—์„œ 0์œผ๋กœ, ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ๋ธ”๋กœ๊ทธ

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 8์›” 4์ผ

๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ