페이징처리

Hwawon_2·2022년 3월 18일
0
post-thumbnail

페이징 처리

  • 페이징처리란 전체 목록을 한 번에 보여주지 않고
    일정 갯수씩 끊어서 페이지를 만들고
    페이지 번호에 따라 보여주는 목록을 조정해주는 것 입니다.
    MySQL에서는 쿼리문을 날릴때 limit구문을 이용해 페이지를 구현합니다.
    첫페이지 10개글만 보여주는 쿼리문

    select FROM boardtbl ORDER BY board_num DESC limit 0, 10;
    0번부터~9번 10개가 나옵니다. (1990~1999)
    2페이지를 보여줄려면

    select
    FROM boardtbl ORDER BY board_num DESC limit 10, 10;
    10번글 부터 10개가 나옵니다. (1980~1989)

공식
select
FROM boardtbl ORDER BY board_num DESC limit ((페이지-1)10), 10;
1페이지를 보는 경우 : (0
10)=0 (1페이지는 0부터 10개)
2페이지를 보는 경우 : (2-1)10=10 (2페이지는 1부터 10개)
51페이지를 보느 경우 : ((51-1)
10) = 500 (51페이지는 500부터 10개)
67페이지를 보는 경우 : ((67-1)*10) = 660 (67페이지는 600부터 10개)

BoardDao에 getBoardList()로 갑니다.
getBoardList는 getParamater가 필요없었지만 페이지 처리를 하기위해선 필요합니다.
페이징 처리를 위해 페이지 번호를 추가로 입력받습니다.

먼저 계산을 해주고
limitNum에 들어간 번호

페이지 번호를 입력받기 위해서 pageNum이란걸 요청합니다.
쿼리문은 이제
SELECT FROM boardtbl ORDER BY board_num DESC limit ?, 10";
(select
FROM boardtbl ORDER BY board_num DESC limit ((페이지-1)*1)
변경해줍니다.

?가 하나가 있으니까

1번째 물음표에는 limitNum을 집어넣어주겠다. 작성해줍니다.

BoardListService
페이지 번호를 get방식으로 가져옵니다. 저장받아 줍니다. (?pageNum=번호 형식으로 받아옵니다.

List boardList = dao.getAllBoardList()가 요구하는 자료는 글번호를 요구하기를 때문에
List boardList = dao.getAllBoardList(pNum)을 넣어줍니다.

실행해보면

10씩 나오는걸 확인할 수 있다.
2페이지를 넘어가도

10개씩 나오는걸 확인할 수 있다.
=== 여기까지 페이징 처리는 끝 ===
주소창에뒤에 ?pageNum을 안붙이이고 치면 http://localhost:8181/MyFirstWeb/boardList. 에러가난다

안되는 이유는
pageNum을 넣어줘야 하는데 페이지넘이라는 파라미터를 붙여주지는 않아서 널로 들어왔기 때문에 int로 바꾸는 과정에서 널을 어케 인트로 바꾸냐 해서 오류남

이걸 해결하기 위해서는
int로 바꾸기 전에 검사를 해줍니다.

(if스프링넘이 널이면 1이 디폴트로 들어가게 만들어준다. )
이방법도 http://localhost:8181/MyFirstWeb/boardList.do 쳤을때 들어가지지만,
?pageNum=4를 하고 뒤에 아무렇게 작성하면 또 에러가 납니다.
그래서 이 방법이 싫다하면
try catch를 쓰면 됩니다.

실행해보면
http://localhost:8181/MyFirstWeb/boardList.do?pageNum=1ㅁㄴㅇㅁㄴㅇㅁㅇㅇ이렇게 쳐도

1페이지가 잘 나오는걸 확인할 수 있습니다.

재귀호출

쿼리문에서 복사를 쉽게 할수 있음
mysql에 들어가서 복사할 것들 을 넣어주면 두배씩 들어납니다.
INSERT INTO boardTbl(title, content, writer, bdate, mdate)
(SELECT title, content, writer, bdate, mdate FROM boardTbl);

1920개인걸 확인할 수 있음.

실행해보면 1페이지에 10개씩 나오는것을 확인할 수 있다.

===페이징 처리 끝 ====

-----웹에서의 페이징 처리---

게시물 리스트 주소 뒤에 ?pageNum=번호 와 같은 형식으로
url 파라미터를 입력해서 처리합니다.
url 파라미터를 입력해서 처리 합니다.
원래 boardList.do 접속시 모든 데이터를 들거와서 화면에 뿌려주도록 설계되어있었으나, 이제 페이지 번호를 입력 안하면 자동으로 1페이지, 입력시 해당 페이지로 넘어가도록 출력하고 있습니다.

이를 위해 DAO내부의 getBoardList의 쿼리문과 내부로직을 limit을 사용한 상단 쿼리문에 적합하도록 수정해주고
SErvice 내부에서 url파라미터를 적절히 처리할 수 있도록 수정합니다.

  • 페이징 처리시 더미 데이터를 쉽게 넣을 수 있는 게시판 글 2배씩 늘리기 쿼리 INSERT INTO 테이블명 (자동입력안되는 컬럼 나열)
    (SELECT 자동립력안되는 컬럼 나열 FROM 테이블명)
    예시)
    -board_num과 bdate, mdate, hit는 default로 들어가는 값이 저정되었으므로 생략
    INSERT INTO boardTbl(title, content, writer)
    (SELECT title, content, writer FROM boardTbl);

    -네비게이션 버튼(페이지 이동 버튼)

  1. 전체 글 개수를 구합니다.

    count()를 씁니다.
    SELECT count(컬럼이름아무거나하나, 혹은 *) FROM 테이블명.
    ![]

  2. 한 페이지에 글을 몇개씩 보여줄지 정해주세요(학습시는 10개로 고정)

  3. 총 페이지 갯수를 구합니다.
    예) 강사 DB내 글 개수 현재 832개 => 페이지 84개

    a케이스 : 총 글 개수 % 페이지당 보여줄 글 개수 == 0인경우
    총 글 개수 / 페이지당 보여줄 글 개수로 처리하면 됨
    예시) 20개 글이 존재하고 페이지당 10개씩이라면 10개, 10개씩 2페이지

    b케이스 : 총 글 개수 % 페이지당 보여줄 글 개수 !=0 인경우
    총 글 개수 / 페이지당 보여줄 글 개수 => 결과값 + 1 => 최종결과값
    예) 22개 글이 존재하고 페이지당 10개씩이라면 10개, 10개, 2개씩 3페이지

  4. 현재 내가 보고있는 페이지가 어느 집단군에 속하는지 알아봅니다.페이지 버튼은 10개로 고정
    예) 내가 현재 52페이지를 보는 경우 (전체 페이지 개수 84개)
    속한 페이지 그룹은 51~60 그룹
    [1~10][11~20] [21~30][31~40] [41~50][51~60] [61~70][71~80] [81~84]
    52페이지를 조회시 시작페이지는 51이고 끝은 60페이지 입니다. 이를 도출해내기 위해서
    1)52를 페이지버튼 그룹 개수(10개) 로 나눕니다.
    52 / 10 = 5가 나오는데,
    그러나 51~60그룹에 속하지 않는 50도 10으로 나누면 5가 나옵니다. 50 / 10 = 5
    52가 속한 그룹과 50이 속한 그룹이 다른데 숫자가 똑같이 5로 나오기 때문에
    52 % 10 !=0
    50 % 10 == 0 (41 ~50 구간)을 이용해 % 10 연산시 0이 나오는 경우 구한 값에서 1을 빼주고 그렇지 않으면 나온 숫자를 그대로 활용합니다.

    *( 페이지 번호 -1 ) / 10 을 같은 숫자가 구해집니다.

