๐Ÿ”ฅ TIL - Day 48

Kim Dae Hyunยท2021๋…„ 11์›” 5์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
57/93

ํŽ˜์ด์ง•๊ณผ ์ •๋ ฌ์„ ์ง€์›ํ•˜๋Š” ์กฐํšŒ API๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

๐Ÿ“Œ Controller ์ฒ˜๋ฆฌ

ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ

  • page: ์š”์ฒญ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ
  • size: ํ•œ ํŽ˜์ด์ง€์—์„œ ๋ณด์—ฌ์ค„ ์š”์†Œ ์ˆ˜
  • isAsc: ์˜ค๋ฆ„์ฐจ์ˆœ or ๋‚ด๋ฆผ์ฐจ์ˆœ
  • sortBy: ์ •๋ ฌ์˜ ๊ธฐ์ค€์ด ๋  ํ•„๋“œ์ด๋ฆ„

ex)
/api?page=1&size=10&isAsc=true&sortBy=title

1ํŽ˜์ด์ง€์—์„œ 10๊ฐœ๋ฅผ ์ œ๋ชฉ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ฃผ์„ธ์š”.


๐Ÿ“Œ Service ์ฒ˜๋ฆฌ

ํŽ˜์ด์ง•์„ ์œ„ํ•ด Pageable ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
Pageable๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” static ๋ฉ”์„œ๋“œ๊ฐ€ PageRequest์— ์žˆ๋‹ค. ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค.

  • ํŽ˜์ด์ง•์„ ์œ„ํ•ด Pageable ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ
  • Pageable ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด PageRequest์˜ ์ •์  of ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ

PageRequest ๋Š”

  • ํ˜„์žฌ ํŽ˜์ด์ง€
  • ํŽ˜์ด์ง€ ๋‹น ์š”์†Œ ์ˆ˜
  • ์ •๋ ฌ ( Sort )
    • ์ •๋ ฌ๋ฐฉํ–ฅ ( Sort.Direction )
    • ์ •๋ ฌ๊ธฐ์ค€ ํ•„๋“œ

๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ Pageable ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

ํ˜„์žฌ ํŽ˜์ด์ง€์™€ ํŽ˜์ด์ง€ ๋‹น ์š”์†Œ ์ˆ˜๋Š” Controller๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ page์™€ size๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ •๋ ฌ๋ถ€๋ถ„๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.


์ •๋ ฌ์˜ ๊ฒฝ์šฐ Sort ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.
Sort ๊ฐ์ฒด์—๋Š” ์ •๋ ฌ๋ฐฉํ–ฅ, ์ •๋ ฌ๊ธฐ์ค€ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ๋‹ค.

์ •๋ ฌ๋ฐฉํ–ฅ์€ Sort ํด๋ž˜์Šค ์•ˆ์— ์žˆ๋Š” static enum ํด๋ž˜์Šค์ธ Direction์„ ์‚ฌ์šฉํ•œ๋‹ค.

Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;

์ •๋ ฌ๊ธฐ์ค€ ํ•„๋“œ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” ์ฒ˜์Œ ์•Œ์•˜๋‹ค.
์ •์งํ•˜๊ฒŒ ํ•„๋“œ์˜ ์ด๋ฆ„์„ ๊ทธ๋Œ€๋กœ Sting ํƒ€์ž…์œผ๋กœ Sort์— ๋„˜๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

Sort์˜ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. (by)
properties๋กœ ์ •๋ ฌ๊ธฐ์ค€ ํ•„๋“œ๋ฅผ ๋ฐ›๋Š”๋ฐ ๊ฐ€๋ณ€์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. ๋งŒ์•ฝ ์ •๋ ฌ๊ธฐ์ค€์ด ๋‘ ๊ฐœ ์ด์ƒ์ด๋ผ๋„ ์ž˜ ์ฒ˜๋ฆฌํ•ด ์ค„ ๊ฒƒ ๊ฐ™๋‹ค.

Sort ๊ฐ์ฒด์ƒ์„ฑ

