카테고리 없음

[Mybatis + Ajax] 게시물 삭제 구현해보기

Egu99 2021. 6. 1. 12:58

** 이전 단순 서블릿 프로젝트에서 Mybatis와 Ajax를 도입했다.

 

[Servlet] 게시물 삭제 구현하기

** 이전에 JSP로 만들었던 코드를 이용해 이를 서블릿으로 구현해보았다. deleteAction.jsp -> bbsD" data-og-host="egu99.tistory.com" data-og-source-url="https://egu99.tistory.com/43" data-og-url="https:..

egu99.tistory.com

 

   2. 삭제하기    

 

   (1) View.jsp   

<e:if test="${sessionScope.user.userID == b.userID}">
	<a href="update2?bbsID=${b.bbsID}" class="btn btn-info">수정</a>
	<a onclick= "bbsDelete(); return false" href='javascript:void(0);'  class="btn btn-danger">삭제</a>
</e:if>
<script type="text/javascript">
	
	var bbsDelete = function () {
		
		if (confirm("정말 삭제하시겠습니까?") == false){    //확인
			return;
		}

		var bbsID = "<e:out value='${b.bbsID}' />";
		var data = encodeURIComponent(bbsID);
		
		$.ajax({
			url: "./delete2?bbsID="+bbsID,
			type: "Get",
			dataType: "json"
			
		}).done(function(data) {
			
			if(data.chk == 1){
				alert("글이 삭제되었습니다.");
				location.href ="bbs2";
			}else{
				alert("삭제가 실패하였습니다.");
			}
			
		}).fail(function(err) {
			console.log(err);
		});
	}



</script>
  • a태그의 수정 버튼을 누르면 아래 javascript 함수인 bbsDelete가 실행됨.
  • 정말 삭제할지 confrim창으로 확인하여 취소시 retern, 확인시 진행하도록한다.
  • view서 b라는 키로 VO객체를 받은 상태이고 그 객체의 bbsID가 필요하므로 JSTL을 이용해 자바스크립트에서 받는다.
  • bbsID를 Ajax로 보내는데 이번엔 Get방식으로 보내고 Json으로 받는다.
  • 응답받은 값이 1인 경우 삭제 성공, 아닐 경우 실패.

 

   (2) 컨트롤러로 오기 전   

  • 삭제를 하려면 우선 권한이 있어야하는데 그럴려면 로그인이 되어있는지를 먼저 확인하고, 이 글이 삭제 가능한 상태(유효한 게시물)이어야하며, 마지막으로 글쓴이와 로그인한 회원이 같은지 검증해야한다.
  • 서블릿 필터를 만들어 모두 순서대로 체크하였으며 로그인 확인은 여기, 유효 게시물 확인은 여기, 권한 검증은 여기 코드를 참조.
 

[ServletFilter] 로그인 필터 구현해보기

[JavaScript] 로그인과 세션 그리고 웹스토리지 ** 부처님 오신날에 쉬는 동안 문득 세션 확인에 대한 문제점이 떠올랐다. ** 기존의 로그인 확인은 컨트롤러에서 세션을 확인했다. 그도 그럴 것이

egu99.tistory.com


 

   (3) DeleteControl.java   

@WebServlet("/delete2")
public class DeleteControl2 extends HttpServlet{

	
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//필터 통해서 로그인 확인, 삭제 권한 확인, 게시물 상태 확인 후 이쪽으로
		
		String bbsID_ = request.getParameter("bbsID");
		int bbsID = Integer.parseInt(bbsID_);
		
		int result = BbsDAO2.getInstance().delete(bbsID);
		HashMap<String, Integer>map = new HashMap<String, Integer>();
		
		map.put("chk", result);
		
		String gson = new Gson().toJson(map);
		response.getWriter().write(gson);
		
	}
}
  • bbsID를 받고 BbsDAO의 delete 메서드의 인자로 넣어 호출하고 int형을 반환 받는다.
  • HashMap을 <String, Integer>로 해두고 바로 result값을 넣었더니 코드가 줄었다. 
  • map을 Gson라이브러리로 json화 시킨 후 ajax 응답으로 보낸다.

 

   (4) BbsDAO.java + bbsDelete.xml   

public class BbsDAO2 {

	private static BbsDAO2 bao;
	SqlSessionFactory factory;
	
	private BbsDAO2() {
		factory = MybatisConnector.getInstance().getFactory();
		
	}
	
	public static BbsDAO2 getInstance() {
		if(bao == null) {
			bao = new BbsDAO2();
		}
		return bao;
	}
	
	//게시물 삭제하기
	public int delete(int bbsID) {
		
		SqlSession session = factory.openSession(true);
		int result = session.delete("bbs.delete", bbsID);		
		
		return result;
	}
	

}
  	<!-- 삭제하기 -->
  	<update id="delete" parameterType="int">
  		update BBS set bbsAvailable = 0 where bbsID = #{bbsID};
  	</update>
  • delete문을 써서 아예 레코드를 삭제하는 것이 아니라 bbsAvailable을 0으로 바꾸어 이용불가하게끔 update한다.
  • mapper에서 update 성공시 DAO에 1을 반환할 것이고 DAO는 다시 컨트롤러에 1을 반환할 것이다.

 


   (5) 결과 화면   

 

 

삭제