웹 개발 한걸음

[Servlet] 게시물 수정 구현하기

Egu99 2021. 4. 5. 14:31

** 이전에 JSP로 만들었던 코드를 이용해 이를 서블릿으로 구현해보았다. 

  • 글의 삭제는 레코드의 완전 삭제가 아닌 이용불가 상태, 즉 bbsAvailable이 0인 상태로 업데이트 하는 식으로 수정하였다.
  • 따라서 수정과 삭제는 거의 흡사한 코드를 가졌다.
  • 게시물 관리에 들어오니 게시물 권한이 있는 회원인지 인증하는 것이 중요함을 새삼 느꼈다.
  • post 방식에는 큰 문제는 없었으나 get방식에서 특히 이런 보안이 취약한듯하다.
  • 제 3자가 쿼리스트링만으로 글을 삭제할 수 없게끔 세션 정보를 확인하도록 해주었다.
  • 다만, 지금까지처럼 세션 확인을 사용자 인증이 필요한 모든 컨트롤러에서 해주어 같은 코드가 너무도 많은듯하다.
  • 왠지 서블릿 필터가 이걸 해결 해줄 수 있을 것 같은데 일단 이걸 마무리 하고 시도해봐야겠다.
 

[JSP] 13강 Part1 - 게시글 수정

본 포스팅은 정보 제공용이 아닌 유튜브 동빈나님의 JSP 게시판 만들기 강좌 13강을 바탕으로 보고 배운 것을 직접 정리해본 포스트 입니다. ** 간략 프로세스 view.jsp에서 수정 버튼 -> update.jsp로

egu99.tistory.com

 

 


 

 

** updateControl - doGet()

@WebServlet("/update")
public class UpdateControl extends HttpServlet {

	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		int bbsID =0;
		
		//bbsID 전달 확인
		String bID = request.getParameter("bbsID");
		if(bID != null) 
			bbsID = Integer.parseInt(bID);
		
		//session 로그인 확인
		HttpSession session = request.getSession();
		String suserID = (String)session.getAttribute("userID");
		
		//게시물의 상태 가져오기
		BbsDAO bao = new BbsDAO();
		int av = bao.getBbsAvailable(bbsID);
		
		//게시물 가져오기
		Bbs bbs = bao.getBbs(bbsID);
		
		//유효하지 않은 게시물
		if(bbsID == 0 || bID == null || av == 0 ) {
			PrintWriter out = response.getWriter();
			out.println("<script>");
			out.println("alert('유효하지 않은 게시물입니다.');"); 
			out.println("location.href='bbs'");
			out.println("</script>");
		//비로그인시
		}else if(suserID == null) {
			PrintWriter out = response.getWriter();
			out.println("<script>");
			out.println("alert('로그인 하세요.');"); 
			out.println("location.href='login'");
			out.println("</script>");	
		//권한이 없을 경우	
		}else if (!bbs.getUserID().equals(suserID)){
			PrintWriter out = response.getWriter();
			out.println("<script>");
			out.println("alert('권한이 없습니다.');"); 
			out.println("location.href='bbs'");
			out.println("</script>");	
		} else {	
			request.setAttribute("b", bbs);
			request.getRequestDispatcher("/WEB-INF/update.jsp").forward(request, response);
		}
	}
}    

 

  • 수정 버튼을 누르면 bbsID를 가지고 이쪽으로 오게 된다. 
  • 1) 유효한 게시물인지?  - bbsID가 전달받지 못했거나 이용불가 게시물일 때 게시판으로
  • 2) 로그인 상태인지?- 세션에서 유저 정보가 없을 땐 로그인 페이지로.
  • 3) 권한이 있는지? - 글의 작성자와 로그인한 아이디가 다른 경우 메인 페이지로
  • 다 ok인 경우 해당 게시글의 정보를 "b"라는 키워드에 담아서 update.jsp로 forward 시킨다.

 

 


 

 

** update.jsp

