- 쿼리 짜기
- DTO짜기 찾을 때 필요한 데이터 - 책 id - 제목 - 저자 - 출판사 - 책 표지 - 받을 키워드
- 서비스짜기 - 키워드에 아무것도 적지 않았을 때(그냥 전부 보여주기) - 키워드가 아무것도 없을 때 (검색 결과가 없습니다) - 키워드 있을 때 (DTO에 담아서 보내기)
- 컨트롤러 짜기
- title, author, publisher 전부 통합 검색이기에
@Query("SELECT b FROM Book b WHERE b.title LIKE %:title% OR b.author LIKE %:author% OR b.publisher LIKE %:publisher% order by b.isbn13 desc")
    List<Book> mFindAll(@Param("title") String title, @Param("author") String author, @Param("publisher") String publisher);title, author, publiser을 각 각 넣을 예정이었지만 
생각해보면 하나의 검색창에 같은 입력값을 받는데 굳이 3개로 나눠야 할 까 싶어
하나의 입력값으로 전부 찾는 쿼리를 생각했습니다.
@Query("SELECT b FROM Book b WHERE b.title LIKE %:searchTerm% OR b.author LIKE %:searchTerm% OR b.publisher LIKE %:searchTerm%")
    List<Book> mFindAll(@Param("searchTerm") String searchTerm);- 검색 시 받을 DTO
@Data
    public static class BookSearchDTO {
        private String isbn13;
        private String title;
        private String author;
        private String publisher;
        private String cover;
        private String keyword;
        public BookSearchDTO(Book book, String bookTitle) {
            this.isbn13 = book.getIsbn13();
            this.title = book.getTitle();
            this.author = book.getAuthor();
            this.publisher = book.getPublisher();
            this.cover = book.getCover();
            this.keyword = bookTitle;
        }
    }- 서비스 짜기
 public List<BookResponse.BookSearchDTO> 검색기록보기(String keyword){
        System.out.println("검색어:" + keyword);
        //아무것도 적지 않았을 때
        if(keyword == null){
            List<Book> bookPG = bookRepository.findAll();
            List<BookResponse.BookSearchDTO> dtos = new ArrayList<>();
            for(Book book : bookPG){
                BookResponse.BookSearchDTO dto = new BookResponse.BookSearchDTO(book, "");
                dtos.add(dto);
            }
            return dtos;
        }
        List<Book> searchBookList = bookRepository.mFindAll(keyword);
        //만약 검색결과가 없을 때
        if(searchBookList.isEmpty()){
         throw new ExceptionApi404("검색 결과가 없습니다.");
        }
        //검색 결과가 있을 때
        List<BookResponse.BookSearchDTO> dtos = new ArrayList<>();
        for(Book book : searchBookList){
            BookResponse.BookSearchDTO dto = new BookResponse.BookSearchDTO(book, keyword);
            dtos.add(dto);
        }
        return dtos;
    }- 컨트롤러 짜기
@GetMapping("/search")
    public ResponseEntity<?> search(@RequestParam(name = "keyword") String keyword) {
        List<BookResponse.BookSearchDTO> searchDTOS = bookService.검색기록보기(keyword);
        return ResponseEntity.ok(Resp.ok(searchDTOS));
    }Share article