게시글 삭제
01. view.jsp
- 삭제 하기 버튼에 id 부여
- <script> 생성
- 만약 javaScript 동작이 제대로 되지 않는다면 파일 상단에 <head></head> 안에 라이브러리 잘 포함되어 있는지 확인한다.
<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
꼭 기입해주기!
- 게시글 삭제 전에 한 번 더 확인받는 alert 띄우기
<script>
$(document).ready(() => {
$("#btnDelete").on("click", () => {
if(confirm("정말 게시글을 삭제 하시겠습니까?")){
location.replace("${ pageContext.request.contextPath }/board/delete?no=${ board.no }");
}
})
});
</script>
- 진짜로 글을 삭제하기 전에! 로그인 하지 않으면 글 상세조회 할 때 수정과 삭제 버튼은 나올 수 없는 기능을 구현한다.
<c:if test="${ loginMember != null }">
<button type="button" id="btnEdit">수정</button>
<button type="button" id="btnDelete">삭제</button>
</c:if>
<!-- 혹은 -->
<c:if test="${ !empty loginMember }">
<button type="button" id="btnEdit">수정</button>
<button id="btnDelete">삭제</button>
</c:if>
- 여기까지만 하면 로그인만 하면 글 수정, 글 삭제가 가능하기 때문에! 내가 작성한 글만 수정과 삭제가 가능한 기능을 구현한다.
<c:if test="${ loginMember != null && loginMember.id == board.writerId }">
<button type="button" id="btnEdit">수정</button>
<button type="button" id="btnDelete">삭제</button>
</c:if>
- <button>의 onclick 이벤트가 수행되면서 URL을 바꿔줘야 하기 때문에 경로를 함수 안에 작성
location.replace("${ pageContext.request.contextPath }/board/delete?no=${ board.no }");
02. BoardDeleteServlet.java
- 로그인 체크 기능 구현
- 본인 게시글 삭제 여부 확인 기능 구현
-> 로그인 되었으면 데이터베이스에서 넘어오는 게시글의 no 값 가지고 조회한 다음에 그 게시글의 작성자와 로그인 체크할 때 사용한 loginMember에 있는 작성자 아이디가 같은지 확인하고 삭제
- BoardService 객체 선언
- 글 번호에 해당하는 no 값을 가지고 온다.
- DML 수행문에 해당하는 DELETE 쿼리의 수행 결과 값은 정수형이기 때문에 int result = 0; 선언
- result는 service한테 delete() 메소드를 실행시켜 달라고 하고, 매개값으로는 no를 넘긴다.
- if문 작성하여 result 결과가 0보다 크거나 작은 걸로 게시글 삭제 성공과 실패 메시지를 사용자에게 보여준다.
03. BoardService.java
- delete(int no) 메소드 생성
- 결과 값으로 나올 int result = 0; 선언
- Connection 객체 생성
- result = dao한테 updateStatus(connection, no) 메소드를 실행하라고 할 것임
- result 결과가 0보다 크거나 작은 걸로 판단하여 데이터 베이스에 확정할 commit 혹은 rollback하는 구문 작성
- close(connection);
- return result;
04. BoardDao.java
- updateStatus(Connection connection, int no) 메소드 생성
- PreparedStatement 객체 생성
- query 문 작성 (게시글의 상태 컬럼을 변경하는 UPDATE문 사용 or 게시글 행 단위 삭제하는 DELETE문 사용 선택)
** 여기에서 발생하는 이슈!
- 삭제했던 글 번호를 URL에 직접 작성하면, 글 상세 조회하는 페이지는 보이고 안에 데이터는 안 보이는 빈껍데기같은 화면이 보인다. 여기를 처리하는 로직이 필요하다!
05. ViewServlet.java
- board 가 조회되는 값이 null이면 msg 쪽으로 보내는 처리
- alert('존재하지 않는 게시물입니다.') 띄우고 다시 게시글 리스트 화면으로 보여질 수 있도록 한다.
게시글 수정
01. view.jsp
- 수정하기 버튼 태그에 작성할 것
- alert 띄우고 작업하려면 밑에 <script> 자바스크립트 함수 안에 수정하기 버튼에 부여한 #id를 가지고 작업해도 되고, 이 작업이 굳이 필요하지 않다면, 그냥 수정하기 버튼 눌렀을 때 onclick으로 페이지 이동
02. BoardUpdateServlet.java
- 로그인, 작성자 확인하는 로직 필요!
[참고!]
- 서블릿마다 BoardService 객체를 만들어서 가지고 있다. 서블릿 소멸 될 때 같이 소멸 된다. 싱글톤 패턴을 사용할 수도 있고, 사용할 때 객체를 만들고 호출 끝나면 소멸되도록 구현하는 것이 효과적이다.
- 변수에 담겨 있는 것이 아니기 때문에 한 번 사용되고 나면 가비지 콜렉터의 대상이 된다.
- 중복으로 쓰이는 객체를 bean으로 사용한다. 객체로 만들고 필요한 시점에만 호출해서 사용 -> Spring
- 가지고 온 board 의 정보를 update.jsp에 넘겨준다. HOW?
- request.setAttribute 으로 값을 담아놓고
- request.getRequestDispatcher("view로 보여줄.jsp").forward(request, response);
03. update.jsp
- 작성했던 내용이 폼에 담겨 있을 수 있도록, 제목, 작성자, 첨부파일, 내용에 value="${ board.속성 }" 작성
- 수정하기 버튼의 타입은 submit 이기 때문에 크게 감싸져있는 <form> 태그에 action="URL" 속성에 정해진 URL로 이동하고, method는 POST 형식이며, 파일도 보내기 때문에 enctype 속성에 enctype="multipart/form-data" 인코딩 변경
- <form> 태그 안에서 input type="hidden"으로 게시글 번호, 원본 파일명, 서버에 저장된 파일명을 value 값으로 갖게 한다.
04. BoardUpdateServlet.java
- 인코딩이 변경됐기 때문에, 사용자가 보내는 값을 일반 request 객체에서는 처리할 수 없다. 따라서 doPost() 메소드에서 MultipartRequest 객체를 만들어서 처리한다.
- 특히, 첨부파일이 있을 경우 파일 명들을 어떻게 처리할 것인지 로직 구현
- 처리된 결과는 BoardService에게 save(board) 메소드를 통해 업데이트를 하도록 요구
05. BoardService.java
- result 결과가 0보다 크면 게시글 수정 성공, 0보다 같거나 작으면 게시글 수정 실패 알람
if(board.getNo() != 0) {
result = dao.updateBoard(connection, board);
} else {
result = dao.insertBoard(connection, board);
}
// save가 된 no값이 존재하면(즉, 0이 아니면)
// dao에게 update를 수행
// 그렇지 않으면,
// dao에게 insert를 수행
06. BoardDao.java
- updateBoard(Connection connection, Board board) 메소드 생성
- PreparedStatement 객체 생성
- UPDATE query문 작성
- pstmt 객체에 쿼리문 위치홀더에 해당하는 값들을 set 작업
- 예외처리!
- close(pstmt);
** 여기에서!
- resources > upload 에 올라간 파일은 사용자가 글을 수정할 때 파일을 수정해서 올린다고 하더라도, 기존에 올라가 있떤 파일이 삭제 되지 않는다.
- 보관을 해두었다가 일정 시간이 지난 후에 삭제하기도하고, 바로 삭제하기도 한다. 혹은 기존에 있던 파일의 경로를 변경해서 temp와 같은 폴더 생성하고 거기에 일정 시간동안 보관했다가 한꺼번에 delete 하기도 한다.
07. BoardUpdateServlet.java
- 사용자가 파일을 수정하면 기존에 업로드 했던 파일을 삭제하는 로직 추가
// File(java.io) 객체 생성
File file = new File(path + "/" + board.getRenamedFileName());
if(file.exists()) {
file.delete();
}
'Programming > SERVER' 카테고리의 다른 글
DAY 127. MVC2 패턴 - 댓글 기능 (0) | 2021.12.23 |
---|---|
DAY 126. MVC2 패턴 - 게시글 상세 조회 (0) | 2021.12.22 |
DAY 124. MVC2 패턴 - 게시글 작성 (0) | 2021.12.20 |
DAY 123. MVC2 패턴 - 게시글 목록, 페이징 (0) | 2021.12.19 |
DAY 120. MVC2 패턴 - 회원가입 (0) | 2021.12.16 |