도서 정보 수정 화면 구현하기
<도서 수정> 버튼의 링크는 book_detail.jsp에 다음과 같이 명시되어 있다.
<c:url value='/book/admin/modifyBookForm' var='modify_url'>
<c:param name='b_no' value='${bookVo.b_no}'/>
</c:url>
<a class="modify_book_button" href="${modify_url}">도서 수정</a>
<도서 수정> 버튼을 클릭하면 서버에 /book/admin/modifyBookForm 요청이 발생하며, 매개변수로 도서를 구분할 수 있는 b_no가 함께 전달된다.
컨트롤러 기능 구현
클라이언트의 요청을 처리할 수 있는 메서드를 BookController.java에 선언한다.
// 도서 수정
@GetMapping("/modifyBookForm")
public String modifyBookForm(@RequestParam("b_no") int b_no, Model model) {
System.out.println("[BookController] bookDetail()");
String nextPage = "admin/book/modify_book_form";
BookVo bookVo = bookService.modifyBookForm(b_no);
model.addAttribute("bookVo", bookVo);
return nextPage;
}
서비스 기능 구현
컨트롤러에서 호출하는 modifyBookForm()을 서비스(BookService)에 선언한다.
DAO(BookDao)에 selectBook()을 이용해서 도서를 검색한다. 그리고 결과를 컨트롤러에 반환한다.
public BookVo modifyBookForm(int b_no) {
System.out.println("[BookService] modifyBookForm()");
return bookDao.selectBook(b_no);
}
도서 정보 수정 처리하기
도서 정보 수정(modify_book_form.jsp) 화면은 도서 등록 화면과 거의 비슷하다. 차이점이라면 기존에 등록되어 있는 도서 정보가 기본값으로 출력된다는 점이다. 다음은 도서 정보를 수정하는 <form>이다.
· <form>의 action은 도서 등록 요청에 대한 서버 URI(/book/admin/modifyBookConfirm)를 의미한다.
· enctype은 이미지(도서표지) 파일을 업로드 하기 위한 설정(multipart/form-data)
<form action="<c:url value='/book/admin/modifyBookConfirm' />" name="modify_book_form" method="post" enctype="multipart/form-data">
<input type="hidden" name="b_no" value="${bookVo.b_no}">
<input type="text" name="b_name" value="${bookVo.b_name}" placeholder="INPUT BOOK NAME."> <br>
<input type="text" name="b_author" value="${bookVo.b_author}" placeholder="INPUT BOOK AUTHOR."> <br>
<input type="text" name="b_publisher" value="${bookVo.b_publisher}" placeholder="INPUT BOOK PUBLISHER."> <br>
<input type="text" name="b_publish_year" value="${bookVo.b_publish_year}" placeholder="INPUT BOOK PUBLISH YEAR."> <br>
<input type="text" name="b_isbn" value="${bookVo.b_isbn}" placeholder="INPUT BOOK ISBN."> <br>
<input type="text" name="b_call_number" value="${bookVo.b_call_number}" placeholder="INPUT BOOK CALL NUMBER."> <br>
<select name="b_rantal_able">
<option value="">SELECT BOOK RANTAL ABLE.</option>
<option value="0" <c:if test="${bookVo.b_rantal_able eq '0'}"> selected </c:if>>UNABLE.</option>
<option value="1" <c:if test="${bookVo.b_rantal_able eq '1'}"> selected </c:if>>ABLE.</option>
</select><br>
<input type="file" name="file"><br>
<input type="button" value="modify book" onclick="modifyBookForm();">
<input type="reset" value="reset">
</form>
컨트롤러 기능 구현
BookController에 /book/admin/modifyBookConfirm 요청을 처리할 수 있는 modifyBookConfirm()을 만들고 매핑한다.
// 도서 수정 확인
@PostMapping("/modifyBookConfirm")
public String modifyBookConfirm(BookVo bookVo, @RequestParam("file") MultipartFile file) {
System.out.println("[BookController] modifyBookConfirm()");
String nextPage = "admin/book/modify_book_ok";
if (!file.getOriginalFilename().equals("")) {
// 파일 저장
String savedFileName = uploadFileService.upload(file);
if (savedFileName != null)
bookVo.setB_thumbnail(savedFileName);
}
int result = bookService.modifyBookConfirm(bookVo);
if (result <= 0)
nextPage = "admin/book/modify_book_ng";
return nextPage;
}
서비스 기능 구현
BookService에 modifyBookConfirm()을 선언한다.
public int modifyBookConfirm(BookVo bookVo) {
System.out.println("[BookService] modifyBookConfirm()");
return bookDao.updateBook(bookVo);
}
도서 정보 업데이트 처리하기
도서 정보 업데이트를 위해 BookDao에 updateBook()을 다음과 같이 선언한다.
public int updateBook(BookVo bookVo) {
System.out.println("[BookDao] updateBook()");
List<String> args = new ArrayList<String>();
String sql = "UPDATE tbl_book SET ";
if (bookVo.getB_thumbnail() != null) {
sql += "b_thumbnail = ?, ";
args.add(bookVo.getB_thumbnail());
}
sql += "b_name = ?, ";
args.add(bookVo.getB_name());
sql += "b_author = ?, ";
args.add(bookVo.getB_author());
sql += "b_publisher = ?, ";
args.add(bookVo.getB_publisher());
sql += "b_publish_year = ?, ";
args.add(bookVo.getB_publish_year());
sql += "b_isbn = ?, ";
args.add(bookVo.getB_isbn());
sql += "b_call_number = ?, ";
args.add(bookVo.getB_call_number());
sql += "b_rantal_able = ?, ";
args.add(Integer.toString(bookVo.getB_rantal_able()));
sql += "b_mod_date = NOW() ";
sql += "WHERE b_no = ?";
args.add(Integer.toString(bookVo.getB_no()));
int result = -1;
try {
result = jdbcTemplate.update(sql, args.toArray());
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
실제로 도서 정보가 수정되고 데이터베이스에 적용되는지 확인해본다.
수정전 | 수정후 |
![]() |
![]() |
도서 정보 삭제 처리하기
데이터베이스에 등록된 도서를 삭제해본다. 도서 삭제는 수정과 마찬가지로 상세 화면에서 진행된다.
다음은 book_detail.jsp 파일의 '도서 삭제'에 해당되는 코드이다.
<a class="delete_book_button" href="#none"
onclick="deleteBook(${bookVo.b_no},'${bookVo.b_name}')">도서 삭제</a>
<도서 삭제> 버튼을 클릭하면 deleteBook() 자바스크립트 함수를 호출한다. 그리고 도서 번호(b_no)와 도서 이름(b_name)을 매개변수로 전달한다. deleteBook()은 book_detail_js.jsp에 정의되어 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<script type="text/javascript">
function deleteBook(b_no, b_name) {
console.log('deleteBook() CALLED!!');
let result = confirm('도서(' + b_name + ')를(을) 정말 삭제 하시겠습니까?');
if (result)
location.href = "<c:url value='/book/admin/deleteBookConfirm?b_no='/>" + b_no;
}
</script>
컨트롤러 기능 구현
BookController에 /book/admin/deleteBookConfirm 요청을 처리할 수 있는 deleteBookConfirm()을 만들고 매핑한다.
// 도서 삭제 확인
@GetMapping("/deleteBookConfirm")
public String deleteBookConfirm(@RequestParam("b_no") int b_no) {
System.out.println("[BookController] deleteBookConfirm()");
String nextPage = "admin/book/delete_book_ok";
int result = bookService.deleteBookConfirm(b_no);
if (result <= 0)
nextPage = "admin/book/delete_book_ng";
return nextPage;
}
서비스 기능 구현
BookService에 deleteBookConfirm()을 선언한다.
public int deleteBookConfirm(int b_no) {
System.out.println("[BookService] deleteBookConfirm()");
return bookDao.deleteBook(b_no);
}
도서 정보 삭제 처리하기(DAO)
도서 정보를 삭제하기 위해서 BookDao에 deleteBook()을 다음과 같이 선언한다.
public int deleteBook(int b_no) {
System.out.println("[BookDao] deleteBook()");
String sql = "DELETE FROM tbl_book " + "WHERE b_no = ?";
int result = -1;
try {
result = jdbcTemplate.update(sql, b_no);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
실제로 특정 도서를 삭제하고 데이터베이스에서 정보가 정상적으로 삭제되는지 확인해본다.
![]() |
![]() |
'Spring & Springboot > 올인원 스프링 프레임워크' 카테고리의 다른 글
전자 도서관 프로젝트 - 사용자 홈 구현 (0) | 2023.12.02 |
---|---|
전자 도서관 프로젝트 - 사용자 관련 기능 구현 준비 (0) | 2023.12.02 |
전자 도서관 프로젝트 - 도서 검색 기능 구현 (0) | 2023.11.30 |
전자 도서관 프로젝트 - 신규 도서 등록 기능 구현 (0) | 2023.11.29 |
전자 도서관 프로젝트 - 관리자 새 비밀번호 생성 기능 구현 (0) | 2023.11.29 |