Spring & Springboot/올인원 스프링 프레임워크

전자 도서관 프로젝트 - 도서 정보 수정과 삭제 기능 구현

YJ_ma 2023. 11. 30. 23:57

도서 정보 수정 화면 구현하기

<도서 수정> 버튼의 링크는 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;
}

 

실제로 특정 도서를 삭제하고 데이터베이스에서 정보가 정상적으로 삭제되는지 확인해본다.