Spring/Maven Project

Spring에 게시물 업데이트, 삭제 처리 - Update, Delete

carrotweb 2023. 5. 1. 23:22
728x90
반응형

이번에는 CRUD의 U(Update)와 D(Delete)로 게시물을 수정하고 삭제하는 UI와 UPDATE / DELETE Query, DAO, Service, Controller를 추가하도록 하겠습니다.

 

 

Maven Spring Project의 Board Mapper XML에 Update, Delete Query 추가하기

 

1. com.home.study.test1.sqlmapl.mappers.mariadb.board 패키지에 있는 BoardMapper.xml 파일을 오픈합니다.

 

2. INT_BOARD_TB(게시판) Table에 데이터(게시물)를 수정(update) 하기 위해서 <update>으로 쿼리문을 생성하고 데이터(게시물)를 삭제(delete) 하기 위해서 <delete>으로 쿼리문을 생성합니다.

  1. <update>와 <delete>의 id 속성은 update와 delete를 구분하는 식별자로 중복되지 않는 이름으로 입력합니다. id 속성은 DAO에서 구문을 찾을 때 사용됩니다.
  2. <update>와 <delete>안에는 UPDATE와 DELETE구문을 사용하여 데이터베이스에서 게시물의 시퀀스를 기준으로 데이터를 수정하고 삭제하게 합니다.
  3. <update>와 <delete>의 parameterType 속성은 전송된 데이터를 받을 Model(모델) 명을 입력합니다.
<!--
	게시물을 수정합니다.
-->
<update id="updateBoardItem" parameterType="Board">
	UPDATE INT_BOARD_TB
	   SET BRD_SUBJECT = #{subject},
	       BRD_CONTENT = #{content},
	       MOD_ID = #{modificationId},
	       MOD_DTM = NOW()
	 WHERE BRD_SEQ = #{sequence}
</update>

<!--
	게시물을 삭제합니다.
-->
<delete id="deleteBoardItem" parameterType="Board">
	DELETE
	  FROM INT_BOARD_TB
	 WHERE BRD_SEQ = #{sequence}
</delete>

 

 

Maven Spring Project의 DAO - Board Interface에 update, delete 메서드 추가하기

 

1. Java Resource > src/main/java에서 com.home.study.test1.board.dao 패키지에 있는 IBoardDao Interface(인터페이스)를 오픈합니다. (IBoardDao.java)

 

2. INT_BOARD_TB(게시판) Table에 데이터(게시물)를 수정(update), 삭제(delete) 하기 위해 updateBoardItem, deleteBoardItem 메서드를 선언합니다.

package com.home.study.test1.board.dao;

import java.util.List;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

public interface IBoardDao {

	int selectBoardListCount(BoardSearch boardSearch);
	
	List<Board> selectBoardList(BoardSearch boardSearch);
	
	int insertBoardItem(Board board);
	
	Board selectBoardItem(Board board);
	
	int updateBoardItem(Board board);
	
	int deleteBoardItem(Board board);
}

 

 

Maven Spring Project의 Dao - Board Implement에 update, delete 메서드 구현 추가하기

 

1. Java Resource > src/main/java에서 com.home.study.test1.board.dao.impl 패키지에 있는 BoardDaoImpl 클래스를 오픈합니다. (BoardDaoImpl.java)

 

2. BoardDaoImpl 클래스에서 IBoardDao Interface(인터페이스)의 updateBoardItem, deleteBoardItem 메서드를 구현합니다.

package com.home.study.test1.board.dao.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;

import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

@Repository("BoardDaoImpl")
public class BoardDaoImpl implements IBoardDao {

	protected static final String SQL_FILE_PATH = "com.home.study.test1.board.mapper.mariadb.BoardMapper.";

	@Autowired
	@Qualifier("sqlSessionMariaDB")
	private SqlSession sqlSession;

	@Override
	public int selectBoardListCount(BoardSearch boardSearch) {
		return ((Integer)sqlSession.selectOne(SQL_FILE_PATH + "selectBoardListCount", boardSearch)).intValue();
	}

	@Override
	public List<Board> selectBoardList(BoardSearch boardSearch) {
		return sqlSession.selectList(SQL_FILE_PATH + "selectBoardList", boardSearch);
	}

	@Override
	public int insertBoardItem(Board board) {
		return sqlSession.insert(SQL_FILE_PATH + "insertBoardItem", board);
	}

