Backend/JPA

[JPA] Pageable ๋˜๋Š” ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋กœ Pagination ์ฒ˜๋ฆฌํ•˜๊ธฐ

th42500 2023. 1. 4. 10:48

๐Ÿ›  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

Editor : Intellij Ultimate

Deb Tool : SpringBoot 2.7.5

JDK : JAVA 11

Build : Gradle 6.8

Server : AWS EC2

DevOps : Docker

DB : MySql 8.0

Library : SpringBoot Web, MySQL, Spring Data JPA, Lombok, Spring Security

 

 

โ“ ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌ ์‹œ Orderby ์ฟผ๋ฆฌ๋ฌธ์ด 2๋ฒˆ ๋‚ ๋ผ๊ฐ„๋‹คโ“

Pageable์„ ์ด์šฉํ•œ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ ์‹œ Orderby ์ฟผ๋ฆฌ๋ฌธ์ด 2๋ฒˆ ๋‚ ๋ผ๊ฐ€๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๊ณ , ์ด๋Š” ๋น„ํšจ์œจ์ ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

CommentController์—์„œ Pageable ์‚ฌ์šฉ
CommentRepository์—์„œ Orderby๋ฅผ ์ด์šฉํ•œ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

๊ทธ ์ด์œ ๋กœ๋Š” Pageable API์˜ `@pageDefault` ์–ด๋…ธํ…Œ์ด์…˜๊ณผ JPA ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ Orderby ๋ชจ๋‘๋ฅผ ์‹คํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ ์ถ”์ธกํ•˜์˜€๋‹ค.

 

 

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ• 1๏ธโƒฃ @PageDefault ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ

JPA์—๋Š” PagingAndSortRepository ๊ฐ€ ์ถ”์ƒํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น Repository ๋Š” ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•ด ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•ด์ค€๋‹ค.

๐Ÿ‘‰ ์ด๊ฑด tmi์ง€๋งŒ, JPA์—์„œ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ธ์ค„๋„ ๋ชจ๋ฅด๊ณ  Controller์—์„œ ๋ฐ˜ํ™˜์ด ๋ ๋•Œ ์ •๋ ฌ์ด ๋˜๋Š”์ค„ ์•Œ์•˜์„ ๋•Œ๋Š” ControllerTest๋ฅผ ์ด์šฉํ•œ Page์ •๋ ฌ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด๋ฆฌ ํ•ด๋ด๋„ ์ •๋ ฌ์ด ์•ˆ๋๋˜ ๊ฒฝํ—˜์ด ์žˆ๋‹ค...๐Ÿคฆ‍โ™€๏ธ

CommentController์—์„œ Pageable๋งŒ ์ ์šฉ

@PageaDefault ๋งŒ ์‚ฌ์šฉํ•ด๋„ ๋ชฉ๋ก ์กฐํšŒ ์‹œ ์ƒ์„ฑ์ผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ Orderby๊ฐ€ ์ž˜ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ์•Œ์•„๋ณธ ๋ฐ”์˜ ์˜ํ•˜๋ฉด Spring Data JPA์˜ ๊ฒฝ์šฐ Pageable ๊ตฌํ˜„์ฒด๋ฅผ ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ์ฟผ๋ฆฌ์— ํŽ˜์ด์ง•์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Note

1๏ธโƒฃ Sort ๊ตฌํ˜„์ฒด(์ •๋ ฌ ์กฐ๊ฑด ํฌํ•จ)๋ฅผ ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

      ๐Ÿ‘‰ JpaRepository ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ PagingAndSortingRepository๋ฅผ ํ™•์žฅํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ

 

2๏ธโƒฃ Pagination ์ฒ˜๋ฆฌ ์‹œ Controller์— Sort ๋˜๋Š” Pageable์„ ์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ์ฃผ์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

      ๐Ÿ‘‰ HandlerMethodArgumentResolver์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ

 

๋ฐฉ๋ฒ• 2๏ธโƒฃ JPA ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ

CommentRepository์—์„œ JPA ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋งŒ ์ ์šฉ

JPA ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชฉ๋ก ์กฐํšŒ ์‹œ ์ƒ์„ฑ์ผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ Orderby๊ฐ€ ์ž˜ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

 

 

3๏ธโƒฃ ์–ด๋А ๊ฒƒ์ด ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ผ๊นŒ?

๊ฐœ์ธ์ ์œผ๋กœ ๋ฐฉ๋ฒ• 2๏ธโƒฃ ๋ณด๋‹ค๋Š” ๋ฐฉ๋ฒ• 1๏ธโƒฃ ์ด ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด๋ผ ์ƒ๊ฐํ–ˆ๋‹ค.

JPA ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ช…์œผ๋กœ๋„ Orderby ์ฟผ๋ฆฌ๋ฌธ์ด ์ƒ์„ฑ์ด ๋˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ๋ช…์ด ๋„ˆ๋ฌด ๋ณต์žกํ•ด์ ธ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์ ์ด ์žˆ์—ˆ๋‹ค.

๋˜ํ•œ, Pageable์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Pageable ๊ฐ์ฒด์—๊ฒŒ Orderby ์ฑ…์ž„์„ ๋งก๊ฒจ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

์ฐธ๊ณ  ๋ฌธ์„œ

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.core-concepts

 

Spring Data JPA - Reference Documentation

Example 119. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

https://tecoble.techcourse.co.kr/post/2021-07-26-jpa-pageable/

 

JPA Pagination, ๊ทธ๋ฆฌ๊ณ  N + 1 ๋ฌธ์ œ

1. Pagination ๊ฒŒ์‹œํŒ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘์†ํ•˜์—ฌ ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก์„ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ์ƒํ•ด๋ด…์‹œ๋‹ค. DB…

tecoble.techcourse.co.kr