1. user4로 로그인 후 임의의 도서 대여




2. user5로 로그인 후 user4가 대여한 도서에 대해서 예약하기




3. user4는 대여한 책을 반납 → 이때 user5가 자동으로 예약에서 대여로 업데이트 되는지 확인



4. 자동으로 업데이트 된 것을 확인 후 user6로 로그인 후 2~3번 반복
Error 1
- user6으로 예약 시
{"reason": 이 도서는 현재 대여 가능한 상태라 예약이 불가능합니다.}
문제 원인(예상)
lendCount
가 반납 후 자동 대여 시 제대로 업데이트되지 않아서 발생
- 반납 후 예약자가 대여할 때
lendCount
를 1로 업데이트해야 하지만, 자동 대여 로직에서 이 부분이 누락된 것 같음
해결 방안
- 자동 대여 로직에서 책이 대여 중인 상태로 바뀌면,
lendCount
도 함께 업데이트해야 함
ReservationService
// 반납 시 자동 대여 로직
@Transactional
public void 자동대여(String isbn13) {
// 첫 번째 예약자 확인
Reservation firstReservation = reservationRepository.findReservationsByBook(isbn13)
.stream()
.findFirst()
.orElse(null);
if (firstReservation != null) {
// 대여 처리
Lend newLend = new Lend();
newLend.setUser(firstReservation.getUser());
newLend.setBook(firstReservation.getBook());
// 대여 날짜를 현재 시간으로 설정
newLend.setLendDate(Timestamp.valueOf(LocalDateTime.now()));
newLend.setReturnDate(Timestamp.valueOf(LocalDateTime.now().plusDays(7))); // 기본적으로 7일 대여 기간
lendRepository.save(newLend);
// 예약 정보 삭제
reservationRepository.delete(firstReservation);
// 예약 순번 업데이트
reservationRepository.updateReservationSequences(isbn13, firstReservation.getSequence());
// 책의 대여 상태와 대여 카운트를 업데이트
Book book = firstReservation.getBook();
book.setLendStatus(true); // 대여 중 상태로 변경
book.setLendCount(1); // 대여 카운트를 1로 설정
bookRepository.save(book); // 수정된 책 정보를 저장
}
}
LendController
// 반납하기
@PutMapping("/api/lends/return")
public ResponseEntity<?> lendReturn(@RequestHeader("Authorization") String token, @RequestBody LendRequest.ReturnDTO request) {
String jwtToken = token.replace("Bearer ", "");
Long userId = JwtUtil.extractUserIdFromToken(jwtToken);
LendResponse.ReturnDTO result = lendService.직접반납하기(userId, request);
// 책의 대여 상태를 업데이트 (lendCount를 0으로 설정)
Book book = bookRepository.findById(request.getIsbn13())
.orElseThrow(() -> new ExceptionApi404("책을 찾을 수 없습니다."));
book.setLendStatus(false); // 대여 가능한 상태로 변경
book.setLendCount(0); // 대여 카운트를 0으로 설정
bookRepository.save(book);
return ResponseEntity.ok(Resp.ok(result, "성공적으로 반납되었습니다."));
}
정상적으로 출력
{
"status": 200,
"msg": "대여되었습니다. 내서재에서 대여된 도서를 확인하세요.",
"body": {
"lendId": 22,
"lendDate": "2024-10-15T16:06:22.798+09:00",
"returnDate": "2024-10-22T16:06:22.798+09:00"
}
}
// Book의 lend count 확인
확인 사항 - 호정씨 요청
- 예약 취소 시 reservation_tb에 해당 컬럼 삭제 되는지 확인

- 추후 예약 취소 내역 조회등을 위해 history 남김


- 첫 번째 순서인 예약자에게 대여처리 됐을 때, 해당 도서의 두 번째 순서였던 예약자의 예약 순위 업데이트 되는지 확인 → 자동반납 로직에 추가
- 현재 대여중인 user4와,


- 해당 도서를 순서대로 예약한 user5와 user6


user4 대여자가 반납 시

- Return_Status는 True로 변경되고, 예약 순번이 1인 user5 예약자가 자동으로 대여됨

- 동시에 user6 인 예약자의 예약 순번은 2에서 1로 자동 업데이트 됨

자동 반납 및 예약 기능 테스트 (대여기간 만료)
- user4 = 대여, user5, user6 = 차례대로 예약




- 대여 기간 만료 및 자동 반납 스케줄링 확인
- 대여 기간이 끝나는 시점(+7D)에서 스케줄링된 자동 반납이 실행되야 함
@Scheduled
대신 수동으로자동반납()
메소드를 호출하는 API 임시 생성- 이 API 실행 시 자동 반납 처리 및 예약 순번 1인 예약자(user5)에게 자동 대여
- 자동 반납은 대여상태(returnStatus=false)인 도서 중에서 반납일이 현재 날짜와 일치 하는 경우에만 실행
- 즉
lend_tb
에서returnDate
가 현재 날짜와 일치하고returnStatus = false
인 대여 내역이 있어야만 자동반납()이 호출됨 - 테스트를 위해 자동 반납을 강제로 실행할 데이터 쿼리문을 대여 후에 작성(h2에 직접 작성)
- 현재 날짜로 설정한 후 자동 반납 요청 시 정상적으로 반납 및 예약자에 대한 대여 업데이트가 이루어지고,
- 예약자 순번도 업데이트 완료
@PutMapping("/api/lends/auto-return")
public ResponseEntity<?> triggerAutoReturn() {
lendService.자동반납(); // LendService의 자동반납 메소드 호출
return ResponseEntity.ok("대여기간이 만료되어 자동으로 반납처리 되었습니다.");
}
Error

update lend_tb set return_date = CURRENT_DATE where user_id = 4;







Share article