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

[Library Management System] 25.10.05 (61일) | (리팩토링) 사용자 내 도서 대출 내역/ 사용자 책 리뷰 작성

dev.jelee 2025. 10. 5. 12:50

[ 작업한 내용 ]

< 사용자: 내 도서 대출 내역 >

# UserLoanListResDTO

- 내 도서 대출 내역 응답 DTO

- 도서 대출 고유번호, 책 제목, 저자, 출판사, 출판일, 대출일, 반납일

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

** 변경사항 없음

@Getter
public class UserLoanListResDTO {
  private Long id;
  private String bookTitle;
  private String author;
  private String publisher;
  private LocalDate publishedDate;
  private LocalDateTime loanDate;
  private LocalDateTime returnDate;

  public UserLoanListResDTO(Loan loan) {
    this.id = loan.getId();
    this.bookTitle = loan.getBook().getTitle();
    this.author = loan.getBook().getAuthor();
    this.publisher = loan.getBook().getPublisher();
    this.publishedDate = loan.getBook().getPublishedDate();
    this.loanDate = loan.getLoanDate();
    this.returnDate = loan.getReturnDate();
  }
}

# AdminBookController

- GET /api/v1/user/me/loans 로 요청.

- 파라미터로 page, size, @AuthenticationPrincipal User user 전달받음.

- Service 계층으로 page, size, user.getId()를 전달함.

- 결과는 PageResponse<UserLoanListResDTO> 형태로 저장.

- 클라이언트 측으로 성공메시지와 결과를 ApiResponse.success()로 감싸서 응답.

** PageResponse로 타입 변경, 주석과 파라미터 변경

@GetMapping("/loans")
public ResponseEntity<?> userLoanList(
  @RequestParam(value = "page", defaultValue = "0") int page,
  @RequestParam(value = "size", defaultValue = "10") int size,
  @AuthenticationPrincipal User user) {

    // 서비스로직
    PageResponse<UserLoanListResDTO> responseDTO = userLoanService.userLoanList(page, size, user.getId());

    // 성공메시지
    String message = messageProvider.getMessage(LoanSuccessCode.LOAN_LIST_FETCHED.getMessage());
    
    // 응답
    return ResponseEntity
              .status(LoanSuccessCode.LOAN_LIST_FETCHED.getHttpStatus())
              .body(ApiResponse.success(
                LoanSuccessCode.LOAN_LIST_FETCHED, 
                message, 
                responseDTO));
}

# AdminBookService

- userRepository.findById(userId) 사용하여 사용자 조회 후 User로 저장. 만약에 조회가 안된다면 UserErrorCode.USER_NOT_FOUND 예외를 발생 시킴.

- PageRerquest.of(page, size)를 사용하여 페이징 정의 후 Pageable로 저장.

- loanRepository.findByUser_Id(user.getId(), pageable)를 사용하여 사용자 본인의 도서 대출 내역을 조회하여 페이징 처리한 데이터를 Page<Loan> result로 저장.

- Page<UserLoanListResDTO>로 맵핑하여 pageDTO에 저장.

- Controller에 pageDTO를 기반으로 PageResponse로 생성하여 반환.

** PageResponse로 변경

public PageResponse<UserLoanListResDTO> userLoanList(int page, int size, Long userId) {

  // 사용자 조회 및 예외 처리
  User user = userRepository.findById(userId)
      .orElseThrow(() -> new BaseException(UserErrorCode.USER_NOT_FOUND));

  // 페이징 정의
  Pageable pageable = PageRequest.of(page, size);

  // DB에서 사용자id로 조회
  Page<Loan> result = loanRepository.findByUser_Id(user.getId(), pageable);

  // Page<Loan> -> Page<UserLoanListResDTO>로 맵핑
  Page<UserLoanListResDTO> pageDTO = result.map(UserLoanListResDTO::new);

  // 반환
  return new PageResponse<>(pageDTO);
}

< 사용자: 책 리뷰 작성 >

# 수정 내용

- 주석 내용만 변경


내 대출 내역 조회(좌), 책 리뷰 작성(우)