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

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

YJ_ma 2023. 12. 3. 17:02

도서 검색 처리하기

도서 검색은 도서 검색 창과 동일하다. 도서 검색 화면은 nav.jsp에 있다. 

· 서버에서 요청하는 URI는 /book/user/searchBookConfirm

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

<div class="search">

    <form action="<c:url value='/book/user/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>

 

컨트롤러 기능 구현

클라이언트 요청을 처리할 수 있는 메서드를 BookController.java에 선언한다.

package com.office.library.book.user;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.office.library.book.BookVo;

@Controller
//@Controller("user.BookController")
@RequestMapping("/book/user")
public class BookController {

	@Autowired
	BookService bookService;

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

		String nextPage = "user/book/search_book";

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

		model.addAttribute("bookVos", bookVos);

		return nextPage;
	}
}

 

서비스 기능 구현

package com.office.library.book.user;

import java.util.List;

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

import com.office.library.book.BookVo;

@Service
//@Service("user.BookService")
public class BookService {

	@Autowired
	BookDao bookDao;

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

		return bookDao.selectBookBySearch(bookVo);
	}
}

 

DAO 기능 구현

package com.office.library.book.user;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;

import com.office.library.book.BookVo;

@Component
//@Component("user.BookDao")
public class BookDao {

	@Autowired
	JdbcTemplate jdbcTemplate;

	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;
	}
}

 

도서 상세 보기 처리하기

검색 결과가 출력되는 화면은 search_book.jsp로 '도서명'을 클릭하면 해당 도서의 상세 보기 화면으로 이동할 수 있다. 도서 상세보기 기능 역시 관리자 도서 상세보기와 동일하다. 

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

 

계속해서 컨트롤러, 서비스, DAO를 구현해본다.

컨트롤러 기능 구현

// 도서 상세
@GetMapping("/bookDetail")
public String bookDetail(@RequestParam("b_no") int b_no, Model model) {
    System.out.println("[UserBookController] bookDetail()");

    String nextPage = "user/book/book_detail";

    BookVo bookVo = bookService.bookDetail(b_no);

    model.addAttribute("bookVo", bookVo);

    return nextPage;
}

 

서비스 기능 구현

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

    return bookDao.selectBook(b_no);
}

 

DAO 기능 구현

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;
}

 

도서 상세 화면 구현이 모두 끝났으므로 프로젝트를 실행하고 다시 도서 검색 및 상세 화면을 확인해본다.

도서 검색 화면
도서 상세 화면