[Project] 2차 프로젝트 - 예약 로직 테스트 순서 (Postman)

김호정's avatar
Oct 25, 2024
[Project] 2차 프로젝트 - 예약 로직 테스트 순서 (Postman)
 

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

notion image
 
notion image
 
notion image
notion image
 
 

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

notion image
 
notion image
 
 
notion image
notion image
 
 

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

 
notion image
 
 
notion image
notion image
 

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 확인
 

확인 사항 - 호정씨 요청

  1. 예약 취소 시 reservation_tb에 해당 컬럼 삭제 되는지 확인
    1. notion image
💡
  • 추후 예약 취소 내역 조회등을 위해 history 남김
    • notion image
      notion image
 
 
  1. 첫 번째 순서인 예약자에게 대여처리 됐을 때, 해당 도서의 두 번째 순서였던 예약자의 예약 순위 업데이트 되는지 확인 → 자동반납 로직에 추가
 
  • 현재 대여중인 user4와,
notion image
notion image
 
  • 해당 도서를 순서대로 예약한 user5와 user6
notion image
notion image
 
 

user4 대여자가 반납 시

notion image
  1. Return_Status는 True로 변경되고, 예약 순번이 1인 user5 예약자가 자동으로 대여됨
notion image
 
  1. 동시에 user6 인 예약자의 예약 순번은 2에서 1로 자동 업데이트 됨
notion image
 

 
 

자동 반납 및 예약 기능 테스트 (대여기간 만료)

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

keepgoing