코딩 개발/Java

게시판 만들기 3 (게시글 수정, 게시글 삭제)

호소세 2023. 6. 28. 21:27
728x90
반응형

게시글 만들기 1 : https://pabeba.tistory.com/180

게시글 만들기 2 : https://pabeba.tistory.com/181

 

저번 시간 '게시글 만들기 2'에서 게시글 상세 보기와 게시글 작성에 대하여 알아보았습니다.

이번 시간에는 게시글 상세보기에 있는 삭제 버튼과 수정버튼에 대한 기능을 넣어보려고 합니다.

 

게시글 상세 보기에 들어가면 자신이 작성한 글에 대해서는 버튼이 나오고, 자신이 작성하지 않은 글에 대해서는 버튼이 나오지 않는 문법이 있습니다.

<button type="button" onclick="deletePost()">삭제</button>
			<button type="button" onclick="updatePost()">수정</button>
			<form id="deletePostForm" action="DeletePost.do" method="post"> 
			<input type="hidden" name="no" value="${post.no}">
			</form>
			<form id="updatePostForm" action="UpdatePostForm.do" method="post"> 
			<input type="hidden" name="no" value="${post.no}">
			</form>
			<script type="text/javascript">
				function deletePost() {
					if(confirm("삭제하시겠습니까?")){
						document.getElementById("deletePostForm").submit();
					}
				}
				function updatePost() {
					if(confirm("수정하시겠습니까?")){
						document.getElementById("updatePostForm").submit();
					}
				}
			</script>

거기에 버튼에 onclick 속성을 넣어서 javascript 문을 이용하여 confirm 함수 및 제출까지 할 수 있도록 작성했습니다.

 

이제 다음은 수정하는 form으로 가는 것과 글 수정, 그리고 삭제 기능을 알아보도록 합시다.

 

글 수정하기 (글 수정 form, 글 수정하기)

글 수정 FORM

수정하기 버튼을 누르면 글 수정하는 form으로 가게 됩니다.

public class UpdatePostFormController implements Controller {
	@Override
	public String handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		HttpSession session=request.getSession(false);
		if(session==null||session.getAttribute("mvo")==null) {
			System.out.println("**비인증 상태이므로 서비스 할 수 없습니다**");
			return "redirect:FindPostList.do";
		}	
		long no=Long.parseLong(request.getParameter("no"));
		request.setAttribute("post", BoardDAO.getInstance().findPostByNo(no));
		request.setAttribute("url", "board/update-form.jsp");
		return "layout.jsp";
	}
}

1. session 이 만료되거나 없어지면 작동 불가

2. 변경하려는 게시물의 번호를 가져와서 데이터베이스에서 내용을 찾습니다.

3. update-form.jsp 를 실행하게 합니다.

 

update-form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    
<form method="post" action="UpdatePost.do">
		<table class="table">
			<tr>
				<td>
				<input type="hidden" name="no" value="${post.no}">
				<input type="text" name="title" value="${post.title}" required="required">
				</td>
			</tr>
			<tr>
				<td><textarea rows="10" class="form-control" name="content"  required="required">${post.content}</textarea></td>
			</tr>
		</table>
		<div class="text-center">
			<button type="submit" class="btn btn-success">확인</button>
			<button type="reset" class="btn btn-success">취소</button>
		</div>
</form>

기존에 저장한 게시글의 내용을 객체에 저장하여 데이터를 불러옵니다.

 

글 수정하기 기능

1. SQL 제작

UPDATE board SET title=?,content=? WHERE no=?

번호가 몇번인 게시물의 제목과 내용 변경하는 문장입니다.

2. Test Case 제작

