## 🎯 리팩토링 목적 - 기존 GET /api/books/search는 알라딘 Open API 결과만 반환해서, POST /api/books로 직접 등록한 DB 도서는 검색 결과에 노출되지 않았음. - 기획상 "알라딘 전용 검색" 화면이 따로 없어서, 사용자가 이미 등록된 도서를 검색으로 찾지 못하고 같은 책을 중복으로 직접 등록하게 되는 문제가 있었음. - GET /api/books/search 하나에서 알라딘 + DB(직접 등록 도서) 검색 결과를 함께 보여주도록 개선해, 중복 등록을 유발하는 요인을 줄인다. ## 🏗 개선 범위 및 작업 내용 - [x] GET /api/books/search가 알라딘 검색 결과와 DB 검색 결과(BookQueryRepository#searchByTitle)를 함께 반환하도록 BookService#searchBooks 구현 - [x] 응답 DTO를 기존 내부 검색용 BookSearchResponse/BookSearchListResponse로 통합하고, 더 이상 쓰지 않는 ExternalBookResponse/ExternalBookListResponse 삭제 - [x] 1페이지에서만 DB 매칭 도서를 흔적(Opinion) 많은 순으로 상단에 노출하고 나머지를 알라딘 결과로 채움, 2페이지부터는 알라딘 결과만 반환 - [x] 미등록(알라딘 전용) 도서는 bookId/source를 null로 내려 등록 여부를 구분할 수 있게 하고, Swagger 스키마 nullable 처리 - [x] GET /api/books/recent에 keyword 파라미터 추가 (제목 필터링, 생략 시 기존과 동일하게 전체 목록 반환) - [x] 관련 단위/컨트롤러 테스트 보강 (BookServiceTest, BookControllerTest, BookQueryRepositoryTest) ## 💡 참고 사항 - 알라딘 검색 결과와 DB 결과가 같은 책(같은 ISBN)이어도 현재는 중복 제거를 하지 않고 그대로 노출함 — 등록 시점(POST /api/books)에 중복 등록 자체를 막는 방향으로 별도 개선 예정 (후속 이슈로 분리 예정) - GET /api/books/internal-search(DB 전용 검색)는 기존 그대로 유지
🎯 리팩토링 목적
🏗 개선 범위 및 작업 내용
💡 참고 사항