웹 개발 한걸음
[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을 반환해준다.