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

[Library Management System] 25.09.09 (42일)

dev.jelee 2025. 9. 10. 00:57

[ 작업한 내용 ]

< 도서 대출 조건별 검색 기능 추가 >

1. messages.properties

- 도서 대출 타입별 키워드 검색 성공/에러 메시지 정의.

success.loan.fetched=도서 대출 조회가 완료되었습니다.
error.loan.search.type=유효하지 않은 검색 타입입니다.

2. LoanSuccessCode

- 도서 타입별 키워드 검색 성공 코드 정의.

LOAN_FETCHED(HttpStatus.OK, "LOAN_207", "success.loan.fetched");

3. LoanErrorCode

- 도서 타입별 키워드 검색 에러 코드 정의.

LOAN_SEARCH_TYPE_FAILED(HttpStatus.BAD_REQUEST, "LOAN_409", "error.loan.search.type");

4. AdminLoanSearchResDTO

- 도서 타입별 키워드 검색 응답 DTO 정의.

- id, user, book, loanDate, dueDate, returnDate, extended, status 필드

- Loan 엔티티를 파라미터로 받는 생성자 함수 정의.


5. LoanSearchType - enum

- BOOKTITLE, USERID


6. AdminLoanController

- GET 방식으로 /api/v1/admin/loans/search uri로 요청을 한다.

- 요청 데이터는 type, keyword, status, page, size가 있고 RequestParam형태로 요청한다.

- Service로 type, keyword, status, page, size를 전달하여 비즈니스 로직을 처리하고 결과를 Page<AdminLoanSearchResDTO> 형태로 저장한다.

- 클라이언트 측으로 반환할 응답 데이터는 ApiResponse형태로 성공 메시지와 응답 DTO를 반환한다.


7. AdminLoanService

- Pageable을 사용하여 요청받은 page, size 값을 대입하여 페이징 정의를 한다.

- 요청받은 type이 올바른 값인지 type 예외 처리를한다.

- switch문을 사용하여 type 값이 BOOKTITLE, USERID인지 case를 구분하여 각 코드블럭을 실행한다.

- 코드블럭에는 status가 null인지 아닌지 삼항연산자를 사용하여 처리하였고, 도서명/사용자 아이디 + 상태로 조회 또는 도서명/사용자 아이디만으로 조회가 가능한 메서드를 호출하여 요청 데이터를 처리하였다.

- Page 형태로 받은 결과를 List 형태로 변환하였고, Controller로 반환할 때에는 PageImpl로 감싸서 List dto를 반환하였다.


8. LoanRepository

- 타입별 조건 검색에 대한 인터페이스를 정의한다.

// 검색 기능: 도서명 + 대출 상태
Page<Loan> findByBook_TitleContainingIgnoreCaseAndStatus(String bookTitle, LoanStatus status, Pageable pageable);

// 검색 기능: 도서명만
Page<Loan> findByBook_TitleContainingIgnoreCase(String bookTitle, Pageable pageable);

// 검색 기능: 사용자명 + 대출상태
Page<Loan> findByUser_UsernameContainingIgnoreCaseAndStatus(String username, LoanStatus status, Pageable pageable);

// 검색 기능: 사용자명만
Page<Loan> findByUser_UsernameContainingIgnoreCase(String username, Pageable pageable);

commit (9일 작업인데, push를 늦게해서 10일로 됨)
USERID 타입으로 검색 조회 시 (좌), BOOKTITLE 타입으로 검색 조회 시 (우)