게시판 페이징 처리하기

작성: 2020.12.20

수정: 2020.12.20

읽는시간: 00 분

Programming/Java

반응형

5주간의 일정으로 기초 자바 수업이 모두 마무리 되었습니다.

 

마지막 주에는 JDBC를 이용한 게시판 만들기를 했습니다.

 

Map<String, Object> SelectOne(String sql)

Map<String, Object> SelectOne(String sql, List<Object> param)

List<Map<String,Object>> SelectList(String sql)

List<Map<String,Object>> SelectList(String sql, List<Object> param)

int update(String sql)

int update(String sql, List <Object> param)

 

이렇게 6개의 메서드를 구현한 JDBCUtil 클래스를 만든 뒤, 해당 메서드들을 이용해 게시판을 만드는 숙제를 했습니다.

 

5주동안 받은 기초 데이터베이스 수업과 기초 자바 수업이 마침내 콜라보레이션을 하는 역사적인 순간이었습니다.

 

이 수업 전에는 해시맵을 이용한 게시판 만들기를 했었는데, 하필 그때 페이지 처리가 해보고 싶다고 기능을 만들어 두었던 덕에, 이번에도 페이징 처리를 염두한 채 코딩을 시작했고.. 스스로 숙제 난이도를 높인 덕에 신나게 몇시간 앉아 있었습니다.

 

이번 포스트에서는 '페이징 처리' 에 포커스를 맞춰 보겠습니다.

 

게임 만들어 발표를 했을때, 한줄당 10페이지씩 출력을 전제로 포맷을 짰더니 깔끔한 느낌의 일관된 화면을 얻을 수 있었습니다. 이번에도 10줄 출력을 전제로 하다보니 한 페이지에 글은 4 개씩 보여지게끔 해보았습니다.

 

마지막 페이지에서는 1페이지부터 페이지 사이즈까지 해당하는 글이 출력됩니다.

 

해당 페이지에 출력되는 글의 갯수가 4개 이하일 경우에는 부족한 만큼 System.out.println()을 호출해 줄을 맞춰줍니다.

 

 

메인함수 시작부분 입니다. 페이지당 몇개의 글을 보여줄지를 상수값으로 미리 지정해 둡니다.

페이징 처리에 있어 눈여겨 보아야 할것은

static final int PER_PAGE = 4;

 

그리고 page, totalSize, totalPage 변수들입니다.

 

 

총 게시판들의 수를 반환하는 메서드입니다. select count(*) 쿼리를 이용해 그 수를 받아옵니다. 오라클DB에서 JDBC가 NUMBER 데이터를 받아 왔을때 BigDecimal 값이 되어서 int 값으로 변환하기가 쉽지 않았습니다만 선생님에게 질문을 해서 int값으로의 변환을 할 수 있었습니다.

 

while 문에서 int totalSize 변수에 총 게시판의 글 수를 저장합니다.

int totalPage는, 총 만들어질 페이지의 갯수를 의미합니다. 

totalPage = ( ( [총 게시판 글 수]-1 ) /  페이지당 출력할 글 수] )+1 해주면 됩니다.

바로 떠오르지는 않아서 노트에 적어가면서 식을 만들어 냈습니다.

 

드디어 대망의 출력 메서드 입니다.. 

 int startPost 에, 출력할 게시글 번호 ( 정확히는 rownum 입니다 ) 중에 가장 낮은 수를 기록합니다.

startPost = [전체 게시글 수] - [현재 페이지] * [페이지당 출력할 수] + 1 입니다.

이것 또한 생각처럼 쉽게 식이 만들어지지 않아서  노트에 적어보면서 식을 만들었습니다.

 

SQL은 rownum을 활용해 최신글부터 위에 위치하도록 하기 위해 인라인뷰를 사용했습니다. board_no 기준으로 오름차순 정렬한 서브쿼리를 rownum 내림차순으로 정렬해서 불러왔습니다.

 

출력 시작 게시물( 제일 아래 위치) 의 rownum 은 StartPost

마지막 게시물은 StartPost+[페이지당 출력할 수] -1 입니다.

 

int lists 변수를 활용해, 총 몇개의 게시글이 출력됐는지를 센 뒤 게시글이 부족할때는 그 수만큼 println()을 호출했습니다.

 

그리고 첫 페이지가 아닐때는 이전페이지로 가는 메뉴가 보이도록,

마지막 페이지가 아닌 경우에는 다음 페이지로 가는 메뉴가 보이도록 해 주었습니다.

 

굉장히 복잡할 것 같지만, 막상 한번 고생을 하며 작성해 보면 그 다음부터는 페이징 처리를 그렇게 어렵지 않게 할 수 있습니다. 

 

이번 숙제에서는 페이징 처리를 해낼 수 있으면, 다른 부분에서는 모두 페이징 처리 및 출력에서 사용했던 기능들을 조금만 응용하면 다 해낼 수 있습니다.

반응형