	@Override
	public Board selectBoardItem(Board board) {
		return sqlSession.selectOne(SQL_FILE_PATH + "selectBoardItem", board);
	}

	@Override
	public int updateBoardItem(Board board) {
		return sqlSession.update(SQL_FILE_PATH + "updateBoardItem", board);
	}

	@Override
	public int deleteBoardItem(Board board) {
		return sqlSession.delete(SQL_FILE_PATH + "deleteBoardItem", board);
	}
}

 

 

Maven Spring Project의 Service - Board Interface에 update, delete 메서드 추가하기

 

1. Java Resource > src/main/java에서 com.home.study.test1.board.service 패키지에 있는 IBoardService Interface(인터페이스)를 오픈합니다. (IBoardService.java)

 

2. DAO (Board Interface, Implement)을 사용하여 INT_BOARD_TB(게시판) Table에 데이터(게시물)를 수정(update), 삭제(delete) 하기 위해 updateBoardItem, deleteBoardItem 메서드를 선언합니다.

package com.home.study.test1.board.service;

import java.util.List;

import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;

public interface IBoardService {

	List<Board> selectBoardList(BoardSearch boardSearch);
	
	boolean insertBoardItem(Board board);
	
	Board selectBoardItem(Board board);
	
	boolean updateBoardItem(Board board);
	
	boolean deleteBoardItem(Board board);
}

 

 

Maven Spring Project의 Service - Board Implement에 update, delete 메서드 구현 추가하기

 

1. Java Resource > src/main/java에서 com.home.study.test1.board.service.impl 패키지에 있는 BoardServiceImpl 클래스를 오픈합니다. (BoardServiceImpl.java)

 

2. BoardServiceImpl 클래스에서 IBoardService Interface(인터페이스)의 updateBoardItem, deleteBoardItem 메서드를 구현합니다.

package com.home.study.test1.board.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.home.study.common.search.Pagination;
import com.home.study.test1.board.dao.IBoardDao;
import com.home.study.test1.board.model.Board;
import com.home.study.test1.board.model.BoardSearch;
import com.home.study.test1.board.service.IBoardService;

@Service
public class BoardServiceImpl implements IBoardService {

	@Autowired
	IBoardDao boardDao;

	@Override
	public List<Board> selectBoardList(BoardSearch boardSearch) {
		if (boardSearch.getPagination() == null) {
			boardSearch.setPagination(new Pagination());
		}
		
		int count = boardDao.selectBoardListCount(boardSearch);
		boardSearch.getPagination().setRecordTotalCount(count);
		
		List<Board> boardList = null;
		if (count > 0) {
			boardSearch.getPagination().processZero();
			boardList = boardDao.selectBoardList(boardSearch);
		}
		return boardList;
	}

	@Override
	public boolean insertBoardItem(Board board) {
		return (boardDao.insertBoardItem(board) == 1) ? true : false;
	}

	@Override
	public Board selectBoardItem(Board board) {
		return boardDao.selectBoardItem(board);
	}

	@Override
	public boolean updateBoardItem(Board board) {
		return (boardDao.updateBoardItem(board) == 1) ? true : false;
	}

	@Override
	public boolean deleteBoardItem(Board board) {
		return (boardDao.deleteBoardItem(board) == 1) ? true : false;
	}
}

 

수정 UI은 입력 UI와 동일합니다. 그래서 입력 UI인 boardform.jsp을 그대로 사용할 겁니다.

다만, 입력 모드인지 수정 모드인지 구분하기 위해서 Controller에서 모드를 전달할 수 있게 ModelMap에 추가하고 수정 모드일 때 게시물의 시퀀스를 사용하기 위해서 <form:hidden> 태그를 추가하겠습니다.

 

먼저 Controller에 추가한 다음 boardform.jsp 파일을 수정하도록 하겠습니다.

 

 

Maven Spring Project의 Board Controller에 editBoardForm, editBoard 추가하기

 

1. Java Resource > src/main/java에서 com.home.study.test1.board.controller 패키지에 있는 BoardController 클래스를 오픈합니다. (BoardController.java)

 

2. 수정 요청 URL("/board/editform.do")이 왔을 때 실행될 editBoardForm 메서드를 생성합니다. 파라미터로 HTTP 요청을 처리할 수 있는 HttpServletRequest request와 HTTP 응답을 처리할 수 있는 HttpServletResponse response, 게시물 정보를 받아 처리할 수 있게 @ModelAttribute Annotation(어노테이션)이 적용된 Board board, 웹 페이지로 정보를 전달할 수 있는 ModelMap model을 추가합니다.

 

