[ 작업한 내용 ]
1. 타입별 검색 기능 + 페이징 기능 추가
- 단일 엔드포인트 + 검색 타입 구분 (/books/search?type=xxx&keyword=yyy)
- all, title, author 타입 구분
GET /books/search?type=all&keyword=자바&page=0&size=10
GET /books/search?type=title&keyword=자바&page=0&size=10
GET /books/search?type=author&keyword=홍길동&page=0&size=10
1-1) 에러 코드 추가
- message.properties와 BookErrorCode에 각각 타입 검색시 발생할 예외 추가.
1-2) BookSearchType enum 생성
- 통합검색 / 도서명 검색 / 저자 검색으로 검색 기능을 나눔.
- 각각 ALL, TITLE, AUTHOR 로 타입을 나누어 관리하는게 용이하다고 생각.
- enum 으로 관리하기로 함.
1-3) BookSearchResDTO 수정
- 생성자 함수중 파라미터를 Book으로 받는 생성자 함수는 없어서 추가함.
1-4) AdminBookRepository
- 타입별 검색 + 페이징 기능 추가를 위해 각각 메서드 생성
// 키워드 타입별 검색 - title, author (all)
Page<Book> findByTitleContainingIgnoreCaseOrAuthorContainingIgnoreCase(String title, String author, Pageable pageable);
// 키워드 타입별 검색 - title
Page<Book> findByTitleContainingIgnoreCase(String title, Pageable pageable);
// 키워드 타입별 검색 - author
Page<Book> findByAuthorContainingIgnoreCase(String author, Pageable pageable);
1-5) AdminBookService
- Spring Framework에서 제공하는 Pageable 사용하여 편리하게 페이징 기능 구현.
- 타입 예외처리를 위해 요청받은 타입의 데이터가 BookSearchType(enum)에 있는지 확인하여 있으면 type 변수에 저장. 없으면 예외를 던진다.
- switch 문을 사용하여 type 변수에 저장된 데이터를 case로 찾아 관련 기능 메서드를 실행시킨다. 그리고 가져온 데이터는 Page<Book> result 변수에 저장한다.
- Controller 계층에서는 BookSearchResDTO 타입으로 가져와야하기 때문에 result 변수에 담긴 데이터를 List<BookSearchResDTO>로 변환시켜주는 작업을 한다.
- 변환시키는 작업은 result.getContetnt()를 통해 result에 담긴 객체들의 리스트를 가져와서 .stream()을 사용해 스트림을 생성한다. 그리고 .map() 메서드를 사용해 전체 데이터를 BookSearchResDTO 객체로 변환해준다. 그 다음 .toList()를 호출해 변환된 객체들을 리스트 형태로 만든다.
- controller에 return해줄 때에는 변환된 DTO를 다시 Page로 감싸주어야하기 때문에 PageImple<>을 사용함.
1-6) AdminBookController
- 요청으로 받는 값은 type, keyword, page, size이다. page와 sizfe는 기본 값을 지정해 놓았다.
- 요청 받은 값은 service계층의 .searchBooks() 메서드로 보내어 데이터값을 받아와 Page<BookSearchResDTO> books 변수에 저장한다.
- 이후 이전에 작성한 형태 데이터를 그대로 반환해준다.
[ 느낀 점 ]
1. Spring Framework에서 제공하는 Page 기능을 사용해보았다. chat-gpt를 활용하여 구현을 했는데 어떠한 흐름으로 구현이 되는지는 이해를 하지만 처음부터 구현을 하려면 막막할 거 같다. 그래도 어떠한 방법을 사용했던 구현을 해봤다는 점에 초점을 맞추어 잘했다고 생각해야겠다. ㅋㅋ
2. 과거에 학원에서 팀프로젝트를 했을 때 배웠던 방식으로 구현을 할 수도 있었지만 chat-gpt가 이러한 기능을 사용하면 편리하게 페이징 기능을 구현을 할 수 있다고 해서 사용해보고 싶었다. 어떠한 방법이 효율적인지는 모른다. 사용해 봤다, 구현해 봤다면 이거 나름대로 좋은 경험이라고 생각한다.
[ 메모 ]
1. 개인적으로 여러 일이 겹쳐서 개발하는데 늦어지고 있다. 집중해서 해야하는데.. ㅠㅠ
'개발 기록 > 도서관 관리 시스템' 카테고리의 다른 글
[Library Management System] 25.08.25 (28일) (0) | 2025.08.25 |
---|---|
[Library Management System] 25.08.24 (27일) (0) | 2025.08.24 |
[Library Management System] 25.08.18 (25일) (0) | 2025.08.18 |
[Library Management System] 25.08.09 (24일) (0) | 2025.08.10 |
[Library Management System] 25.08.08 (23일) (0) | 2025.08.08 |