DB 게시판 번호 - DB gesipan beonho

게시판 글 번호 구하기

게시판 페이징을 구현하고 나서 각 페이지에 글 번호를 주어야 하는데

여러 방법이 있을수도 있는데 나는 이렇게 했다.

우선 준비물은 3가지

※ buy는 제가 구매게시판을 만드느라 붙였습니다.

$page 

//페이징 번호이다. 1페이지 2페이지 ...

$buyCnt

//쿼리를 이용해 row로 숫자를 구한다. ex)$buyCnt = mysql_num_rows($buyRs); 

mysql_num_rows() 함수는 row갯수를 구해준다. row는 한 페이지에 몇 개의 글 목록을 보여주는지 결정해준다.

$buyTotalCount 

//db에 있는 총 게시글 갯수이다. 구하는 방법은

$countSql = "select count(*) cnt from 게시판DB명;

$countRs = mysql_query($countSql);

$countData = mysql_fetch_array($countRs);

$buyTotalCount = $countData['cnt'];

이런식으로 구해주면 총 몇 개의 글이 있는지 숫자로 보여준다.

우선 나는 $buyCnt가 50이 나왔으니 한 페이지당 50개씩 글 목록을 불러온다.

먼저 완성소스이다.

//결과 출력

<?

for($i=0;$i < $buyCnt;$i++){

	$buy = mysql_fetch_array($buyRs);						



	if($buyCnt != 50) //글 목록이 50개가 아니라면

		$buyCnt = 50; //50개라 가정하고 계산



	$buyNum =$buyTotalCount-($buyCnt*($page-1));

	$Num = $buyNum - $i;

					

	if($Num <= 0){ //글 번호가 0보다 같거나 작으면

        //아무것도 실행하지 않음으로써 열을 다 지운다.	

	}else{?> //0보다 큰 경우면

		<tr>

		    <td><?=$Num?></td>  //글 번호 출력

		</tr>



	<?}									

}?>

설명을 하자면 500개의 글 들이 있다고 가정할때 1페이지의 첫번째 게시글 번호는 500번이어야 한다. 이걸 계산하기 위해

$buyNum =$buyTotalCount-($buyCnt*($page-1)); 

500 = 500 - ( 50 * (1-1));

2000번이 나온다. 그럼 이걸 가지고 하나씩 감소시키면 저절로 아래 글들의 번호가 매겨진다.

$Num = $buyNum - $i; 

499 =500 - 1;

이렇게 두번째 글의 번호는 1999번이 된다.

그럼 2페이지 라면? 1페이지에서 50개를 이미 보여줬으니 50개를 빼고 시작해야 한다.

4950 = 500- (50 * (2-1));

이러면 2페이지는 1950부터 시작하게된다.

같은 방법으로 1950부터 쭉 내려간다.

그리고 이 결과를 웹페이지 테이블에 글 번호 행에다가 넣어주면 된다.

그런데 마지막이 문제다. 한 페이지에 50개씩 보여줘야 되는데 마지막 페이지(10페이지라고 가정)에는 18개밖에 없다고 하자.

그럼 계산 값이 이상하게 나오게 된다.

338  = 500 - (18 * (10-1));

마지막 페이지가 338번부터 시작하는 것이다.

원래대로라면 

50  = 500 - (50 * (10-1));

이렇게 깔끔하게 50번부터 시작해서 1번까지 있어야 한다. 

이러한 예외처리를 위해 조건을 걸어준다.

if($buyCnt != 50) //글 목록이 50개가 아니라면

$buyCnt = 50; //50개라 가정하고 계산

이렇게 해주면 마지막 페이지는 50번 부터 시작하게 된다. 하지만..

글은 18개 밖에 없는데 50개를 출력해야하니 이런 현상이 나타난다.

DB 게시판 번호 - DB gesipan beonho

이렇게 아무 값도 없는데 음수로 테이블 출력한다.

이를 방지하고자 조건을 또 걸어준다.

if($Num <= 0){ //글 번호가 0보다 같거나 작으면

        //아무것도 실행하지 않음으로써 열을 다 지운다.

}else{?> //0보다 큰 경우면

<tr>

    <td><?=$Num?></td>  //글 번호 출력

    <td><?=$Date?></td> //글 작성날짜

</tr>

<?}

