디지털 컨버전스/Project

[BoardProject] 일부 데이터만 출력

gimyeondong 2020. 5. 7. 15:44

 

DAO에 가짜 데이터 생성 코드 만들기

	public static void main(String[] args) throws Exception {
		// 가짜 데이터 넣는 코드
		Connection con = new BoardDAO().getConnection();
		Statement stat = con.createStatement();
		for (int i = 0 ; i <200 ; i++){
			stat.executeUpdate("insert into board values(board_seq.nextval,'제목"+i+"','내용"+i+"','작성자"+i+"',sysdate,0,'127.0.0.1')");
			Thread.sleep(100);
			System.out.println(i+" 번째 데이터 입력");
		}
		con.commit();
		con.close();
	}


- 오타 주의

 

- DAO 이름 SQL 고려해서 명명하기


10개만 출력하고 싶을 때 

시간을 기준으로  내림차순 (최신글이 첫글이 되도록)

 

추가로 컬럼 하나를 만들어서 순번 정하기

 


rank() over

문제점 : 같은 순위가 있을 경우 

 


row_number() over

순번


rnum 이라고 컬럼이름 주기

 


rnum 에서 1~10 값 꺼내기

 

단, SQL 실행순서 고려하기

SQL  실행순서 고려

 

서브쿼리를 사용하여 rnum 명명 후 선택되도록 하기

서브쿼리


write_date 외의 모든 것 출력

*만 찍으면 뒤쪽에 더 출력할 수 없음

 

 board.* 으로 적으면 보드테이블의 모든 것이라는 의미로 한정되서  출력 가능해짐


DAO로 만들기

	public List<BoardDTO> selectByPageNo(int cpage) throws Exception{
		// 1 : 1 ~ 10
		// 2 : 11 ~ 20
		// 3 : 21 ~ 30
		int start = cpage * Configuration.recordCountPerpage - (Configuration.naviCountPerPage-1);
		int end = start + (Configuration.recordCountPerpage-1);

		String sql = "select * from (select board.*, row_number() over(order by seq desc) rnum from board) where rnum between ? and ?";
		List<BoardDTO> list = new ArrayList<>();	
		try(Connection con = this.getConnection();
				PreparedStatement pstat = con.prepareStatement(sql);
				){
			pstat.setInt(1, start);
			pstat.setInt(2, end);

			try(ResultSet rs = pstat.executeQuery();){
				while(rs.next()) {
					int seq = rs.getInt("seq");
					String title = rs.getString("title");
					String contents = rs.getString("contents");
					String writer = rs.getString("writer");
					Timestamp write_date = rs.getTimestamp("write_date");
					int view_count = rs.getInt("view_count");
					String ip_addr = rs.getString("ip_addr");

					BoardDTO dto = new BoardDTO(seq,title,contents,writer,write_date,view_count,ip_addr);
					list.add(dto);
				}
				return list;
			}
		}
	}

 

BoardController

- 게시판 보기

selectAll 을 selectByPageNo로 변경해서

한번에 특정 seq 범위만 노출되도록 설정

package kh.backend.controller;

import java.io.IOException;
import java.sql.Timestamp;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kh.backend.dao.BoardDAO;
import kh.backend.dto.BoardDTO;
import kh.backend.dto.MemberDTO;


@WebServlet("*.boa")
public class BoardController extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String contextPath = request.getContextPath();
		String requestURI = request.getRequestURI();
		String cmd = requestURI.substring(contextPath.length());
		BoardDAO dao = new BoardDAO();
		try {
			if(cmd.contentEquals("/toBoard.boa")) {
				// 게시판 보기
				int cpage = 1; // 바로 게시판으로 들어갈 경우
				try{
					cpage = Integer.parseInt(request.getParameter("cpage")); //현재 페이지 받아오기
				}catch(Exception e) {}
				System.out.println("현재 페이지 : " + cpage); //
				
				List<BoardDTO> list = dao.selectByPageNo(cpage); // 전체 목록이 아닌 일부만 불러오기
				String navi = dao.getpageNavi(cpage);	// 에러? 
				
				request.setAttribute("list", list);
				request.setAttribute("navi", navi);
				RequestDispatcher rd = request.getRequestDispatcher("boardView.jsp");
				rd.forward(request, response);

			}else if(cmd.contentEquals("/toWrite.boa")) {
				// 글쓰기 버튼 누르면 글쓰기 페이지로
				response.sendRedirect("writeView.jsp");

			}else if(cmd.contentEquals("/write.boa")) {
				// 글쓰기 페이지에서 글 입력
				MemberDTO dto = (MemberDTO) request.getSession().getAttribute("loginInfo");
				String title = request.getParameter("title");
				String contents = request.getParameter("contents"); 
				String writer = dto.getId(); 
				String ip_addr = request.getRemoteAddr();
				int result = dao.write(new BoardDTO(title,contents,writer,ip_addr));

				List<BoardDTO> boardlist = dao.selectAll(); // 목록 다시 불러오기
				request.setAttribute("boardlist", boardlist);	
				RequestDispatcher rd = request.getRequestDispatcher("boardView.jsp");
				rd.forward(request, response);
				
			}else if(cmd.contentEquals("/toContents.boa")) {
				// 글제목 클릭해서 내용 보기
				//클릭한 글 seq get방식으로 받기?			
				int seq = Integer.parseInt(request.getParameter("seq"));
				List<BoardDTO> contents = dao.selectBySeq(seq);
				request.setAttribute("contents", contents);
				RequestDispatcher rd = request.getRequestDispatcher("contentsView.jsp");
				rd.forward(request, response);
			}
			
		}catch(Exception e) {
			e.printStackTrace();
			response.sendRedirect("error.jsp");

		}

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}