728x90
반응형
리뷰가 생성 될 때 마다 즉각적으로 평점 갱신했던 것을 스케줄링을 통해 매일 자정에 하는 것으로 변경
변경 전 :
@Transactional
public ReviewResponse createReview(Long memberId, Long accommodationId,
ReviewRequest reviewRequest) {
Accommodation accommodation = findAccommodation(accommodationId);
Member member = findMember(memberId);
Reservation reservation = findReservation(reviewRequest.getReservationId());
Long productId = reservation.getProduct().getId();
productRepository.findByIdAndAccommodationId(productId, accommodationId)
.orElseThrow(() -> new ProductException(ErrorType.NOT_FOUND));
//중복 리뷰 검증
if (reviewRepository.existsByReservationId(reservation.getId())) {
throw new ReviewException(ErrorType.DUPLICATED_REVIEW);
}
//체크아웃 시간, 작성 시간 검증
LocalDate checkOutTime = reservation.getCheckOutDate();
LocalDate createdAt = LocalDate.now();
validInputs(checkOutTime, createdAt);
accommodation.updateGrade(reviewRequest.getGrade());
Review review = Review.from(reviewRequest, accommodation, member, reservation);
reviewRepository.save(review);
return ReviewResponse.from(review);
}
변경 후:
@Transactional
public ReviewResponse createReview(Long memberId, Long accommodationId,
ReviewRequest reviewRequest) {
Accommodation accommodation = findAccommodation(accommodationId);
Member member = findMember(memberId);
Reservation reservation = findReservation(reviewRequest.getReservationId());
Long productId = reservation.getProduct().getId();
productRepository.findByIdAndAccommodationId(productId, accommodationId)
.orElseThrow(() -> new ProductException(ErrorType.NOT_FOUND));
//중복 리뷰 검증
if (reviewRepository.existsByReservationId(reservation.getId())) {
throw new ReviewException(ErrorType.DUPLICATED_REVIEW);
}
//체크아웃 시간, 작성 시간 검증
LocalDate checkOutTime = reservation.getCheckOutDate();
LocalDate createdAt = LocalDate.now();
validInputs(checkOutTime, createdAt);
Review review = Review.from(reviewRequest, accommodation, member, reservation);
reviewRepository.save(review);
return ReviewResponse.from(review);
}
private BigDecimal calculateGrade(List<Review> reviews, Accommodation accommodation) {
if (reviews.isEmpty()) {
return accommodation.getGrade(); //return BigDecimal.ZERO;
}
BigDecimal totalGrade = reviews.stream()
.map(Review::getGrade)
.reduce(BigDecimal.ZERO, BigDecimal::add);
return totalGrade.divide(BigDecimal.valueOf(reviews.size()), 1, RoundingMode.HALF_UP);
}
추가된 클래스 :
@Component
@RequiredArgsConstructor
@Slf4j
//@EnableAsync 병렬적 사용
public class ReviewScheduler {
private final ReviewService reviewService;
// 매일 자정 실행
//@Async 비동기
@Scheduled(cron = "0 0 0 * * ?")
public void updateGrade() {
try {
reviewService.updateGrade();
log.info("현재 시간 : {}", LocalDateTime.now());
}catch (Exception e ) {
log.error("Error updating grades: {}", e.getMessage(), e);
}
}
}
그리고 메인 Application 에 추가
@EnableScheduling
지정한 시간이 되면 변경 되는 것을 볼 수 있다.
728x90
'JAVA > 프로젝트' 카테고리의 다른 글
리팩토링: DB 접근을 최소화하고 메모리에서 연산을 수행해 쿼리 감소 (0) | 2024.09.03 |
---|---|
리팩토링: DTO를 사용한 쿼리 최적화 (0) | 2024.09.03 |
카카오맵 Rest API - 주소로 위도, 경도 반환하기 (0) | 2024.07.13 |
리팩토링: 서비스 레이어 로직 분리 (0) | 2024.07.01 |
리팩토링: DB접근 줄여 실행 속도 향상 시키기 (0) | 2024.06.29 |