개발 기록/도서관 관리 시스템

[Library Management System] 25.08.20 (26일)

dev.jelee 2025. 8. 20. 02:54

[ 작업한 내용 ]

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. 개인적으로 여러 일이 겹쳐서 개발하는데 늦어지고 있다. 집중해서 해야하는데.. ㅠㅠ


commit
postman - api test