본문 바로가기
교육/Server

JDBC 개발자 수업 81일차 - 기본 게시판 만들기(1) - 페이징 기능 추가하기

by yhyuk 2021. 7. 22.
728x90
반응형

기본 게시판 만들기

  - 페이징 기능 추가하기


페이징 기능 추가하기

[ 정의 ]

- 게시판을 기준으로 page 단위로 나누는 행위를 의미한다.

- 게시물을 일정 단위로 끊어서 가져오는 기법

 

페이징(Paging)

 

[ 구현 목표 ]

- 전체페이지 개수 별로 10개의 page 씩 나누어서 순서대로 보여준다.

- 이전페이지, 다음페이지별로 버튼을 눌러서 이동이 가능하다.

- 현재페이지가 첫번째 페이지라면 이전페이지 이동은 불가능하다.

- 현재페이지가 마지막 페이지라면 다음페이지 이동은 불가능하다.

 

[ DB 작업 ]

1) com.test.myapp.board > BoardDAO.java

- rownum을 주기 위해 SQL구문 수정하기

- 'begin' : 가져올 게시물 시작 위치 

- 'end' : 가져올 게시물 끝 위치

*작성했던 파일 그대로 사용했으며, 어제 구현했던 코드는 일부 제거했습니다.

public ArrayList<BoardDTO> list(HashMap<String, String> map) {
	
	try {

		String where ="";
		
		if ( map.get("isSearch").equals("y") ) {
        
			if ( map.get("column").equals("all") ) {
				where = String.format(" where subject like '%%%s%%' or content like '%%%s%%' "
						, map.get("search"), map.get("search"));
			} else {
				where = String.format(" where %s like '%%%s%%' "
						, map.get("column"), map.get("search"));
			}
			
		}
		
		// rownum 생성하기, 및 조건문 추가하기
		String sql = String.format("select * from(select b.*, rownum as rnum from vwBoard b %s) where rnum between %s and %s order by seq desc"
										, where
						                , map.get("begin")
						                , map.get("end"));
		
		pstat = conn.prepareStatement(sql);
		
		rs = pstat.executeQuery();
		
		// 옮겨 담을 큰상자
		ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();
				
		while ( rs.next() ) {
			BoardDTO dto = new BoardDTO();
			
			dto.setSeq(rs.getString("seq"));
			// dto.setId(rs.getString("id"));
			dto.setName(rs.getString("name"));
			dto.setSubject(rs.getString("subject"));
			dto.setReadcount(rs.getString("readcount"));
			dto.setRegdate(rs.getString("regdate"));
			dto.setIsnew(rs.getString("isnew")); // 글쓰고 난뒤 며칠이 지났는지 시간
			dto.setCcnt(rs.getString("ccnt")); // 현재 글에 달린 댓글 갯수
			
			list.add(dto);
		}
		
		return list;
		
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	return null;
}

 

2) com.test.myapp.board > BoardDAO.java

- List 서블릿에서 총 게시물 수를 구하기를 사용할 메소드

public int getTotalCount(HashMap<String, String> map) {

	try {
		
		String where ="";
		
		if ( map.get("isSearch").equals("y") ) {
			
			if ( map.get("column").equals("all") ) {
				where = String.format(" where subject like '%%%s%%' or content like '%%%s%%' "
						, map.get("search"), map.get("search"));
			} else {
				where = String.format(" where %s like '%%%s%%' "
						, map.get("column"), map.get("search"));
			}
			
		}
		
		String sql = String.format("select count(*) as cnt from tblBoards %s", where);
		
		pstat = conn.prepareStatement(sql);
		
		rs = pstat.executeQuery();
		
		if ( rs.next() ) {
			return rs.getInt("cnt");
		}
		
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	return 0;
}

 

[ Servlet 작업 - 게시판 리스트 페이지에서 페이징 처리하기 ]

1) com.test.myapp.board > List.java

- 페이징 처리를 위한 변수 생성

- 총 게시물 알아내기(getTotalCount 메소드) -> 총 페이지 수 알아내기 (10페이지씩 나누기)

- 조건문을 사용해서 구현하기

     a. 이전페이지, 다음페이지 10개씩 나누기

     b. 페이지에 글이 존재하지 않을때  

- 페이징 처리의 모든 코드는 bootstrap에 존재하는 페이지바 코드를 가져와서 구현했습니다.