3. 전달받은 게시물의 시퀀스를 이용하여 게시물을 조회(selete)하고 입력 폼으로 리턴되게 리턴 값으로 "board/boardform"를 입력합니다. 수정 요청이기 때문에 모드(mode)를 수정 모드(editboard)로 model에 추가합니다.

 

4. 수정 요청 URL이 "/board/editform.do"가 왔을 때 editBoardForm 메서드가 실행될 수 있게 메서드 위에 @RequestMapping Annotation(어노테이션)을 추가합니다.

@RequestMapping(value="/editform", method=RequestMethod.POST)
public String editBoardForm(HttpServletRequest request, HttpServletResponse response,
	@ModelAttribute Board board, ModelMap model) {
	
	Board boardItem = boardService.selectBoardItem(board);
	model.addAttribute("board", boardItem);
	
	model.addAttribute("mode", "editboard");
	return "board/boardform";
}

 

5. boardService의 updateBoardItem 메서드를 사용하여 데이터(게시물)를 수정하기 위해 editBoard 메서드를 생성합니다. 파라미터로 HTTP 요청을 처리할 수 있는 HttpServletRequest request와 HTTP 응답을 처리할 수 있는 HttpServletResponse response, 게시물 정보를 받아 처리할 수 있게 @ModelAttribute Annotation(어노테이션)이 적용된 Board board(유효성 검사를 하기 위해서 Board board 앞에 @Valid를 추가), 유효성 검사 결과를 리턴 받기 위한 BindingResult bindingResult, 웹 페이지로 정보를 전달할 수 있는 ModelMap model을 추가합니다.

 

6 전달된 데이터의 유효성 검사 결과에 오류가 있으면  다시 입력 폼(/board/boardform.do)으로 이동시키고 없으면 수정하고 redirect로 index.do로 이동시킵니다.

 

7. POST 방식으로 요청 URL이 "/board/editboard.do"가 왔을 때 editBoard 메서드가 실행될 수 있게 메서드 위에 @RequestMapping Annotation(어노테이션)을 추가합니다.

@RequestMapping(value="/editboard", method=RequestMethod.POST)
public String editBoard(HttpServletRequest request, HttpServletResponse response,
	@Valid @ModelAttribute("board") Board board, BindingResult bindingResult,
	ModelMap model) {
	if (bindingResult.hasErrors()) {
		return "board/boardform";
	}
	
	board.setModificationId(board.getRegistrationId());
	if (!boardService.updateBoardItem(board)) {
		model.addAttribute("mode", "editboard");
		return "board/boardform";
	}
	
	return "redirect:/index.do";
}

 

이어서, addBoardForm, addBoard 메서드에 모드(mode)를 입력 모드(addboard)로 model에 추가하겠습니다.

 

Maven Spring Project의 Board Controller에 addBoardForm, addBoard 수정하기

 

1. addBoardForm 메서드 안에 모드(mode)를 입력 모드(addboard)로 model에 추가합니다.

@RequestMapping(value="/addform", method=RequestMethod.GET)
public String addBoardForm(HttpServletRequest request, HttpServletResponse response,
		@ModelAttribute("board") Board board, ModelMap model) {
	model.addAttribute("mode", "addboard");
	return "board/boardform";
}

 

2. addBoard 메서드 안에서 등록되지 않을 경우에 모드(mode)를 입력 모드(addboard)로 model에 추가합니다.

@RequestMapping(value="/addboard", method=RequestMethod.POST)
public String addBoard(HttpServletRequest request, HttpServletResponse response,
		@Valid @ModelAttribute("board") Board board, BindingResult bindingResult, ModelMap model) {
	if (bindingResult.hasErrors()) {
		List<FieldError> fieldsErrors = bindingResult.getFieldErrors();
		for (FieldError fieldError : fieldsErrors) {
			System.out.println(fieldError.getField() + " = " + fieldError.getCode() + " / " + fieldError.getDefaultMessage());
		}
		return "board/boardform";
	}
	
	if (!boardService.insertBoardItem(board)) {
		model.addAttribute("mode", "addboard");
		return "board/boardform1";
	}
	
	return "redirect:/index.do";
}

 

 

Maven Spring Project의 Board Controller에 deleteBoard 추가하기

 

