Day90 - [Spring]페이징, 페이지네이션

2021. 6. 23. 23:16Spring

이번에는 Spring 에서 페이징, 페이지네이션 하는 방법을 알아 봅시다.

 

페이징 하는 건 JSP 할 때도 한번 해봤었는데, 비슷합니다.

 

페이징

게시판 같은 곳에 글이 많을 때, 페이지를 나눠서 나오도록 하고 / 밑에 페이지에 대한 걸 보여주는 것을 페이징 이라고 합니다.

먼저, 게시판 테이블에 PL/SQL 문을 사용해서 데이터를 300개 추가 했습니다. ( myBatis , Lombok 등 설정된 상태 )

 

게시판의 글들을 나눠서 가져오는 방법은 아래의 코드처럼 작성해 주면 됩니다. ( oracle 공부할때 했었죠 )

이 코드에서, 숫자가 들어가는 10 , 20 만 유동적으로 바꿔주기만 하면 됩니다.

 

1 page 일 경우 게시글이 0개 ~ 10개 -> RN > (1page - 1) AND RN <= (1page * 10)

2 page 일 경우 게시글이 11개 ~ 20개 -> RN > (2page - 1) AND RN <= (2page * 10)

로 나오게 하면 되겠죠?

 

page 번호를 가지고 있을 변수와, 1페이지 당 개수를 가지고 있을 변수를 만드는데, Util 클래스에 만들어 줍시다.

만약, pageNum, amount 가 매개변수로 넘어오지 않으면, 1과, 10으로 초기화를 합니다.

 

이제, Service, Mapper 에 getList ( 게시글을 받아올 ) 메서드에 Criteria 를 매개변수로 받는 메서드를 만듭니다.

Service, Mapper 각각 메서드를 만들어 주었다면, Mapper는 ".xml" 에서 구체화를 해주면 되죠?

그러면, 위에서 사용했던 SQL문을 사용하면 됩니다.

다만 이때, < , > 기호가 태그처럼 인식이 되는데, 이를 해결하기위해서 "<![CDATA[]]>" 를 사용합니다.

[] 안은 전부 문자열로 인식하겠다 라는 뜻입니다.

 

이렇게 만들었다면, 컨트롤러에서 Service.getList 를 실행하고, 화면으로 가져가기만 하면 되겠네요

해당 코드로, 컨트롤러에서 넘어가는 view 로 "list" 라는 이름으로 위의 코드를 통한 데이터들을 가지고 갑니다.

 

view 에서는, 가지고 온 데이터들이 List 형태이기 때문에, jstl 의 <c:forEach> 를 사용해서 각각의 디자인에 맞게 뿌려줍니다.

※ 날짜는 밀리초까지 가지고 있기 때문에, formatdate 를 사용함.

그러면, 딱 BNO 기준으로 내림차순 해서 게시글이 10개만 나왔을 겁니다.

여기까지 하면, pageNum = 1, amount = 10 으로 고정이 되어 있기 때문에, 아래의 페이지네이션도 해결을 해야겠죠?

pageNation 을 계산하기 위해서는 아래와 같은 변수들이 필요합니다. 

그리고 이 변수들을, "PageVO" 클래스를 만들어서 한번에 관리를 할 거에요

※ cri 는 선생님이 나중에 필요할 것 같다고 해서 만들긴 했습니다만, 멤버변수로 존재하는 cri는 사용하지 않았습니다.

 

생성자를 통해서, 위의 변수들을 초기화 해줄 겁니다.

 

1. pageNum, amount, total, cri 는 매개변수로 받아서 초기화 합니다.

2. endPage(끝번호) 를 계산 합니다

endPage 는 페이지의 가장 끝을 나타내는게 아닌, 10, 20, 30 ... 등을 나타내는 끝 번호 입니다.

※ amount가 실수 형태로 계산이 되어야 할 상황이 있고, 정수 형태로 계산이 되어아 할 상황이 있기 때문에 변수가 아닌 숫자로 썻습니다.

 

3. startPage(시작번호) 를 계산 합니다.

startPage 는 페이지의 처음을 타나냅니다. 1, 11, 21 ... 등

4. 정말 마지막 끝번호 realEnd 를 계산 합니다

게시글이 정확히 끝나는 페이지를 계산합니다.

※ total 은 매개변수로 전달 받았는데, 게시글의 전체 개수를 전달해야 합니다. ( mapper 에 메서드를 만들어야 겠죠? )

5. endPage를 재계산 합니다.

6. next, prev 버튼 활성화 여부

7. total 을 전달하기 위해서, mapper 를 만듭니다.

service 부분에는 mapper.java 각각에 맞도록 메서드를 작성해 줍니다. 

8. Controller 에서, 위에서 만든 PageVO를 사용하고, View로 전달합니다

9. view 에서 , 페이지네이션을 작성 합니다.

 

이렇게 해주면 완성 입니다 !

 

각각의 페이지에 맞게, 게시글들을 가지고 오게 됩니다.

 

※ 여기까지 게시판을 구현할 줄 안다면, "1인분" 이라고 하세요