๐ŸŒ โ€œ๋‚ด Spring Boot API๊ฐ€ ๋А๋ ค์กŒ์–ด์š”โ€ฆ Pagination & Sorting์„ ๋ฐฐ์šฐ๊ธฐ ์ „๊นŒ์ง€โ€

๋ฐœํ–‰: (2026๋…„ 1์›” 13์ผ ์˜คํ›„ 02:18 GMT+9)
5 min read
์›๋ฌธ: Dev.to

Source: Dev.to

Cover image for ๐ŸŒ โ€œMy Spring Boot API Became Slowโ€ฆ Until I Learned Pagination & Sortingโ€

์ •๋ ฌ ๋ฐ ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์ค‘์š”ํ•œ ์ด์œ 

์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š”:

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•œ๋‹ค
  • ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค
  • ํด๋ผ์ด์–ธํŠธ๋Š” ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฑฐ์˜ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค

์ •๋ ฌ๊ณผ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด:

  • ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ์†Œ
  • ๋” ๋น ๋ฅธ API ์ œ๊ณต
  • ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ ๊ตฌ์ถ•

์ด๋Š” ํ”„๋กœ๋•์…˜ ๋ฐฑ์—”๋“œ์—์„œ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ์ฟผ๋ฆฌ ์ด๋ฆ„์„ ์ด์šฉํ•œ ์ •๋ ฌ

Spring Data JPA๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„์— ์ง์ ‘ ์ •๋ ฌ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

List findAllByOrderByNameAsc();
List findAllByOrderByNameDesc();

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์ž˜ ๋™์ž‘ํ•œ๋‹ค:

  • ์ •๋ ฌ ๋กœ์ง์ด ๊ณ ์ •๋ผ ์žˆ์„ ๋•Œ
  • ์š”๊ตฌ์‚ฌํ•ญ์ด ๋‹จ์ˆœํ•  ๋•Œ

ํ•˜์ง€๋งŒ ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋™์  ์ •๋ ฌ์ด ํ•„์š”ํ•˜๋‹ค.

Sort ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ๋™์  ์ •๋ ฌ

๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ฉ”์„œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ ฌ

List findByDepartment(String department, Sort sort);

์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค:

  • ์–ด๋–ค ํ•„๋“œ๋กœ ์ •๋ ฌํ• ์ง€
  • ์˜ค๋ฆ„์ฐจ์ˆœ ๋˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ

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

Sort sort = Sort.by(Sort.Direction.ASC, sortField);

์—ฌ๋Ÿฌ ์ •๋ ฌ ํ•„๋“œ ์ง€์ •:

Sort sort = Sort.by(
    Sort.Order.asc("name"),
    Sort.Order.desc("salary")
);

์ •๋ ฌ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•œ ์ด์œ 

์ •๋ ฌ์„ ์ ์šฉํ•˜๋”๋ผ๋„:

  • ์ˆ˜์ฒœ ๊ฐœ์˜ ํ–‰์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค
  • API๊ฐ€ ๋А๋ ค์ง„๋‹ค
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํฐ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ํž˜๋“ค๋‹ค

์ด๋•Œ ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ํ•„์š”ํ•˜๋‹ค.

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

ํ•ต์‹ฌ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ฐœ๋…

Page

๋ฐ์ดํ„ฐ์˜ ํ•œ ์กฐ๊ฐ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๋‹ค์Œ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค:

  • ์ „์ฒด ์š”์†Œ ์ˆ˜
  • ์ „์ฒด ํŽ˜์ด์ง€ ์ˆ˜
  • ํ˜„์žฌ ํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ

Pageable

๋‹ค์Œ ํ•ญ๋ชฉ์„ ์ •์˜ํ•œ๋‹ค:

  • ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ
  • ํŽ˜์ด์ง€ ํฌ๊ธฐ
  • ์ •๋ ฌ ๊ทœ์น™

PageRequest

