- 쿼리 짜기
- 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