*작성했던 파일 그대로 사용했으며, 어제 구현했던 코드는 일부 제거했습니다.

HashMap<String, String> map = new HashMap<String, String>();

// 페이징 처리 -> 보고 싶은 페이지를 정하기 위한 처리
int nowPage = 0; 		// 현재 페이지번호
int totalCount = 0;		// 총 게시물
int pageSize = 10;		// 한 페이지당 출력할 게시물 수
int totalPage = 0;		// 총 페이지 수
int begin = 0;			// 가져올 게시물 시작 위치
int end = 0;			// 가져올 게시물 끝 위치 
int n = 0;			// 페이지바 제작
int loop = 0;			// 페이지바 제작
int blockSize = 10;		// 페이지바 제작

String page = req.getParameter("page");

if ( page == null || page.equals("")) {
	nowPage = 1;
} else {
	nowPage = Integer.parseInt(page);
}

// 현재 페이지에서 가져올 시작 위치 구하기
begin = ( (nowPage - 1) * pageSize ) + 1;
// 게시물 끝 위치 찾기
end = begin + pageSize - 1;

map.put("begin", begin + "");
map.put("end", end + "");

BoardDAO dao = new BoardDAO();


// 총 게시물 수 알아내기
totalCount = dao.getTotalCount(map);

// 총 페이지 수 알아내기
totalPage = (int)Math.ceil( (double)totalCount / pageSize );

// 부트스트랩 이용해서 String 자료형에 담기
String pagebar = "<nav>\r\n"
				+ "<ul class=\"pagination\">";

// while 루프 변수
loop = 1; 
// 출력되는 페이지 변수
n = ( (nowPage - 1) / blockSize ) * blockSize + 1;

// 이전 10페이지
if ( n == 1 ) {
	pagebar += String.format(" <li class='disabled'><a href='#!' aria-label='Previous'><span aria-hidden='true'>&laquo;</span></a></li> ");
} else {
	pagebar += String.format(" <li><a href='/myapp/board/list.do?page=%d'><span aria-hidden='true'>&laquo;</span></a></li> ", n-1, blockSize);
}


// 페이지에 글이 아무것도 없을떄..
if (totalPage == 0) {
	pagebar += " <li class='active'><a href='#!'>1</a></li> ";
}

while ( !(loop > blockSize || n > totalPage ) ) {
	if ( n == nowPage ) {
		pagebar += String.format(" <li class='active'><a href='#!'>%d</a></li> ", n);
	} else {
		pagebar += String.format(" <li><a href='/myapp/board/list.do?page=%d'>%d</a></li> ", n, n);
	}
	
	loop ++;
	n++;
}

// 다음 10페이지
if ( n > totalPage ) {
	pagebar += String.format(" <li class='disabled'><a href='#!' aria-label='Next'><span aria-hidden='true'>&raquo;</span></a></li> ");
} else {
	pagebar += String.format(" <li><a href='/myapp/board/list.do?page=%d' aria-label='Next'><span aria-hidden='true'>&raquo;</span></a></li> ", n);
}


pagebar += "</ul>\r\n"
				+ "</nav>";
                

// 마지막으로 list.jsp에 넘기기
req.setAttribute("map", map); 
req.setAttribute("pagebar", pagebar);

 

[ JSP 작업 - Servlet에서 만든 pagebar 넘기기 ]

- 글 목록 바로 하단에 작성

*작성했던 파일 그대로 사용했으며, 어제 구현했던 코드는 일부 제거했습니다.

<div class="pagebar">
	${ pagebar }
</div>

 

- 게시판 리스트 페이지 ( 첫번째 페이지 )

첫페이지라서 이전페이지로 이동 버튼이 눌리지 않는다. 그리고 각 숫자를 누르면 해당 페이지로 이동한다.

 

- 게시판 리스트 페이지 (마지막 페이지)

마지막 페이지라서 다음 페이지로 이동 버튼이 눌리지않는다.

 

[ 페이징 기법 ]

- 게시판 기능 구현한것중에 가장 복잡해보이지만, 단계별로 차근차근 나가면 어렵지 않다고 생각하자!!!

- 현재 페이지 번호 (위치) 구하기

- 가져올 시작, 끝 게시물 구하기

- 총 게시물 수 알아내기 -> 총 페이지 수 알아내기

- 조건식으로 이전/다음페이지, 페이지에 글이 아무것도 없을때 총 3가지로 구분해서 구현한다.

728x90
반응형

댓글