Sort sort = Sort.by(direction, "ํ•„๋“œ์ด๋ฆ„", ...);

Service ์ธก ํ๋ฆ„์ •๋ฆฌ

  • ์ •๋ ฌ Sort.by(์ •๋ ฌ๋ฐฉํ–ฅ, ์ •๋ ฌ๊ธฐ์ค€ํ•„๋“œ)
    • ์ •๋ ฌ๋ฐฉํ–ฅ (Sort.Direction)
  • Pageable ์ƒ์„ฑ
    • PageRequest.of(ํ˜„์žฌํŽ˜์ด์ง€, ํŽ˜์ด์ง€ ๋‹น ์š”์†Œ์ˆ˜, ์ •๋ ฌ)

๐Ÿ“Œ Repository ์ฒ˜๋ฆฌ

์กฐํšŒ์กฐ๊ฑด์ด ์žˆ๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋„ค์ด๋ฐ์ฟผ๋ฆฌ + ์ธ์ž๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ค‘์š”ํ•œ ๊ฒƒ์€ Pageable์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ณ  ๋ฆฌํ„ดํƒ€์ž…์„ ์ปฌ๋ ‰๋ ฅ ๋Œ€์‹  Page๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Page<์—”ํ‹ฐํ‹ฐ_ํƒ€์ž…> findAll(Pageable pageable);

๐Ÿ“Œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋‚ด๋ ค์ค„ ๊ฐ’

ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ํŽ˜์ด์ง•์„ ์œ„ํ•ด ๊ฐ€์ ธ์•ผ ํ•  ๊ฐ’์„ ์ƒ๊ฐํ•ด๋ณด์ž.

  • ํŽ˜์ด์ง• ๋œ ์กฐํšŒ๊ฒฐ๊ณผ
  • ์ด ํŽ˜์ด์ง€ ์ˆ˜ (๋ฒ„ํŠผ์„ ๋ช‡ ๊ฐœ ๋ฐฐ์น˜ํ•ด์•ผ ํ•  ์ง€)
  • ํ˜„์žฌ ํŽ˜์ด์ง€ (ํ˜„์žฌ ํŽ˜์ด์ง• ๋ฒ„ํŠผ ํ™œ์„ฑํ™” ์ฒ˜๋ฆฌ)
  • ์ฒซ ํŽ˜์ด์ง€์ธ์ง€, ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€์ธ์ง€ (boolean)

์ผ๋‹จ ์ด์ •๋„๋งŒ ์žˆ์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ๋„ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•  ๊ฒƒ ๊ฐ™๋‹ค.
JPA๋ฅผ ํ†ตํ•ด์„œ ์–ป์€ Pageํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๊ทธ๋ƒฅ ํด๋ผ์ด์–ธํŠธ ์ชฝ์œผ๋กœ ๋ฆฌํ„ดํ•ด๋ณด์ž.

  • content: ํŽ˜์ด์ง• ๋œ ์กฐํšŒ๊ฒฐ๊ณผ
  • totalPages: ์ด ํŽ˜์ด์ง€ ์ˆ˜
  • number: ํ˜„์žฌ ํŽ˜์ด์ง€
  • first / last: ์ฒซ ํŽ˜์ด์ง€, ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€

๊ทธ๋ƒฅ Page ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‚ด๋ ค์คฌ๋Š”๋ฐ ํ•„์š”ํ•œ ๋ถ€๋ถ„์ด ๋‹ค ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค..

Page ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ๋‚ด๋ ค์ฃผ๋Š” ๊ฒƒ๋„ ํฌ๊ฒŒ ์ƒ๊ด€์€ ์—†์„ ๊ฒƒ ๊ฐ™์€๋ฐ ์ง์ ‘ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์‘๋‹ต๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์„œ ๋‚ด๋ ค์ฃผ๋Š” ๊ฒƒ๋„ ๊น”๋”ํ•˜๊ณ  ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

profile
์ข€ ๋” ์ฒœ์ฒœํžˆ ๊นŒ๋จน๊ธฐ ์œ„ํ•ด ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๐Ÿง

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