본문 바로가기

Programming/SERVER

DAY 125. MVC2 패턴 - 게시글 삭제, 게시글 수정

게시글 삭제

 

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();
}