skill/Java.Kotlin

Spring Boot JPA Paging 처리 _ Kotlin

have a nice day :D 2021. 5. 12. 08:59
반응형

Kotlin | SpringBoot2.4.2 | JPA | mustache

 

JPA 페이징 설정
import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable
import org.springframework.data.jpa.repository.JpaRepository

interface TestRepository: JpaRepository<Test, Int> {
    fun findByOrderBySeq(pageable: Pageable): Page<ListVo>?
    fun findByTitleOrderBySeq(pageable: Pageable, title: String): Page<ListVo>?
}

- JPA 함수에 Pageable 타입의 파라미터 입력 시, 페이징 정보 들어감.

- 결과값으로 Page<VO> 를 넣어주면, DB 결과 List 및 페이징 정보 함께 전달.

* JPA에서 결과를 Entity를 기본으로 받으나, 원하는 결과만 추출하고 싶을때는 VO 타입을 사용 할 수 있다.

(예, 사용자 정보에서 비밀번호를 빼고 받고 싶을 때, VO로 결과를 받아서 처리)

 

Controller 설정
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.data.domain.PageRequest
import org.springframework.data.domain.Pageable
import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.web.bind.annotation.*
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

@Controller
@RequestMapping("/test")
class TestViewController {

    @Autowired
    lateinit var testRepository: TestRepository

    @RequestMapping("list")
    fun faq(request: HttpServletRequest
            , response: HttpServletResponse
            , model: Model
            , @RequestParam("size", defaultValue = "10") size: Int
            , @RequestParam("page", defaultValue = "0") page: Int
            , pageable: Pageable
    ): String {
        model.addAttribute("list", testRepository.findByOrderBySeq(PageRequest.of(page, size)))
        return "test/list"
    }
}

- URL에 [host]/test/list?page=1&size=10 이렇게 주면 JPA 인자에 pageable만 넣어도 됨. (또는 기본값을 사용 하고 싶을때)

- URL에 페이징 타입을 GET으로 선언은 안하기에, 호출 부에 파라미터로 받고, JPA 함수 인자에 PageRequest.of(page,size)로 넣음.

 

List 정보
{
    "result": {
        "content": [
            {
                "seq": 17,
                "title": "test17",
                "creDttm": "2021-02-18T12:17:10"
            },
            {
                "seq": 16,
                "title": "test16",
                "creDttm": "2021-02-17T11:13:11"
            },
            {
                "seq": 15,
                "title": "test15",
                "creDttm": "2021-02-16T10:12:13"
            }
        ],
        "pageable": {
            "sort": {
                "unsorted": true,
                "sorted": false,
                "empty": true
            },
            "offset": 0,
            "pageNumber": 0,
            "pageSize": 3,
            "paged": true,
            "unpaged": false
        },
        "last": false,
        "totalPages": 6,
        "totalElements": 17,
        "numberOfElements": 3,
        "number": 0,
        "first": true,
        "sort": {
            "unsorted": true,
            "sorted": false,
            "empty": true
        },
        "size": 3,
        "empty": false
    }
}

- 결과를 result에 담아 전달

- result.content : DB 조회 목록 정보

- result.pageable : Page 정보인 듯 하나, 아래 정보 사용.

- result.totalPages : 전체 페이지 수

- result.size : 한 페이지 당 몇개의 목록이 표시 되는지

- result.totalElements : 전체 목록 수

- result.number : 현재 페이지 정보

 

Form 전송
<form name="pageForm" actoin="/test/list" method="post">
	<input type="hidden" name="page" value=""/>
</form>

- 보통 size는 기본값을 사용함으로, 페이지 정보만 넘김.

- post로 넘겨야 URL에 파라미터가 표시 되지 않음.

 

반응형