본문 바로가기
개발자/백엔드 웹 개발자 과정(국비)

[jsp]페이징

by 초응 2023. 1. 20.

페이징은 웹의 핵심 기술이다.

페이징을 하지 않을 경우 해당 데이터를 조회할 때마다 많은 데이터를 가져와야 하는 데이터 부담이 있고 보기 어렵다.

내가 가지고 있는 데이터를 한번에 보여주는 것이 아닌 페이지를 쪼개 사용자가 원하는 데이터의 양만큼 보여주는 것.

 

면접 시 게시판을 만들 수 있는지 물어보는 것은 페이징 구현을 할 수 있는지 물어보는 것과 같다.

 

[페이징 구현 방법]

1. 코드를 이용하여 페이지를 보여주는 방법.

2. 데이터베이스에서 작업하는 방법.

 

*페이징 주요 구성요소*

1. 총 게시글 (db)

2. 한페이지에 보여줄 리스트 수 (내맘) (몇 개씩 보여줄 건지 보여줄 글 수)

3. 한번에 보여줄 페이지 수 (내맘)

4. 현재 사용자의 페이지 위치 (사용자) - 핵심요소


- 총 게시글 DB로부터 가져오기

 

sql = "select count(*) from jsp_bbs"; 

 

bbsList.jsp에서 호출.


 

주요 구성요소 파악후 다음.

 

1. 총 페이지수 구하기

총 페이지수 = (총 게시글 수 / 보여줄 리스트 수) +1 ;

if (총 게시글 수% 보여줄 리스트 수 ==0){

총페이지 수 =-1;

}

 

ex ) (총 게시글 6 / 보여줄 글 수 5 = 1페이지 ) 그럼 하나 출력 안됨. 그래서 +1을 해준다.

ㄴ 이렇게 되면 총 게시글이 5인데 나눠서 딱 떨어지게 되는데도 빈 페이지가 하나 더 생기므로

나눠 딱 떨어지면 -1을 추가해 준다.

ㄴ 총 게시글 수/ 보여줄 리스트 수에서 나머지가 있으면 +1을 하는 것보다 처음부터 더 한 후 나눠떨어질 때 빼는 것이 효율적.

 

2. 사용자가 현재 위치한 페이지의 그룹 구하기

사용자 그룹 = 현재 사용자 페이지 위치 / 페이지 수 ;

if(현재 사용자 페이지 위치% 보여줄 페이지 수 ==0){

사용자 그룹 -1;

}

 

ex) 현재 사용자 위치 3 / 보여줄 페이지수 5개 보여줌;

1~4= 0 이지만 5=는 1그룹으로 넘어감

그래서 나눠 딱 떨어지는 경우에 -1을 해준다.

사용자 위치 3 , 사용자가 속한 그룹은 1~5 로 0그룹에 속함.

사용자 위치 7, 사용자가 속한 그룹 6~10으로 1그룹에 속함.

 

3. 사용자가 그룹의 범위 구하기

for( int i = (사용자그룹 * 보여줄 페이지 수) +1;

i<=(사용자 그룹*보여줄 페이지 수 )+보여줄 페이지 수;

i++){

if (i==총 페이지수){

break;

}

ex) 사용자 페이지 위치 3이면 사용자 0그룹에 속하고 1~5가 보여줘야한다.

그룹 0* 보여줄페이지수 5 =0 거기에 1을 더해주면 시작 수는 1이고

그룹0 *보여줄 페이지 5 = 0 거기에 보여줄 페이지수 5를 더해주면 5

따라서 시작 1 ~ 끝 5 의 페이지가 보여진다.

사용자자가 7페이지에 있으면 1그룹에 속해있고 (6~10)이 보여져야한다.

그룹 (1) * 보여줄 페이지수 (5) =(5) 거기에 1을 더해주면 시작수 6

그룹(1) * 보여줄 페이지 수 (5) = (5) 거기에 보여줄 페이지수 5를 더하면 10 ( 시작은 6 끝은 10)

 

3. 현재 사용자위치는 파라미터로 받기

- 처음은 1로 설정해준다 (null일경우 1로 세팅)

 
사진 삭제

사진 설명을 입력하세요.


4. 페이징 쿼리

모든 데이터를 가져와서 페이지로 나누는것보다 데이터베이스에서 보여질 데이터들만 가져오는것이 좋다.( 가져올 데이터가 많을수록 느려짐)

rownum : 데이터베이스에서 row의 순번을 지정해주는 함수이다.

중간에 데이터가 삭제된다고해도 새로운 순번을 매번 정의하기때문에 괜찮다. 1부터 시작한다.



select * from (select rownum as rnum,a.* from (select * from jsp_bbs order by idx desc)a)b where rnum>=(3-1)*5+1 and rnum<=3*5

 

1. select * from jsp_bbs order by idx desc () 묶고

2. rownum을 구해준다.

select rownum as rnum , a.* from

(select * from jsp_bbs order by idx desc) a

 

3.select는 마지막에 실행되기때문에 rownum이 아직 생성되지 않은 상태여서 where절에 rownum컬럼을 이용할수 없다. 그래서한번 더 묶는다.

where rnum>=시작게시글 and rnum<=끝게시글

시작게시글 : (현재 사용자 페이지 위치-1) * 보여줄리스트 수 +1

끝 게시글: 현재 사용자 페이지위치*보여줄리스트 수

ex)현재 사용자페이지가 2에 위치한다면 게시글이 최신순으로 11~20번이 보여져야한다.

 

ㄴ이해안되면 그냥 통째로 외우는것도 좋은방법.....

select * from (select rownum as rnum,a.* from (select * from jsp_bbs order by idx desc)a)b

where rnum >= ? and rnum <= ?

 

- 쿼리안에서 계산X , 별도로 계산하여 ? 에 값 넣기.