public class TestUnitUpdatePost {
	public static void main(String[] args) {
		try {
			PostVO post = new PostVO();
			post.setNo(1);
			post.setTitle("야구");
			post.setContent("한화이글스");
			MemberVO mvo = new MemberVO();
			mvo.setId("spring");
			post.setMemberVO(mvo);
			BoardDAO.getInstance().updatePost(post);
			System.out.println("update ok");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
public void updatePost(PostVO postVO) throws SQLException {
	Connection con = null;
	PreparedStatement pstmt = null;
	try {
	con = dataSource.getConnection();
		String sql = "UPDATE board SET title=?,content=? WHERE no=?";
		pstmt = con.prepareStatement(sql);
		pstmt.setString(1, postVO.getTitle());
		pstmt.setString(2, postVO.getContent());
		pstmt.setLong(3, postVO.getNo());
		pstmt.executeUpdate();
	} finally {
	closeAll(pstmt, con);
	}
}

1. 값을 받아서 객체로 보내주고 sql 실행하면 됩니다.

3. Controller 제작

public class UpdatePostController implements Controller {
	@Override
	public String handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		if(request.getMethod().equals("POST")==false)
			throw new ServletException("POST 방식만 서비스 됩니다");		
		
		HttpSession session=request.getSession(false);
		if(session==null||session.getAttribute("mvo")==null) {
			System.out.println("**비인증 상태이므로 서비스 할 수 없습니다**");
			return "redirect:FindPostList.do";
		}			
		long no=Long.parseLong(request.getParameter("no"));
		String title=request.getParameter("title");
		String content=request.getParameter("content");
		PostVO postVO=new PostVO();
		postVO.setNo(no);
		postVO.setTitle(title);
		postVO.setContent(content);
		BoardDAO.getInstance().updatePost(postVO);
		return "redirect:FindPostList.do";
	}
}

1. post 방식이 아니면 작동 불가

2. session 이 없으면 작동 불가

3. 자신이 수정하는 글의 번호, 제목, 내용을 가져와서 DAO를 이용하여 수정합니다.

4. 수정한 이후에는 리스트 페이지로 이동하게 합니다.

 

글 삭제하기

1. SQL 제작

DELETE FROM board WHERE no=4

4번 게시물 삭제 SQL입니다.

2. Test Case 제작

public class TestUnitDeletePost {
	public static void main(String[] args) {
		try {
			long postNo = 1;
			BoardDAO.getInstance().deletePostByNo(postNo);
			System.out.println("delete ok");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
public void deletePostByNo(long no) throws SQLException {
	Connection con = null;
	PreparedStatement pstmt = null;
	try {
		con = dataSource.getConnection();
		String sql = "delete from board where no=?";
		pstmt = con.prepareStatement(sql);
		pstmt.setLong(1, no);
		pstmt.executeUpdate();
	} finally {
		closeAll(pstmt, con);
	}
}

1. post no 만 보내주면 sql을 실행할 수 있습니다.

 

3. Controller 제작

public class DeletePostController implements Controller {
	@Override
	public String handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		if (request.getMethod().equals("POST") == false)
			throw new ServletException("POST 방식만 서비스 됩니다");

		HttpSession session = request.getSession(false);
		if (session == null || session.getAttribute("mvo") == null) {
			System.out.println("**비인증 상태이므로 서비스 할 수 없습니다**");
			return "redirect:FindPostList.do";
		}
		long no = Long.parseLong(request.getParameter("no"));
		BoardDAO.getInstance().deletePostByNo(no);
		return "redirect:FindPostList.do";
	}
}

1. post 방식이 아니면 동작 불가

2. session이 없으면 동작 불가

3. test 코드와 같은 방식으로 삭제됩니다.

4. 삭제 후 list 페이지로 이동합니다.

 

소감

이렇게 오늘은 게시글 삭제와 수정에 대하여 알아보았습니다. 조회수 관련 내용은 해야 할지 안 해야 할지 고민이 됩니다. 쿠키 방식과 세션방식 두 가지가 있는데, 어느 게 나은지는 참 어렵습니다. 세션을 하면 로그아웃하면 모든 정보가 없어져서 로그아웃을 하면 다시 조회수를 늘릴 수 있고, 쿠키를 하자니 데이터 저장에 한계가 있습니다.

 

만약에 조회수가 중요한 프로그램을 만들면 데이터베이스에서 관리하면서 스케줄러를 이용해서 하루나 며칠이 지나면 조회를 했다는 것을 초기화하는 시스템을 만들어 놔야겠습니다.

 

좋은 글 하나 읽었는데 공유해보겠습니다.

어떠한 제품의 가격은 결국 수요의 증가로 가격이 측정된다고 합니다. 과일로 예를 들어볼게요.

조금은 잔인한 말이지만 우리는 과일을 구입할 때 과일의 품질이나 맛을 보고 구매를 합니다. 하지만 과일을 기르는 노고와 그러한 환경을 보지않습니다. 그니까 공급을 하는 과정을 알아주지 않는다는 말이죠.

그래서 블로그에 글을 작성하거나 어떠한 결과물을 만들 때  결과물의 퀄리티 평가를 잘 받아야한다는 말입니다.

최대한 독자들의 편의를 위해 노력해야겠습니다.

반응형