03B. ํ์ด์ง
03B. ํ์ด์ง ๊ด๋ จ
SBB์ ์ง๋ฌธ ๋ชฉ๋ก์ ํ์ฌ ํ์ด์ง ์ฒ๋ฆฌ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๊ฒ์๋ฌผ 300๊ฐ๋ฅผ ์์ฑํ๋ฉด ํ ํ์ด์ง์ 300๊ฐ์ ๊ฒ์๋ฌผ์ด ๋ชจ๋ ์กฐํ๋๋ค. ์ด๋ฒ ์ฅ์์๋ ํ์ด์ง(Paging)์ ์ ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋ณด์.
๋๋ ํ ์คํธ ๋ฐ์ดํฐ ๋ง๋ค๊ธฐ
ํ์ด์ง์ ๊ตฌํํ๊ธฐ ์ ์ ํ์ด์ง์ ํ ์คํธํ ์ ์์ ์ ๋๋ก ์ถฉ๋ถํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์. ๋๋์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์คํ๋ง๋ถํธ์ ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
๋ค์์ฒ๋ผ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ์.
ํ์ผ๋ช :
/sbb/src/test/java/com/mysite/sbb/
SbbApplicationTests.java
package com.mysite.sbb;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.mysite.sbb.question.QuestionService;
@SpringBootTest
class SbbApplicationTests {
@Autowired
private QuestionService questionService;
@Test
void testJpa() {
for (int i = 1; i <= 300; i++) {
String subject = String.format("ํ
์คํธ ๋ฐ์ดํฐ์
๋๋ค:[%03d]", i);
String content = "๋ด์ฉ๋ฌด";
this.questionService.create(subject, content);
}
}
}
์ด 300๊ฐ์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ค.
๋ง์ฝ ๋ก์ปฌ์๋ฒ๊ฐ ์คํ ์ค์ด๋ผ๋ฉด ๋ก์ปฌ ์๋ฒ๋ฅผ ์ค์งํ๊ณ [Run -> Run As -> Junit Test]
๋ก testJpa
๋ฉ์๋๋ฅผ ์คํํ์. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ก์ปฌ์๋ฒ๋ฅผ ์คํํ ํ์ ๋ธ๋ผ์ฐ์ ์์ ์ง๋ฌธ ๋ชฉ๋ก์ ํ์ธํด ๋ณด์.
ํ ์คํธ ์ผ์ด์ค๋ก ๋ฑ๋กํ ๋ฐ์ดํฐ๊ฐ ๋ณด์ผ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ 300๊ฐ ์ด์์ ๋ฐ์ดํฐ๊ฐ ํ ํ์ด์ง ๋ณด์ฌ์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด๋ฌํ ์ด์ ๋ก ํ์ด์ง์ ๋ฐ๋์ ํ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฑ๋กํ ๊ฒ์๋ฌผ๋ ์ต๊ทผ ์์ผ๋ก ๋ณด์ฌ์ผ ํ๋๋ฐ ๋ฑ๋กํ ์์๋ก ๋ณด์ด๋ ๋ฌธ์ ๋ ์๋ค. ์ด ๋ฌธ์ ๋ ํจ๊ป ํด๊ฒฐํด ๋ณด์.
ํ์ด์ง ๊ตฌํํ๊ธฐ
ํ์ด์ง์ ๊ตฌํํ๊ธฐ ์ํด ์ถ๊ฐ๋ก ์ค์นํด์ผ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ค. JPA ํ๊ฒฝ ๊ตฌ์ถ์ ์ค์นํ๋ JPA ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฏธ ํ์ด์ง์ ์ํ ํจํค์ง๋ค์ด ๋ค์ด์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ค์์ ํด๋์ค๋ค์ ์ด์ฉํ๋ฉด ํ์ด์ง์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
org.springframework.data.domain.Page
org.springframework.data.domain.PageRequest
org.springframework.data.domain.Pageable
์์ ์๊ฐํ ํด๋์ค๋ฅผ ์ ์ฉํด ํ์ด์ง์ ๊ตฌํํด ๋ณด์. ๋จผ์ Question
๋ฆฌํฌ์งํฐ๋ฆฌ์ ๋ค์๊ณผ ๊ฐ์ findAll
๋ฉ์๋๋ฅผ ์ถ๊ฐํ์.
ํ์ผ๋ช :
/sbb/src/main/java/com/mysite/sbb/question/
QuestionRepository.java
package com.mysite.sbb.question;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
public interface QuestionRepository extends JpaRepository<Question, Integer> {
Question findBySubject(String subject);
Question findBySubjectAndContent(String subject, String content);
List<Question> findBySubjectLike(String subject);
Page<Question> findAll(Pageable pageable);
}
Pageable
๊ฐ์ฒด๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ Page<Question>
ํ์
๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ findAll
๋ฉ์๋๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ Question
์๋น์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์.
ํ์ผ๋ช :
/sbb/src/main/java/com/mysite/sbb/question/
QuestionService.java
// (... ์๋ต ...)
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
// (... ์๋ต ...)
public class QuestionService {
// (... ์๋ต ...)
public Page<Question> getList(int page) {
Pageable pageable = PageRequest.of(page, 10);
return this.questionRepository.findAll(pageable);
}
// (... ์๋ต ...)
}
์ง๋ฌธ ๋ชฉ๋ก์ ์กฐํํ๋ getList
๋ฉ์๋๋ฅผ ์์ ๊ฐ์ด ๋ณ๊ฒฝํ๋ค. getList
๋ฉ์๋๋ ์ ์ ํ์
์ ํ์ด์ง๋ฒํธ๋ฅผ ์
๋ ฅ๋ฐ์ ํด๋น ํ์ด์ง์ ์ง๋ฌธ ๋ชฉ๋ก์ ๋ฆฌํดํ๋ ๋ฉ์๋๋ก ๋ณ๊ฒฝํ๋ค. Pageable
๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ PageRequest.of(page, 10)
์์ page
๋ ์กฐํํ ํ์ด์ง์ ๋ฒํธ์ด๊ณ 10์ ํ ํ์ด์ง์ ๋ณด์ฌ์ค ๊ฒ์๋ฌผ์ ๊ฐฏ์๋ฅผ ์๋ฏธํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ ์ ์ฒด๋ฅผ ์กฐํํ์ง ์๊ณ ํด๋น ํ์ด์ง์ ๋ฐ์ดํฐ๋ง ์กฐํํ๋๋ก ์ฟผ๋ฆฌ๊ฐ ๋ณ๊ฒฝ๋๋ค.
Question
์๋น์ค์ getList
๋ฉ์๋์ ์
์ถ๋ ฅ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก Question
์ปจํธ๋กค๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด์ผ ํ๋ค.
ํ์ผ๋ช :
sbb/src/main/java/com/mysite/sbb/question/
QuestionController.java
package com.mysite.sbb.question;
// (... ์๋ต ...)
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.data.domain.Page;
// (... ์๋ต ...)
public class QuestionController {
// (... ์๋ต ...)
@GetMapping("/list")
public String list(Model model, @RequestParam(value="page", defaultValue="0") int page) {
Page<Question> paging = this.questionService.getList(page);
model.addAttribute("paging", paging);
return "question_list";
}
// (... ์๋ต ...)
}
http://localhost:8080/question/list?page=0
์ฒ๋ผ GET ๋ฐฉ์์ผ๋ก ์์ฒญ๋ URL์์ page๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด @RequestParam(value="page", defaultValue="0") int page
๋งค๊ฐ๋ณ์๊ฐ list ๋ฉ์๋์ ์ถ๊ฐ๋์๋ค. URL์ ํ์ด์ง ํ๋ผ๋ฏธํฐ page
๊ฐ ์ ๋ฌ๋์ง ์์ ๊ฒฝ์ฐ ๋ํดํธ ๊ฐ์ผ๋ก 0์ด ๋๋๋ก ์ค์ ํ๋ค.
์คํ๋ง๋ถํธ์ ํ์ด์ง์ ์ฒซํ์ด์ง ๋ฒํธ๊ฐ 1์ด ์๋ 0์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํ
ํ๋ฆฟ์ Page<Question>
๊ฐ์ฒด์ธ paging
์ ์ ๋ฌํ๋ค. Page
๊ฐ์ฒด์๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ด ์๋ค. ๋ค์์ ์์ฑ๋ค์ ํ
ํ๋ฆฟ์์ ํ์ด์ง์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ ๊ฒ์ด๋ค.
ํญ๋ชฉ | ์ค๋ช |
---|---|
paging.isEmpty | ํ์ด์ง ์กด์ฌ ์ฌ๋ถ (๊ฒ์๋ฌผ์ด ์์ผ๋ฉด false, ์์ผ๋ฉด true) |
paging.totalElements | ์ ์ฒด ๊ฒ์๋ฌผ ๊ฐ์ |
paging.totalPages | ์ ์ฒด ํ์ด์ง ๊ฐ์ |
paging.size | ํ์ด์ง๋น ๋ณด์ฌ์ค ๊ฒ์๋ฌผ ๊ฐ์ |
paging.number | ํ์ฌ ํ์ด์ง ๋ฒํธ |
paging.hasPrevious | ์ด์ ํ์ด์ง ์กด์ฌ ์ฌ๋ถ |
paging.hasNext | ๋ค์ ํ์ด์ง ์กด์ฌ ์ฌ๋ถ |
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด์ ์ ๋ฌํ๋ ์ด๋ฆ์ธ "questionList
" ๋์ "paging
" ์ด๋ฆ์ผ๋ก ํ
ํ๋ฆฟ์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ํ
ํ๋ฆฟ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํด์ผ ํ๋ค.
ํ์ผ๋ช :
/sbb/src/main/resources/templates/
question_list.html
<html layout:decorate="~{layout}">
<div layout:fragment="content" class="container my-3">
<table class="table">
<!-- (... ์๋ต ...) -->
<tbody>
<tr th:each="question, loop : ${paging}">
<!-- (... ์๋ต ...) -->
</tr>
</tbody>
</table>
<a th:href="@{/question/create}" class="btn btn-primary">์ง๋ฌธ ๋ฑ๋กํ๊ธฐ</a>
</div>
</html>
์ด๋ ๊ฒ ์์ ํ๊ณ ๋ธ๋ผ์ฐ์ ์์ http://localhost:8080/question/list?page=0
URL์ ์์ฒญํด ๋ณด์. ๋ค์๊ณผ ๊ฐ์ด ์ฒซํ์ด์ง์ ํด๋นํ๋ ๊ฒ์๋ฌผ 10๊ฐ๋ง ์กฐํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ค์ http://localhost:8080/question/list?page=1
URL์ ์์ฒญํ๋ฉด ๋๋ฒ์งธ ํ์ด์ง์ ํด๋นํ๋ ๊ฒ์๋ฌผ์ด ์กฐํ๋๋ค.
ํ ํ๋ฆฟ์ ํ์ด์ง ์ด๋ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ
์ง๋ฌธ ๋ชฉ๋ก์์ ํ์ด์ง๋ฅผ ์ด๋ํ๋ ค๋ฉด ํ์ด์ง๋ฅผ ์ด๋ํ ์ ์๋ ["์ด์ "]
, ["๋ค์"]
๊ณผ ๊ฐ์ ๋งํฌ๊ฐ ํ์ํ๋ค. ์ด๋ฒ์๋ ์ง๋ฌธ ๋ชฉ๋ก์ ํ์ด์ง๋ฅผ ์ด๋ํ ์ ์๋ ๋งํฌ๋ค์ ์ถ๊ฐํด ๋ณด์.
.question_list.html
ํ
ํ๋ฆฟ ํ์ผ์ </table>
ํ๊ทธ ๋ฐ๋ก ๋ฐ์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํ์.
ํ์ผ๋ช :
/sbb/src/main/resources/templates/
question_list.html
<html layout:decorate="~{layout}">
<div layout:fragment="content" class="container my-3">
<table class="table">
<!-- (... ์๋ต ...) -->
</table>
<!-- ํ์ด์ง์ฒ๋ฆฌ ์์ -->
<div th:if="${!paging.isEmpty()}">
<ul class="pagination justify-content-center">
<li class="page-item" th:classappend="${!paging.hasPrevious} ? 'disabled'">
<a class="page-link"
th:href="@{|?page=${paging.number-1}|}">
<span>์ด์ </span>
</a>
</li>
<li th:each="page: ${#numbers.sequence(0, paging.totalPages-1)}"
th:classappend="${page == paging.number} ? 'active'"
class="page-item">
<a th:text="${page}" class="page-link" th:href="@{|?page=${page}|}"></a>
</li>
<li class="page-item" th:classappend="${!paging.hasNext} ? 'disabled'">
<a class="page-link" th:href="@{|?page=${paging.number+1}|}">
<span>๋ค์</span>
</a>
</li>
</ul>
</div>
<!-- ํ์ด์ง์ฒ๋ฆฌ ๋ -->
<a th:href="@{/question/create}" class="btn btn-primary">์ง๋ฌธ ๋ฑ๋กํ๊ธฐ</a>
</div>
</html>
์๋นํ ๋ง์ ์์ HTML์ฝ๋๊ฐ ์ถ๊ฐ๋์์ง๋ง ์ด๋ ต์ง ์์ผ๋ ์ฐฌ์ฐฌํ ์ดํด๋ณด์.
์ด์ ํ์ด์ง๊ฐ ์๋ ๊ฒฝ์ฐ์๋ "์ด์ " ๋งํฌ๊ฐ ๋นํ์ฑํ(disabled)๋๋๋ก ํ์๋ค. (๋ค์ํ์ด์ง์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ์ฉํ๋ค.) ๊ทธ๋ฆฌ๊ณ ํ์ด์ง ๋ฆฌ์คํธ๋ฅผ ๋ฃจํ ๋๋ฉด์ ํด๋น ํ์ด์ง๋ก ์ด๋ํ ์ ์๋ ๋งํฌ๋ฅผ ์์ฑํ์๋ค. ์ด๋ ๋ฃจํ ๋์ค์ ํ์ด์ง๊ฐ ํ์ฌ ํ์ด์ง์ ๊ฐ์ ๊ฒฝ์ฐ์๋ activeํด๋์ค๋ฅผ ์ ์ฉํ์ฌ ๊ฐ์กฐํ์(์ ํํ์)๋ ํด ์ฃผ์๋ค.
ํ์๋ฆฌํ์
th:classappend="์กฐ๊ฑด์ ? ํด๋์ค๊ฐ"
์์ฑ์ ์กฐ๊ฑด์์ด ์ฐธ์ธ ๊ฒฝ์ฐ ํด๋์ค๊ฐ์class
์์ฑ์ ์ถ๊ฐํ๋ค.
์ ํ ํ๋ฆฟ์ ์ฌ์ฉ๋ ์ฃผ์ ํ์ด์ง ๊ธฐ๋ฅ์ ํ๋ก ์ ๋ฆฌํด ๋ณด์๋ค.
ํ์ด์ง ๊ธฐ๋ฅ | ์ฝ๋ |
---|---|
์ด์ ํ์ด์ง๊ฐ ์์ผ๋ฉด ๋นํ์ฑํ | th:classappend="${!paging.hasPrevious} ? 'disabled'" |
๋ค์ ํ์ด์ง๊ฐ ์์ผ๋ฉด ๋นํ์ฑํ | th:classappend="${!paging.hasNext} ? 'disabled'" |
์ด์ ํ์ด์ง ๋งํฌ | `th:href="@{ |
๋ค์ ํ์ด์ง ๋งํฌ | `th:href="@{ |
ํ์ด์ง ๋ฆฌ์คํธ ๋ฃจํ | th:each="page: ${#numbers.sequence(0, paging.totalPages-1)}" |
ํ์ฌ ํ์ด์ง์ ๊ฐ์ผ๋ฉด active ์ ์ฉ | th:classappend="${page == paging.number} ? 'active'" |
#numbers.sequence(์์, ๋)
์ ์์ ๋ฒํธ๋ถํฐ ๋ ๋ฒํธ๊น์ง์ ๋ฃจํ๋ฅผ ๋ง๋ค์ด ๋ด๋ ํ์๋ฆฌํ์ ์ ํธ๋ฆฌํฐ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด์ง ๋ฆฌ์คํธ๋ฅผ ๋ณด๊ธฐ ์ข๊ฒ ํ์ํ๊ธฐ ์ํด ๋ถํธ์คํธ๋ฉ์ pagination
์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํ์๋ค. ํ
ํ๋ฆฟ์ ์ฌ์ฉํ pagination
, page-item
, page-link
๋ฑ์ด ๋ถํธ์คํธ๋ฉ pagination
์ปดํฌ๋ํธ์ ํด๋์ค์ด๋ค.
ํ์ด์ง ๋ฆฌ์คํธ
์ฌ๊ธฐ๊น์ง ์์ ํ๊ณ ์ง๋ฌธ ๋ชฉ๋ก์ ์กฐํํด ๋ณด์.
ํ์ด์ง ์ฒ๋ฆฌ๋ ์ ๋์์ง๋ง ํ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ ์ ์๋ค. ๋ฌธ์ ๋ ์์์ ๋ณด๋ฏ์ด ์ด๋ํ ์ ์๋ ํ์ด์ง๊ฐ ๋ชจ๋ ํ์๋๋ค๋ ์ ์ด๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ง๋ฌธ ๋ชฉ๋ก ํ ํ๋ฆฟ์ ์์ ํ์.
ํ์ผ๋ช :
/sbb/src/main/resources/templates/
question_list.html
<!-- (... ์๋ต ...) -->
<!-- ํ์ด์ง์ฒ๋ฆฌ ์์ -->
<div th:if="${!paging.isEmpty()}">
<ul class="pagination justify-content-center">
<li class="page-item" th:classappend="${!paging.hasPrevious} ? 'disabled'">
<a class="page-link"
th:href="@{|?page=${paging.number-1}|}">
<span>์ด์ </span>
</a>
</li>
<li th:each="page: ${#numbers.sequence(0, paging.totalPages-1)}"
th:if="${page >= paging.number-5 and page <= paging.number+5}"
th:classappend="${page == paging.number} ? 'active'"
class="page-item">
<a th:text="${page}" class="page-link" th:href="@{|?page=${page}|}"></a>
</li>
<li class="page-item" th:classappend="${!paging.hasNext} ? 'disabled'">
<a class="page-link" th:href="@{|?page=${paging.number+1}|}">
<span>๋ค์</span>
</a>
</li>
</ul>
</div>
<!-- ํ์ด์ง์ฒ๋ฆฌ ๋ -->
<a th:href="@{/question/create}" class="btn btn-primary">์ง๋ฌธ ๋ฑ๋กํ๊ธฐ</a>
</div>
</html>
๋ค์์ ์ฝ๋๋ฅผ ์ฝ์ ํ์ฌ ํ์ด์ง ํ์ ์ ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
th:if="${page >= paging.number-5 and page <= paging.number+5}"
์ด ์ฝ๋๋ ํ์ด์ง ๋ฆฌ์คํธ๊ฐ ํ์ฌ ํ์ด์ง ๊ธฐ์ค์ผ๋ก ์ข์ฐ 5๊ฐ์ฉ ๋ณด์ด๋๋ก ๋ง๋ ๋ค. ๋ฃจํ๋ด์ ํ์๋๋ ํ์ด์ง๊ฐ ํ์ฌ ํ์ด์ง๋ฅผ ์๋ฏธํ๋ paging.number
๋ณด๋ค 5๋งํผ ์๊ฑฐ๋ ํฐ ๊ฒฝ์ฐ์๋ง ํ์๋๋๋ก ํ ๊ฒ์ด๋ค.
๋ง์ฝ ํ์ฌ ํ์ด์ง๊ฐ 15๋ผ๋ฉด ๋ค์์ฒ๋ผ ํ์ด์ง ๋ฆฌ์คํธ๊ฐ ํ์๋ ๊ฒ์ด๋ค.
์์ฑ์ผ์ ์ญ์์ผ๋ก ์กฐํํ๊ธฐ
ํ์ฌ ์ง๋ฌธ ๋ชฉ๋ก์ ๋ฑ๋กํ ์์๋ก ๋ฐ์ดํฐ๊ฐ
ํ์๋๋ค. ํ์ง๋ง ๊ฒ์ํ์ ๊ฐ์ฅ ์ต๊ทผ์ ์์ฑํ ๊ฒ์๋ฌผ์ด ๊ฐ์ฅ ๋จผ์ ๋ณด์ด๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค. ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด Question ์๋น์ค๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์.
ํ์ผ๋ช :
/sbb/src/main/java/com/mysite/sbb/question/
QuestionService.java
// (... ์๋ต ...)
import java.util.ArrayList;
import java.util.List;
import org.springframework.data.domain.Sort;
// (... ์๋ต ...)
public class QuestionService {
// (... ์๋ต ...)
public Page<Question> getList(int page) {
List<Sort.Order> sorts = new ArrayList<>();
sorts.add(Sort.Order.desc("createDate"));
Pageable pageable = PageRequest.of(page, 10, Sort.by(sorts));
return this.questionRepository.findAll(pageable);
}
// (... ์๋ต ...)
}
๊ฒ์๋ฌผ์ ์ญ์์ผ๋ก ์กฐํํ๊ธฐ ์ํด์๋ ์์ ๊ฐ์ด PageRequest.of
๋ฉ์๋์ ์ธ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก Sort
๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ผ ํ๋ค. Sort.Order
๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋ ๋ฆฌ์คํธ์ Sort.Order
๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๊ณ Sort.by(์ํธ๋ฆฌ์คํธ)
๋ก ์ํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค. ์์ฑ์ผ์(createDate)๋ฅผ ์ญ์(Desc)์ผ๋ก ์กฐํํ๋ ค๋ฉด Sort.Order.desc("createDate")
๊ฐ์ด ์์ฑํ๋ค.
๋ง์ฝ ์์ฑ์ผ์ ์ธ์ ์ถ๊ฐ๋ก ์ ๋ ฌ์กฐ๊ฑด์ด ํ์ํ ๊ฒฝ์ฐ์๋ sorts ๋ฆฌ์คํธ์ ์ถ๊ฐํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ์์ ํ๊ณ ์ฒซ๋ฒ์งธ ํ์ด์ง๋ฅผ ์กฐํํ๋ฉด ์ด์ ๊ฐ์ฅ ์ต๊ทผ์ ๋ฑ๋ก๋ ์์ผ๋ก ๊ฒ์๋ฌผ์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ถํํ๋ค! ํ์ด์ง ๊ธฐ๋ฅ์ด ์์ฑ๋์๋ค. ํ์ด์ง์ ์ฌ์ค ๊ตฌํํ๊ธฐ ๊น๋ค๋ก์ด ๊ธฐ์ ์ด๋ค. ํ์ด์ง ํด๋์ค์ ๋์์ด ์์๋ค๋ฉด ์๋ง ์ด๋ ๊ฒ ์ฝ๊ฒ ํด๋ด๊ธฐ๋ ํ๋ค์์ ๊ฒ์ด๋ค.
์ง๊ธ๊น์ง ๋ง๋ ํ์ด์ง ๊ธฐ๋ฅ์ '์ฒ์'๊ณผ '๋ง์ง๋ง' ๋งํฌ๋ฅผ ์ถ๊ฐํ๊ณ 'โฆ' ์๋ต ๊ธฐํธ๊น์ง ์ถ๊ฐํ๋ฉด ๋ ์์ฑ๋ ๋์ ํ์ด์ง ๊ธฐ๋ฅ์ด ๋ ๊ฒ์ด๋ค.