<!-- 수정 게시판 부분 -->
	<div class="container">
		<div class="row">
				<form action="update?bbsID=${b.bbsID }" method="post">
				<table class = "table table-striped" style="text-align : center; border: 1px solid #dddddd">
					<thead> <!-- thead :  테이블의 가장 윗줄 -->
						<tr>
							<th colspan="2" style="background-color:#eeeeee; text-align: center;">게시물 수정 양식</th>
						</tr>
					</thead>	
					<tbody>
						<tr>
							<td><input type="text" class="form-control" placeholder="글 제목" name="bbsTitle" maxlength="50" value="${b.bbsTitle }"></td>			
						</tr>
						<tr>	
							<td><textarea class="form-control" placeholder="글 내용" name="bbsContent" maxlength="2048" style="height:350px;">${b.bbsContent }</textarea></td>			
						</tr>
					</tbody>
				</table>
				<input type="submit" class="btn btn-primary pull-right" value="수정하기">
			</form>
		</div>
	</div>

 

  • 여기서 해당 게시글의 정보가 b라는 키워드로 넘어왔다. 
  • EL을 이용하여 기존의 게시글 정보를 보여주고 수정할 수 있게 해주었다.
  • 작업 후 수정하기 버튼을 누르면 post방식으로 수정한 양식과 bbsID가 함께 updateControl로 넘어가게 된다. 

 

 


 

 

 

** updateControl - doPost()

@WebServlet("/update")
public class UpdateControl extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//수정할 글쓰기 양식
		String title = request.getParameter("bbsTitle");
		String content = request.getParameter("bbsContent");
		String bID = request.getParameter("bbsID");
		
		//bbsID 전달 확인
		int bbsID = 0;	
		if(bID != null)
			bbsID =  Integer.parseInt(bID);
				
		//양식이 누락된 경우
		if(title== null || title.equals("") || content == null ||content.equals("")){
			PrintWriter out = response.getWriter();
			out.println("<script>");
			out.println("alert('입력하지 않은 정보가 있습니다.')");
			out.println("location.href='bbs'");
			out.println("</script>");
			
		//누락이 없지만 유효하지 않은 게시글일 경우	
		}else if(bID == null) {
			PrintWriter out = response.getWriter();
			out.println("<script>");
			out.println("alert('유효하지 않은 게시물입니다.');"); 
			out.println("location.href='bbs'");
			out.println("</script>");	
			
		} else {	
			
			BbsDAO bao = new BbsDAO();
			//수정 시도
			int result = bao.update(bbsID, title, content);
			
			//데이터 베이스 오류
			if(result == -1){
				PrintWriter out = response.getWriter();
				out.println("<script>");
				out.println("alert('글쓰기에 실패했습니다.')");
				out.println("location.href = 'bbs'");
				out.println("</script>");
			//게시글 수정 성공	 
			}else {
				PrintWriter out = response.getWriter();
				out.println("<script>");
				out.println("alert('글이 수정되었습니다.')");
				out.println("location.href = 'bbs'");
				out.println("</script>");
			}
		}
	
	}

}
  • 수정하기 버튼을 누르면 수정된 양식과 bbsID를 가지고 이쪽으로 오게 된다. 
  • 양식이 누락? - 이건 사실 프론트 단에서 하고 넘어와야한다. 이후 자바스크립트로 수정할 예정.
  • 유효한 게시물인지? - get요청과 달리 bbsID 전달 확인 하나만 확인했다. get요청에서는 쿼리스트링으로 av가 0인 게시물에 접근할 수도 있어 예외처리를 해주었지만 av가 0인 게시물이 post방식으로 올 일은 없다고, 이쪽(getPost)으로는 접근이 불가할 거라는 이유였는데 사실 이부분에 대해선 이렇게 유도리 있게(?)해도 괜찮은지 아님 모든 예외처리를 해야하는지 잘 모르겠다. 
  • 어느것도 해당되지 않는다면 BbsDAO의 update()로 수정을 시도한다. 반환값에 따라 알림과 이동을 해준다.

 

 


 

 

 

** BbsDAO - update()

	//데이터베이스를 접근하게 해주는 객체.
	private Connection conn;
	//쿼리를 실행시키고 결과값을 내는 객체.
	private ResultSet rs;
    
   	 //글 수정하기
	public int update(int bbsID, String bbsTitle, String bbsContent) {
			
		String sql = "UPDATE BBS SET bbsTitle = ?, bbsContent =? where bbsID =?  ";
		try {
			PreparedStatement pst;	
			pst = conn.prepareStatement(sql);
			pst.setString(1, bbsTitle);
			pst.setString(2, bbsContent);
			pst.setInt(3, bbsID);
				
			return pst.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return -1;
	}
		

 

  • 글의 수정을 하기 위에 DB에 접근, 레코드를 수정하는 메서드이다.
  • 받은 제목과 내용을 토대로 레코드를 수정한다. 
  • 성공했다면 1, 아니라면 -1을 반환해준다.