$Num 은 글 번호이다. 이게 0보다 같거나 작을때 아무처리를 해주지 않으면 0부터 음수는 알아서 출력하지 않는다.

if($Num <= 0){ 

}

이렇게 그냥 대괄호 안에 아무것도 안 써준다.

그리고 else 부분에서 글 번호가 양수이면 테이블을 출력하게 한다. 

그러면 결과는

이렇게 1까지만 나오게 된다. 

이런식으로 글 번호를 줄 수 있다.

웹개발을 해본 개발자라면 게시판을 한번이상은 개발해보았을 것이다.
게시판을 개발하면서 각 게시글의 기본적인 데이터 및 게시글의 순번을 화면에 보여주게 되는데
이때 게시글의 순번은 각 게시글을 대표하는 번호인 DB 테이블에 INT타입의 PK값(sequence, auto_increment로 처리된 값) 을 주로 보여주게된다.

하지만 PK값이 숫자가 아닌 다른값이라던가 혹은 고객사의 요청으로 No값을 DB에있는 값이 아닌 순수 게시글의 순번을 보여달라는 요구사항이 들어올 수 있다. 실제로 필자는 이러한 요구사항을 받은적이 있다.
긴 말보단 바로 예제코드와 함께 살펴보도록 하자.

개발환경

Java 11
Spring Boot 2.3.5
Mybatis
Thymeleaf

데이터 준비

DB 게시판 번호 - DB gesipan beonho

게시판 테이블을 만들어서 페이징을 위해 100개의 데이터를 넣었다.

페이징 객체 생성

DB 게시판 번호 - DB gesipan beonho

페이지를 이동해도 순번이 잘 나오는지 테스트하기위해 페이징 클래스를 생성하였다.

JAVA 코드 및 XML 쿼리작성

DB 게시판 번호 - DB gesipan beonho
DB 게시판 번호 - DB gesipan beonho

페이징 처리를 하기위해 게시글의 총 갯수와, 게시글 목록을 조회하자.

화면에 게시글 목록보이기

DB 게시판 번호 - DB gesipan beonho

화면에는 정상적으로 페이징처리가 되있는 게시글목록을 10개씩 끊어와 보여주였다.
이때 No값은 게시글의 순수 넘버링이 아닌 DB에 있는 PK값

을 보여주었다.

순번으로 변경

DB 게시판 번호 - DB gesipan beonho

페이지를 2,3,4 1페이지씩 넘어갈때마다 순번이 정상적으로 나오는지 확인되었다.

DB 게시판 번호 - DB gesipan beonho

위 HTML파일의 17, 18 Line의 코드를 위의 사진과 변경하였다. 이제 순번을 구하는 공식을 알아보자.

총갯수 - ( ((현재페이지 - 1) * 화면당 게시글 로우행 수) + 로우인덱스)

여기서 로우인덱스란 for문으로 list에 있는 데이터를 하나씩 꺼내올때의 인덱스번호를 말한다.
JSP로 게시판을 만들때 JSTL의 c:forEach 태그를 써본적이 있었을것이다. 그때 varStatus속성으로
로우인덱스, 로우카운트를 알 수 있듯이 Thymeleaf에서도 이런값들을 가져올 수 있는 문법을 지원한다.

현재페이지에 - 1을 하는 이유는 게시글의 총 갯수의 값을 화면 1페이지 최상단 No값에 세팅하기 위함이다.
만일 - 1을 하지않게되면 게시글의 총 갯수 - 화면당 게시글 로우행 수 = 값이 1페이지 최상단 No값에 위치하게된다.
간단한 예를 들어보자.

총갯수 = 100, 현재 페이지 = 2, 화면당 게시글 로우행 수 = 5

-1을 했을 경우

DB 게시판 번호 - DB gesipan beonho

-1을 하지않을 경우

DB 게시판 번호 - DB gesipan beonho

정상적으로 테스트가 완료되었다.
많은이들에게 도움이 되었으면 좋겠다.