코딩항해기

[과제/JSP] 선택한 글의 댓글 출력, 없는 페이지 오류 페이지로 바꾸기 본문

problem solving/과제&실습 코딩

[과제/JSP] 선택한 글의 댓글 출력, 없는 페이지 오류 페이지로 바꾸기

miniBcake 2024. 8. 20. 10:21

 

jsp / apache tomcat 10.1

 

1. 선택한 글의 댓글 출력

 

순서 (로직) 설계하기

  • Model에서 댓글을 불러오는 쿼리 작성하기
  • 불러온 데이터를 C에게 넘겨주기
  • Controller는 받은 데이터를 요청에 담아 V에게 전달하기
  • V는 받은 데이터를 화면에 보여주기

(이미 게시물 내용을 상세보기로 보여주며, 보드 게시물의 PK값을 넘겨주고 있기 때문에 쿼리에 필요한 정보를 요청하는 과정이 생략됐다.)

 

쿼리문 작성하기

SELECT R.RID,R.BID,B.TITLE,R.CONTENT,M.NAME FROM REPLY R JOIN BOARD B ON R.BID=B.BID JOIN MEMBER M ON R.WRITER=M.MID WHERE B.BID = 101

 

조회하는 게시물의 댓글리스트를 조회하는 것이므로 WHERE절을 통해 BID값을 임의로 정해 쿼리가 잘 돌아가는지 확인했다. BID는 게시물에 따라 변화되어야하는 값이므로 플레이스홀더(물음표 : ?)로 치환한다.

 

SELECT R.RID,R.BID,B.TITLE,R.CONTENT,M.NAME FROM REPLY R JOIN BOARD B ON R.BID=B.BID JOIN MEMBER M ON R.WRITER=M.MID WHERE B.BID = ?

 

 

DAO 작성하기 (C에게 데이터를 넘겨주기)

댓글 데이터는 한 번에 여러 데이터를 조회하여 반환하는 것이므로, SELECTALL이다.

DB와 연결을 해준 후 쿼리를 완성하여 받은 값을 ArrayList에 담아서 반환하고 DB와의 연결을 종료한다.

(주석 및 로그는 생략됐다 원래는 로그를 작성하여 정상작동여부를 확인하는 것이 좋다!)

public ArrayList<ReplyDTO> selectAll(ReplyDTO replyDTO){
	ArrayList<ReplyDTO> datas=new ArrayList<>();
		
	Connection conn=JDBCUtil.connect(); //연결
	PreparedStatement pstmt=null;
	try {
		pstmt=conn.prepareStatement(SELECTALL); //쿼리
		pstmt.setInt(1, replyDTO.getBid()); //id
		ResultSet rs=pstmt.executeQuery();
		while(rs.next()) {
			ReplyDTO data=new ReplyDTO();
			data.setRid(rs.getInt("RID")); //댓글id
			data.setContent(rs.getString("CONTENT")); //내용
			data.setWriter(rs.getString("NAME")); //이름
			datas.add(data);
		}
	} catch (SQLException e) {
		System.out.println("SQL문 실패");
	}
	JDBCUtil.disconnect(conn,pstmt);//연결해제

	return datas;
}

 

 

Controller에서 V에게 데이터 전달하기

컨트롤러는 기존 선택 게시물 정보를 넘길 때 이제 댓글 데이터까지 함께 넘겨야한다.

즉, 기존 선택 게시물 정보를 넘기는 Action에 댓글 데이터 불러와 요청에 함께 넘기면 된다.

(수업용 코드에 바로 작성하여 주석 다소 생략됐다, 꼭 주석 작성해야한다!)

public class BoardAction implements Action {

	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
		BoardDTO boardDTO = new BoardDTO();
		BoardDAO boardDAO = new BoardDAO();
		boardDTO.setBid(Integer.parseInt(request.getParameter("bid")));
		BoardDTO data = boardDAO.selectOne(boardDTO);
		request.setAttribute("data", boardDTO);
		
		//댓글 데이터
		ReplyDAO replyDAO = new ReplyDAO();
		ReplyDTO replyDTO = new ReplyDTO();
		replyDTO.setBid(Integer.parseInt(request.getParameter("bid")));
        	//데이터 불러오기
		ArrayList<ReplyDTO> replyList = replyDAO.selectAll(replyDTO);
        	//데이터 요청에 담기
           	 //replyList로 전달
		request.setAttribute("replyList", replyList);
		
		ActionForward forward = new ActionForward();
		forward.setRedirect(false);
		forward.setPath("board.jsp");
		return forward;
	}

}

 

 

V는 받은 데이터를 화면에 보여주기

이제 마지막 단계까지 왔다. 정상적으로 데이터가 잘 전달되고 있다면, V는 데이터를 보여주면된다.

기존 페이지에 댓글을 출력할 JSTL을 작성하면된다. Controller에서 replyList로 데이터가 넘어오기 때문에 replyList로 받아야한다. 