현재 내가 보고잇는 페이지 그룹의 시작 번호 구하기(52번을 보고 있음)
시작번호 51을 도출해내기 위해서
(페이지 번호 -1) / 10혹은 페이지 번호 % 10 != 0 인경우
결과숫자 10 + 1 을 하면 시작페이지가 구해집니다.
ㅇㅖ)
52의 결과 숫자 => 5,(52 % 10 != 0이므로, 52 / 10을 해서 5를 구하거나 혹은 (52-1) / 10)
5
10 + 1 = 51이 해당 그룹의 시작번호가 됩니다.
50의 결과숫자 => 4,(50 % 10 == 0이므로. 50 / 10 을해서 구한 5에 1을 빼거나 혹은 (50-1)/10)
4 * 10 + 1 = 41이 해당 그룹의 시작번호가 됩니다.

끝 페이지는 위에서 구한 시작페이지 번호에 9글 더하면 끝 페이가 나옵니다.

단, 예외적으로 마지막 페이지 그룹의 경우 (예시는 [81 ~84] 그룹 ) +9를 한다고 결과가 맞게 나오지 않을수도 있는 문제가 발생합니다.

그래서 해결방식은 현재 전체 페이지의 마지막 번호가 84번인것은 구해났기 때문에

시작번호 + 9 <= 마지막 번호 인 경우는 그대로 진행
(51 + 9 <= 84이므로 51~60구간은 그대로 10개 출력 가능)

시작번호 +9 > 마지막 번호인 경우는 (시작번호 + 9) 대신 마지막 번호가 마지막 페이지지로 적용되면 됩니다.
(84 + 9 > 84 이므로, 81~90구간은 그냥 90대신 84를 마지막으로 적용해 출력)

profile
코딩 일기장

0개의 댓글