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

전자 도서관 프로젝트 - 도서 검색 기능 구현

YJ_ma 2023. 11. 30. 23:12

도서 검색 처리하기

도서 검색 화면은 nav.jsp에 있다. 다음은 nav.jsp에서 검색에 해당하는 <form>이다.

· 서버에 요청하는 URI(/book/admin/searchBookConfirm)를 설정한다.

· 검색어는 b_name으로 서버에 전송된다.

<div class="search">

    <form action="<c:url value='/book/admin/searchBookConfirm' />" name="search_book_form" method="get">
        <input type="text" name="b_name" placeholder="Enter the name of the book you are looking for.">
        <input type="button" value="search" onclick="searchBookForm();">
    </form>

</div>

 

컨트롤러 기능 구현

클라이언트의 요청을 처리할 수 있는 searchBookConfirm()을 BookController.java에 선언한다.

// 도서 검색
@GetMapping("/searchBookConfirm")
public String searchBookConfirm(BookVo bookVo, Model model) {
    System.out.println("[UserBookCoontroller] searchBookConfirm()");

    String nextPage = "admin/book/search_book";

    List<BookVo> bookVos = bookService.searchBookConfirm(bookVo);

    model.addAttribute("bookVos", bookVos);

    return nextPage;
}

 

서비스 기능 구현

컨트롤러에서 호출하는 searchBookConfirm()을 서비스(BookService)에 선언한다.

public List<BookVo> searchBookConfirm(BookVo bookVo){
    System.out.println("[BookService] searchBookConfirm()");

    return bookDao.selectBookBySearch(bookVo);
}

 

DAO 기능 구현

데이터베이스에서 도서를 검색하는 selectBooksBySearch()를 BookDao에 선언한다.

public List<BookVo> selectBookBySearch(BookVo bookVo){
    System.out.println("[BookDao] selectBooks()");

    String sql = "SELECT * FROM tbl_book "
            + "WHERE b_name LIKE ? "
            + "ORDER BY b_no DESC";

    List<BookVo> bookVos = null;

    try {
        bookVos = jdbcTemplate.query(sql, new RowMapper<BookVo>() {
            @Override
            public BookVo mapRow(ResultSet rs, int rowNum) throws SQLException {
                BookVo bookVo = new BookVo();

                bookVo.setB_no(rs.getInt("b_no"));
                bookVo.setB_thumbnail(rs.getString("b_thumbnail"));
                bookVo.setB_name(rs.getString("b_name"));
                bookVo.setB_author(rs.getString("b_author"));
                bookVo.setB_publisher(rs.getString("b_publisher"));
                bookVo.setB_publish_year(rs.getString("b_publish_year"));
                bookVo.setB_isbn(rs.getString("b_isbn"));
                bookVo.setB_call_number(rs.getString("b_call_number"));
                bookVo.setB_rantal_able(rs.getInt("b_rantal_able"));
                bookVo.setB_reg_date(rs.getString("b_reg_date"));
                bookVo.setB_mod_date(rs.getString("b_mod_date"));

                return bookVo;
            }
        }, "%" + bookVo.getB_name() + "%");
    } catch (Exception e) {
        e.printStackTrace();
    }

    return bookVos.size() > 0 ? bookVos : null;
}

 

이제 실행 결과를 확인한다.

검색 창에 &lsquo;컴퓨팅&lsquo; 키워드로 검색한 결과

 

 

 

도서 상세보기 처리하기

검색 결과가 출력되는 화면은 search_book.jsp로 '도서명'을 클릭하면 해당 도서의 상세보기 화면으로 이동할 수 있다. 다음은 search_book.jsp 중 '도서명'의 링크에 해당하는 코드이다.

<td>
    <c:url value='/book/admin/bookDetail' var='detail_url'>
        <c:param name='b_no' value='${item.b_no}'/>
    </c:url>
    <a href="${detail_url}">${item.b_name}</a>
</td>

 

도서명을 클릭하면 /book/admin/bookDetail 요청이 발생한다. 이때 매개변수로 도서를 구분할 수 있는 b_no를 같이 서버에 전달한다. 그러면 서버는 b_no를 사용해서 해당하는 도서의 상세정보를 데이터베이스에서 조회한다.

 

컨트롤러 기능 구현

클라이언트의 요청을 처리하는 bookDetail()을 BookController.java에 다음과 같이 선언한다.

@GetMapping("/book/admin")
public String bookDetail(@RequestParam("b_no") int b_no, Model model) {
    System.out.println("[BookController] bookDetail()");

    String nextPage = "admin/book/book_detail";

    BookVo bookVo = bookService.bookDetail(b_no);

    model.addAttribute("bookVo", bookVo);

    return nextPage;
}

 

· /bookDetail 요청을 bookDetail()에 매핑한다.

· [admin/book/] 폴더에 있는 book_detail.jsp를 이용해서 클라이언트에 응답한다.

· 도서 상세 정보를 얻기 위해 BookService의 bookDetail()을 호출한다. bookDetail()의 결과는 model에 저장해서 뷰에 전달한다.

 

서비스 기능 구현

컨트롤러에서 호출하는 bookDetail()을 서비스(BookService)에 선언한다.

DAO(BookDao)에 selectBook()을 이용해서 도서를 검색한다. 그리고 결과를 컨트롤러에 반환한다.

public BookVo bookDetail(int b_no) {
    System.out.println("[BookService] bookDetail()");

    return bookDao.selectBook(b_no);
}

 

DAO 기능 구현

데이터베이스에서 도서를 검색하는 selectBook()을 BookDao에 선언한다.

public BookVo selectBook(int b_no) {
    System.out.println("[BookDao] selectBook()");

    String sql = "SELECT * FROM tbl_book WHERE b_no = ?";

    List<BookVo> bookVos = null;

    try {
        bookVos = jdbcTemplate.query(sql, new RowMapper<BookVo>() {

            @Override
            public BookVo mapRow(ResultSet rs, int rowNum) throws SQLException {

                BookVo bookVo = new BookVo();

                bookVo.setB_no(rs.getInt("b_no"));
                bookVo.setB_thumbnail(rs.getString("b_thumbnail"));
                bookVo.setB_name(rs.getString("b_name"));
                bookVo.setB_author(rs.getString("b_author"));
                bookVo.setB_publisher(rs.getString("b_publisher"));
                bookVo.setB_publish_year(rs.getString("b_publish_year"));
                bookVo.setB_isbn(rs.getString("b_isbn"));
                bookVo.setB_call_number(rs.getString("b_call_number"));
                bookVo.setB_rantal_able(rs.getInt("b_rantal_able"));
                bookVo.setB_reg_date(rs.getString("b_reg_date"));
                bookVo.setB_mod_date(rs.getString("b_mod_date"));

                return bookVo;
            }
        }, b_no);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return bookVos.size() > 0 ? bookVos.get(0) : null;
}

 

도서 상세 화면

서버에 저장된 표지 이미지를 프로젝트 외부에서 참조하려면 servlet-context.xml에 <resources>를 추가하면 된다. servlet-context.xml를 열어서 다음 코드를 추가한다.

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<resources mapping="/libraryUploadImg/**" location="file:///c:/library/upload/"/>