댓글정보출력...
<c:forEach var="reply" items="${replyList}">
	<table border="1">
		<tr><td>${reply.writer}</td><td>${reply.content}</td></tr>
	</table>
</c:forEach>

 

 

정상작동 확인하기!


2. 없는 페이지 오류 페이지로 바꾸기

게시물을 조회할 때 url에 bid를 담아 이동하기 때문에 url을 수정하면 해당하는 게시물이 없는 페이지로도 이동할 수 있다.

 

없는 게시물로 이동할 경우 오류를 띄우는 기능을 추가할 예정이다.

 

 

로직 설계하기

  • 어떤 상황일 때 오류 페이지가 나와야하는지 확인하기
  • C파트에서 확인한 상황일 때 error페이지로 갈 수 있도록 분기 설정하기
  • V파트에서 error 페이지 만들기

 

오류 페이지가 나와야하는 상황 찾기

  • bid에 유효하지 않은 값이 들어왔을 때 (NumberFormatException 발생)
  • bid에 들어갈 수 있는 값이지만 존재하지 않는 게시물일 때 (오류 발생하지 않음)

(유효하지 않은 값은 500에러가 발생하므로 web.xml에서 처리하는 것이 이상적이지만 이번 과제에는 별도로 분기처리를 했다.)

더보기

web.xml에서 처리할 경우 web.xml 루트엘리먼트 태그 안에 error페이지를 설정해주면된다.

  <error-page>
  	<error-code>404</error-code>
  	<location>/error/error.jsp</location>
  </error-page>
  <error-page>
  	<error-code>500</error-code>
  	<location>/error/error.jsp</location>
  </error-page>

 


 

[JSP] xml 파일로 error 페이지 설정하기

.xml ( eXtensible Markup Language) 웹에서 데이터를 전송하기 위해 미리 약속해둔 방식으로 만들어진 문서이다. 톰캣에서는 WEB-INF 하위에 web.xml 파일이 있다면, 해당 파일을 참고하여 설정한다.web.xml 파

minibcake.tistory.com

 

 

 

error페이지로 분기처리하기

error페이지로 분기처리할 방법에 대해 생각해보았다.

현채 Front Controller에서 어떠한 요청도 받지 못해 forward가 null일 때를 검증하고 있는데, 그 상황에서도 error페이지로 이동해야하므로 그 부분을 활용해보기로 결정했다.

forward는 기능에 따라 맞는 경로와 이동 페이지를 반환하기 위해 만든 클래스로, Redirect인지 forward인지 결정하는 boolean 타입의 필드 하나와, 이동 페이지를 저장하는 String 필드 하나로 총 두 개의 필드값을 가지고 있는 클래스이다.

// 3. 응답(페이지 이동 등)
		//  1) 전달할 데이터가 있니? 없니? == 포워드? 리다이렉트?
		//  2) 어디로 갈까? == 경로
		if(forward == null) {
			// command 요청이 없는 경우
			System.out.println("error 발생");
			forward = new ActionForward();
			forward.setRedirect(true);
			forward.setPath("error/error.jsp");
		}

 

이제 forward를 null로 반환하면 error페이지로 이동할 수 있는 준비가 됐다.

error가 발생하는 지점에 retrun null을 하면 된다.

public class BoardAction implements Action {

	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
		BoardDTO boardDTO = new BoardDTO();
		BoardDAO boardDAO = new BoardDAO();
		try {
			boardDTO.setBid(Integer.parseInt(request.getParameter("bid")));
            //넘버포맷 오류 발생 시
		} catch (NumberFormatException e) {
			return null;
		}
		BoardDTO data = boardDAO.selectOne(boardDTO);
        //넘어온 데이터가 없는 경우 == 게시물이 없는 경우 (오류발생해야하는 경우)
		if(data == null) {
			return null;
		}
		request.setAttribute("data", data);
		
		
		ReplyDAO replyDAO = new ReplyDAO();
		ReplyDTO replyDTO = new ReplyDTO();
		replyDTO.setBid(Integer.parseInt(request.getParameter("bid")));
		ArrayList<ReplyDTO> replyList = replyDAO.selectAll(replyDTO);
		request.setAttribute("replyList", replyList);
		
		ActionForward forward = new ActionForward();
		forward.setRedirect(false);
		forward.setPath("board.jsp");
		return forward;
	}

}

 

 

V파트에서 error페이지 만들기

V에서 error 페이지를 만든다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
error페이지
<a href="main.do">돌아가기</a>
</body>
</html>

 

 

확인하기

에러페이지가 원하는 상황에 잘 뜨고 있다!

 

 

 

 

[풀이]

throw로 오류를 발생시켜 오류 페이지를 띄우는 방식을 보여주셨다.

언체크 예외를 사용하면 바로 오류 페이지로 이동시킬 수 있다. 단, web.xml에 error페이지 설정을 해둬야한다.

throw new RuntimeException(); //언체크 예외의 가장 상위 exception