페이지네이션

Query

-- id 가 큰 순서대로 번호를 매기고 싶어!
select id, name, addr, 1 from test order by id DESC;

select id, name, addr, rownum from test order by id DESC;
-- 왜인지 나는 이렇게 했는데 id 높은 숫자에 rownum도 높은 숫자가 붙더라..

--쿼리 실행 순서
--from (- where) - select(프로젝션) - order by(정렬)
--무조건 테이블을 먼저 퍼올린다
--정렬이 제일 연산이 많이 든다 (정렬은 비교를 해야하기 때문에)
--정렬 전에 일어나는 건 항상 select

--왜 rownum으로 데이터를 뽑아내지?
--id가 아니고?
--id는 중간중간 빌 수 가 있다 (탈퇴하거나 뭐 그러면 응)
--하지만 rownum은 빌수가 없지

-- 1번부터 3번까지만 뽑고 싶어
-- rownum 은 where 뒤에 일어나는 것이므로 찾을 수 없다 (from해서 퍼올린게 아니라서)
-- rownum 은 하드에서 퍼올릴 때 번호가 촤촤 매겨진다 그러므로 **중간부터 셀수가 없다**
-- 결과 나옴
select id, name, addr, rownum from test where rownum > 0 and rownum < 4 order by id DESC;
-- 결과 안나옴
select id, name, addr, rownum from test where rownum > 3 and rownum < 7 order by id DESC;

-- 인라인 뷰
-- from에 실제 table 이 아니라 연산된 결과가 들어가는 것
select * from
(
select id, name, addr, rownum as num from test order by id DESC
)
where num > 3 and num < 7;

-- 이러면 이제 페이징이 가능해지겠지?
select * from
(
select id, name, addr, rownum as num from test order by id DESC
)
where num >= (page*3) and num <= (page+1)*3;

ListAction.java

public class ListAction implements Action {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 세션, 유효성 다 필요없음

		// 핵심 로직
		**int page = Integer.parseInt(request.getParameter("page"));**

		BoardDAO boardDAO = BoardDAO.getInstance(); // 싱글톤패턴
		List<Board> boardsEntity = boardDAO.**findAll(page)**;
		
//		System.out.println("======================"); // 오류나서 테스트 해봤음. 습관화해라
//		System.out.println(boardsEntity.size());

		// 얘는 무조건 가야하니까 이프 필요업
		request.setAttribute("boards", boardsEntity);
		RequestDispatcher dis = request.getRequestDispatcher("views/board/list.jsp");
		dis.forward(request, response);
		// 공통로직 끝

	}

}

findAll(page) - 오버로딩

// findAll 오버로딩
	public List<Board> findAll(int page) {
		List<Board> boards = new ArrayList<>();
		// StringBuffer -> 동시접근 불가능
		// StringBulider -> 동시접근 가능
		StringBuffer sb = new StringBuffer();
		**sb.append("select * from");
		sb.append("(");
		sb.append("select id, title, content, userId, created, rownum as num from boards order by id DESC");
		sb.append(")");
		sb.append("where num > ? and num <= ?");**
		// page 쿼리에 바로 넣는거 아니라고 했지 기억나지   
		
		try {
			Connection conn = DBConn.디비연결(); // 얘는 무조건 필요!

			PreparedStatement pstmt = conn.prepareStatement(sb.toString());
			**pstmt.setInt(1, page*3);
			pstmt.setInt(2, (page+1)*3);**
			ResultSet rs = pstmt.executeQuery(); // 결과(row)를 리턴    

			while (rs.next()) {
				Board board = new Board();
				board.setId(rs.getInt("id"));
				board.setTitle(rs.getString("title"));
				board.setContent(rs.getString("content"));
				board.setUserId(rs.getInt("userId"));
				board.setCreated(rs.getTimestamp("created"));

				boards.add(board);
			}
			return boards;

		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

int page = Integer.parseInt(request.getParameter("page"))

이걸 어디서 받아와야할까?

우리 메인으로 갈때 무조건 뭐 타고 가지?

index!

index.jsp