1. 삭제 요청 URL("/board/deleteboard.do")이 왔을 때 실행될 deleteBoard 메서드를 생성합니다. 파라미터로 HTTP 요청을 처리할 수 있는 HttpServletRequest request와 HTTP 응답을 처리할 수 있는 HttpServletResponse response, 게시물 정보를 받아 처리할 수 있게 @ModelAttribute Annotation(어노테이션)이 적용된 Board board, 웹 페이지로 정보를 전달할 수 있는 ModelMap model을 추가합니다.

 

2. 전달받은 게시물의 시퀀스를 이용하여 게시물을 삭제(delete)하고 삭제가 되지 않으면 다시 뷰 폼(/board/boardview.do)으로 이동시키고 삭제되면 redirect로 index.do로 이동시킵니다.

 

3. 삭제 요청 URL이 "/board/deleteboard.do"가 왔을 때 deleteboard 메서드가 실행될 수 있게 메서드 위에 @RequestMapping Annotation(어노테이션)을 추가합니다.

@RequestMapping(value="/deleteboard", method=RequestMethod.POST)
public String deleteBoard(HttpServletRequest request, HttpServletResponse response,
	@ModelAttribute Board board, ModelMap model) {
	
	if (!boardService.deleteBoardItem(board)) {
		Board boardItem = boardService.selectBoardItem(board);
		model.addAttribute("board", boardItem);
		return "board/boardview";
	}
	
	return "redirect:/index.do";
}

 

 

 

Maven Spring Project에 Board Form JSP 수정하기

 

1. /src/main/webapp/WEB-INF/views/board/boardform.jsp 파일을 오픈합니다.

 

2. <form:hidden> 태그의 path 속성에 board 객체의 sequence(시퀀스)를 입력하여 <form:form> 태그 안에 추가합니다. 그리고 입력 모드인지 수정 모드인지 구분하기 위해서 타입이 hidden인 <input> 태그로 모드(mode)를 추가합니다. <input> 태그는 전달되는 값이 아니기 때문에 name은 사용하지 않습니다. (만약, Model에 mode를 추가하였다면 name을 사용하시면 됩니다.)

<form:form modelAttribute="board" autocomplete="off">
<form:hidden path="sequence" />
<input type="hidden" id="mode" value="${mode}" />

 

3. 기존의 등록 버튼을 모드(mode)에 따라 등록 또는 수정으로 표시되게 수정합니다.

<div class="buttons">
	<div class="right">
		<button id="saveBtn" class="button blue">
			<c:choose>
				<c:when test="${mode == 'addboard'}">등록</c:when>
				<c:when test="${mode == 'editboard'}">수정</c:when>
			</c:choose>
		</button>
		<button id="cancelBtn" class="button">취소</button>
	</div>
</div>

 

4. 기존의 등록 버튼 클릭 이벤트에서 모드(mode)에 따라 컴펌 메시지가 등록 또는 수정을 변경되게 하고 모드에 따라 등록 URL 또는 수정 URL로 전달되게 수정합니다.

$('#saveBtn').click(function() {
	var mode = $('#mode').val();
	var modeText = "등록";
	var modeUrl = "/board/addboard.do";
	if (mode == "editboard") {
		modeText = "수정";
		modeUrl = "/board/editboard.do";
	}
	var result = confirm(modeText + "하시겠습니까?");
	if (result) {
		var boardForm = $('#board');
		if (!boardForm[0].checkValidity()) {
			boardForm.addClass('was-validated');
		} else {
			boardForm.attr("action", modeUrl);
			boardForm.submit();
		}
	}
});

 

 

Maven Spring Project를 실행하여 웹 브라우저로 확인하기

 

1. "Servers"탭에서 "Tomcat9"를 선택하고 "start"버튼(start the server)을 클릭하면 Tomcat이 실행됩니다.

 

2. 웹 브라우저에서 "http://localhost:9000/index.do"를 입력하고 게시물 리스트에서 11번인 "테스트 제목 11"을 클릭한 후 수정 버튼을 누릅니다. 그리고 제목을 "테스트 제목 111"ㄹ 내용을 "테스트 내용 111"로 수정합니다.

 

3. 수정 버튼을 누르면 게시물이 변경되고 게시물 리스트로 이동하는 것을 확인할 수 있습니다.

 

4. 게시물 리스트에서 11번인 "테스트 제목 111"을 클릭한 후 삭제 버튼을 누릅니다.

 

5. 게시물이 삭제되고 게시물 리스트로 이동하는 것을 확인할 수 있습니다.

 

728x90
반응형