Devin.KR

대여·반납과 트랜잭션

대여 기록과 현재 대여 상태를 하나의 트랜잭션으로 갱신합니다.

진도 0%

레슨

  1. 대여 상태 전이

    가능·대여 중·반납 상태와 실패 조건을 명세합니다.

  2. 원자적인 대여

    대여 이력과 active_loans 변경의 트랜잭션 범위를 정합니다.

  3. 부분 실패와 롤백

    예외 전파와 Spring 프록시 경계를 확인합니다.

  4. 반납과 시간 테스트

    반납 권한·반납 시각·중복 반납의 정책을 검증합니다.

대여·반납과 트랜잭션 미션

앞 모듈의 인증·CSRF·개인 대여 조회 코드를 이어받습니다. 새 테스트 DB에서 대여 이력과 현재 대여를 함께 갱신하는 API를 구현합니다. 과거 중복 이력의 운영 DB 마이그레이션은 이 미션의 범위가 아닙니다.

요구사항

  • active_loans.book_id를 PK로 두고 loans 이력과 연결합니다.
  • POST /loans와 POST /loans/{id}/return을 세션 사용자에 연결합니다.
  • 대여·반납 두 테이블 변경을 각각 서비스 트랜잭션에 묶습니다.
  • 앞 모듈 미션 solution의 코드와 기존 122개 회귀 검사를 보존합니다.
  • Clock을 주입해 UTC 규약으로 시각을 저장하고 중복 반납은 LOAN_CONFLICT 409로 거절합니다.
  • 대여 ID는 loan_ids 시퀀스로 발급하고 현재 행의 (loan_id,book_id) 복합 외래키를 유지합니다.

완료 기준

  • 대여 성공 시 이력 1건·현재 대여 1건, 반납 후 현재 대여 0건과 반납 시각을 확인합니다.
  • 두 변경 사이 실패를 주입해 부분 변경 0건을 확인합니다.
  • 다른 회원 반납 거부·없는 도서·이미 반납한 대여 테스트가 통과합니다.
  • MockMvc·메모리 H2의 누적 142개 검사에서 실패·오류·건너뜀 0을 report.py로 확인합니다.
  • 실제 폼 로그인·CSRF 요청으로 대여 201과 Location, 반납 204 및 거절 후 DB 불변을 검증합니다.
  • 반납 중간 실패 후 반납 시각 NULL과 현재 대여 1건, 재대여 후 이력 2건·현재 대여 1건을 확인합니다.
./mvnw test
미션 시작 코드
모범 답안모범 답안 내려받기

검토 기준

  • 앞 단계의 계약과 테스트를 유지하며 변경 이유를 설명합니다.
  • 정상·경계·실패 경로의 근거와 재현 절차를 제출합니다.