Pageable์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์œผ๋กœ, ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ Pageable ์‚ฌ์šฉํ•˜๊ธฐ

Spring Data JPA๋Š” ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

Page findAll(Pageable pageable);
Page findByLastName(String lastName, Pageable pageable);

SQL๋„ ์—†๊ณ  ๋ณต์žกํ•œ ๋กœ์ง๋„ ์—†๋‹ค. ๊น”๋”ํ•œ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค.

Pageable ์ธ์Šคํ„ด์Šค ๋งŒ๋“ค๊ธฐ

Pageable pageable = PageRequest.of(
    pageNumber,
    size,
    Sort.by("lastName").ascending()
);

์ด๋ฅผ ํ†ตํ•ด ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€:

  • ํŽ˜์ด์ง€ ํฌ๊ธฐ
  • ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ
  • ์ •๋ ฌ

๋ชจ๋‘ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์— ๋‹ด๋Š”๋‹ค.

๋‚ด๊ฐ€ ์ €์ง€๋ฅธ ์‹ค์ˆ˜

์˜ˆ์ „์—๋Š”:

  • ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ด
  • ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ ์ •๋ ฌํ•จ
  • ํ™•์žฅ์„ฑ์„ ๋ฌด์‹œํ•จ

๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•  ๋•Œ๊นŒ์ง€๋Š” ๋™์ž‘ํ–ˆ์ง€๋งŒ, ํŽ˜์ด์ง€๋„ค์ด์…˜๊ณผ ์ •๋ ฌ์„ ๋„์ž…ํ•œ ๋’ค:

  • API๊ฐ€ ๋นจ๋ผ์กŒ๋‹ค
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ์†Œํ–ˆ๋‹ค
  • ๋ฐฑ์—”๋“œ๊ฐ€ ํ”„๋กœ๋•์…˜ ์ˆ˜์ค€์ด ๋˜์—ˆ๋‹ค

๋งˆ๋ฌด๋ฆฌ ์ƒ๊ฐ

์ •๋ ฌ๊ณผ ํŽ˜์ด์ง€๋„ค์ด์…˜์€ โ€œ๋ถ€๊ฐ€ ๊ธฐ๋Šฅโ€์ด ์•„๋‹ˆ๋‹ค. ํ•ต์‹ฌ ๋ฐฑ์—”๋“œ ๊ธฐ๋ณธ์ด๋‹ค. ๋งŒ์•ฝ Spring Boot API๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๋ณด์ธ๋‹ค๋ฉด:

  • ๋А๋ฆผ
  • ๋ฌด๊ฑฐ์›€
  • ํ™•์žฅ ์–ด๋ ค์›€

์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ผ.

์ด ๊ธ€์€ Spring Boot๊ณผ ์‹ค์ œ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ํƒ๊ตฌํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•œ learning-in-public ์—ฌ์ •์˜ ์ผ๋ถ€์ด๋‹ค.

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

Spring Boot์—์„œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ Enum ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์ฝ๋‚˜์š”?

์†Œ๊ฐœ: ์ „์ž ์ƒ๊ฑฐ๋ž˜ ์‚ฌ์ดํŠธ์—์„œ ์ œํ’ˆ์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ๋“œ๋กญ๋‹ค์šด์—์„œ ORDER=ASC ๋˜๋Š” ORDER=DESC๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋’ค์—์„œ ๋ฐฑ์—”๋“œ๋Š”โ€ฆ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜ ๋ˆ„์ˆ˜

์†Œ๊ฐœ ์šฐ๋ฆฌ๋Š” memory leaks์— ๋Œ€ํ•ด ์ž์ฃผ ์ด์•ผ๊ธฐํ•˜์ง€๋งŒ, backend development์—์„œ ๋˜ ๋‹ค๋ฅธ ์กฐ์šฉํ•œ ์„ฑ๋Šฅ ์ €ํ•ด ์š”์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค: Database Transaction Leaks. ๋‚˜๋Š” ์ตœ๊ทผ์— ...