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

[Library Management System] 25.10.06 (62일) | (리팩토링) 사용자 리뷰 전체 목록 조회/ 책 리뷰 상세 조회/ 책 리뷰 수정/ 책 리뷰 삭제/ 책 리뷰 검색

dev.jelee 2025. 10. 6. 15:16

[ 작업한 내용 ]

< 사용자: 책 리뷰 전체 목록(본인) >

# UserReviewController

- Service 계층으로 파라미터 전달 후 결과를 받아서 저장할 타입을 Page에서 PageResponse로 변경

@GetMapping("/me/reviews")
public ResponseEntity<?> allListReview(
  @RequestParam(name = "page", defaultValue = "0") int page,
  @RequestParam(name = "size", defaultValue = "10") int size,
  @AuthenticationPrincipal User user) {
  
  // 서비스로직
  PageResponse<UserReviewListResDTO> responseDTO = userReviewService.allListReview(page, size, user.getId());

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

# UserReviewService

- 메서드 타입을 Page에서 PageResponse로 변경.

- 불필요한 @Transactional 어노테이션 제거.

- Page<Review>로 Repository에서 조회한 결과를 저장한 것을 List<UserReviewListResDTO>타입으로 변경하였는데 Page<UserReviewListResDTO>로 맵핑 후 저장하는 것으로 변경.

- Controller로 반환 시 new PageImpl<>()에서 PageResponse<>(); 형태로 생성하여 반환하는 것으로 변경.

- 주석 내용 수정.

public PageResponse<UserReviewListResDTO> allListReview(int page, int size, Long userId) {

  // 사용자 조회, 유효성 검사
  User user = userRepository.findById(userId)
      .orElseThrow(() -> new BaseException(UserErrorCode.USER_NOT_FOUND));

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

  // userId로 책 리뷰 조회
  Page<Review> result = reviewRepository.findByUser_Id(user.getId(), pageable);

  // Page<Review> -> Page<UserReviewListResDTO> 맵핑 후 생성
  Page<UserReviewListResDTO> pageDTO = result.map(UserReviewListResDTO::new);

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

< 사용자: 책 리뷰 상세 조회 >

# UserReviewController

- 주석 변경


# UserReviewService

- 주석 변경


< 사용자: 책 리뷰 수정 >

# UserReviewUpdateResDTO

- 리뷰 고유번호, 사용자 아이디 필드 추가 (id, username)

@Getter
public class UserReviewUpdateResDTO {
  private Long id;
  private String username;
  private String bookTitle;
  private String content;
  private LocalDateTime updatedDate;

  public UserReviewUpdateResDTO(Review review) {
    this.id = review.getId();
    this.username = review.getUser().getUsername();
    this.bookTitle = review.getBook().getTitle();
    this.content = review.getContent();
    this.updatedDate = review.getUpdatedDate();
  }
}

# UserReviewController

- 주석 변경


# UserReviewService

- 주석 변경


< 사용자: 책 리뷰 삭제 >

# UserReviewDeleteResDTO

- 리뷰 고유번호, 사용자 아이디 필드 추가 (id, username)

@Getter
public class UserReviewDeleteResDTO {
  private Long id;
  private String bookTitle;
  private String username;
  private LocalDateTime deletedAt;

  public UserReviewDeleteResDTO(Review review) {
    this.id = review.getId();
    this.bookTitle = review.getBook().getTitle();
    this.username = review.getUser().getUsername();
    this.deletedAt = LocalDateTime.now();
  }
}

# UserReviewController

- 주석 변경


# UserReviewService

- 주석 변경


< 사용자: 책 리뷰 검색 >

# UserReviewSearchResDTO

- 리뷰 고유번호, 사용자 아이디 필드 추가 (id, username)

@Getter
public class UserReviewSearchResDTO {
  private Long id;
  private String username;
  private String bookTitle;
  private String content;
  private LocalDateTime createdDate;

  public UserReviewSearchResDTO(Review review) {
    this.id = review.getId();
    this.username = review.getUser().getUsername();
    this.bookTitle = review.getBook().getTitle();
    this.content = review.getContent();
    this.createdDate = review.getCreatedDate();
  }
}

# UserReviewController

- 주석 변경.

- Page<UserReviewSearchResDTO>로 결과를 전달 받는 것을 PageResponse<UserReviewSearchResDTO> 형태로 수정.

@GetMapping("/me/reviews/search")
public ResponseEntity<?> searchReview(
  @RequestParam(value = "keyword", required = false) String keyword,
  @RequestParam(value = "page", defaultValue = "0") int page,
  @RequestParam(value = "size", defaultValue = "10") int size,
  @AuthenticationPrincipal User user) {

    // 서비스로직
    PageResponse<UserReviewSearchResDTO> responseDTO = userReviewService.searchReview(keyword, page, size, user.getId());

    // 성공메시지
    String message = messageProvider.getMessage(ReviewSuccessCode.REVIEW_FETCHED.getMessage());

    // 응답
    return ResponseEntity
              .status(ReviewSuccessCode.REVIEW_FETCHED.getHttpStatus())
              .body(ApiResponse.success(
                ReviewSuccessCode.REVIEW_FETCHED, 
                message, 
                responseDTO));
}

# UserReviewService

- 주석 변경.

- Page<UserReviewSearchResDTO>타입의 메서드를 PageResponse<UserReviewSearchResDTO> 로 변경

- Page<Review> -> Page<UserReviewSearchResDTO> 맵핑,

- Controller로 반환 시 PageResponse<>()로 반환.

public PageResponse<UserReviewSearchResDTO> searchReview(String keyword, int page, int size, Long userId) {

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

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

  // 검색어 조회 + 페이지 처리
  Page<Review> result = keyword != null ? result = reviewRepository.findByUser_IdAndBook_TitleContainingIgnoreCase(user.getId(), keyword, pageable) : reviewRepository.findAll(pageable);

  // Page<Review> -> Page<UserReviewSearchResDTO> 맵핑
  Page<UserReviewSearchResDTO> pageDTO = result.map(UserReviewSearchResDTO::new);

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

commit