@@ -2,25 +2,25 @@
 
 import com.doubleowner.revibe.domain.execution.entity.Execution;
 import com.doubleowner.revibe.domain.execution.repository.ExecutionRepository;
+import com.doubleowner.revibe.domain.point.PointService;
 import com.doubleowner.revibe.domain.review.dto.ReviewRequestDto;
 import com.doubleowner.revibe.domain.review.dto.ReviewResponseDto;
 import com.doubleowner.revibe.domain.review.dto.UpdateReviewRequestDto;
 import com.doubleowner.revibe.domain.review.entity.Review;
 import com.doubleowner.revibe.domain.review.repository.ReviewRepository;
 import com.doubleowner.revibe.domain.user.entity.User;
-import com.doubleowner.revibe.domain.user.repository.UserRepository;
+import com.doubleowner.revibe.global.common.service.ImageService;
 import com.doubleowner.revibe.global.config.auth.UserDetailsImpl;
 import com.doubleowner.revibe.global.exception.CommonException;
 import com.doubleowner.revibe.global.exception.errorCode.ErrorCode;
-import com.doubleowner.revibe.global.util.S3Uploader;
 import lombok.RequiredArgsConstructor;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Slice;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.IOException;
 import java.util.List;
 
 
@@ -29,26 +29,21 @@
 public class ReviewService {
     private final ReviewRepository reviewRepository;
     private final ExecutionRepository executionRepository;
-    private final UserRepository userRepository;
-    private final S3Uploader s3Uploader;
+    private final PointService pointService;
+    private final ImageService imageService;
 
-    private static final int TEXT_ONLY_POINT = 100;
-    private static final int TEXT_IMAGE_POINT = 500;
-    private static final int DIFFERENCE_POINT = 400;
 
     @Transactional
     public ReviewResponseDto write(ReviewRequestDto reviewRequestDto, User user) {
 
-
         Execution execution = executionRepository.findExecutionById(reviewRequestDto.getPaymentId(), user.getEmail())
                 .orElseThrow(() -> new CommonException(ErrorCode.NOT_FOUND_VALUE, "내역을 찾을 수 없습니다"));
+
         String image = null;
-        int point = TEXT_ONLY_POINT;
-        if (reviewRequestDto.getImage() != null) {
-            image = uploadImage(reviewRequestDto.getImage());
-            point = TEXT_IMAGE_POINT;
-        }
 
+        if (hasImage(reviewRequestDto.getImage())) {
+            image = imageService.UploadImage(image, reviewRequestDto.getImage());
+        }
 
         Review review = Review.builder()
                 .starRate(reviewRequestDto.getStarRate())
@@ -60,12 +55,11 @@ public ReviewResponseDto write(ReviewRequestDto reviewRequestDto, User user) {
                 .user(user)
                 .build();
 
-        Review save = reviewRepository.save(review);
-        user.addPoint(point);
-        userRepository.save(user);
+        Review savedReview = reviewRepository.save(review);
 
+        pointService.addReviewPoint(user, image);
 
-        return toDto(save);
+        return toDto(savedReview);
     }
 
 
@@ -76,49 +70,42 @@ public List<ReviewResponseDto> findReview(User user) {
         return reviewsByUserId.stream().map(this::toDto).toList();
     }
 
+    @Transactional(readOnly = true)
+    public List<ReviewResponseDto> findItemReviews(Long itemId, int page, int size) {
+        Pageable pageable = PageRequest.of(page - 1, size);
+        Slice<Review> reviews = reviewRepository.findReviewsByItemId(itemId, pageable);
+        return reviews.stream().map(this::toDto).toList();
+    }
+
     @Transactional
     public void updateReview(Long id, UserDetailsImpl userDetails, UpdateReviewRequestDto updateReviewRequestDto) {
 
-        Review review = reviewRepository.findMyReview(id, userDetails.getUser().getId());
+        Review review = getMyReview(id, userDetails.getUser());
 
         // 이미지 관련 처리
-        handlePoint(review, updateReviewRequestDto.getImage());
-
-        // 나머지 필드 업데이트
-        review.update(updateReviewRequestDto);
+        String image = null;
+        if (hasImage(updateReviewRequestDto.getImage())) {
+            image = imageService.UploadImage(review.getReviewImage(), updateReviewRequestDto.getImage());
+        }
+        pointService.handlePoint(userDetails.getUser(), review.getReviewImage(), updateReviewRequestDto.getImage());
+        // 필드 업데이트
+        review.update(updateReviewRequestDto, image);
 
     }
 
     @Transactional
     public void deleteReview(Long id, User user) {
-        Review review = reviewRepository.findMyReview(id, user.getId());
-        if (review.getReviewImage() != null) {
-            review.getUser().minusPoint(TEXT_IMAGE_POINT);
-        } else {
-            review.getUser().minusPoint(TEXT_ONLY_POINT);
-        }
+        Review review = getMyReview(id, user);
+        pointService.deletePoint(user, review.getReviewImage());
         reviewRepository.delete(review);
     }
 
-    private void handlePoint(Review review, MultipartFile newImage) {
-        try {
-            if (newImage != null) {
-                if (review.getReviewImage() == null) {
-                    review.getUser().addPoint(DIFFERENCE_POINT);
-                }
-                // 새 이미지 업로드
-                reUploadImage(review, newImage);
-
-            } else {
-                if (review.getReviewImage() != null) {
-                    s3Uploader.deleteImage(review.getReviewImage());
-                    review.deleteImage();
-                    review.getUser().minusPoint(DIFFERENCE_POINT);
-                }
-            }
-        } catch (IOException e) {
-            throw new CommonException(ErrorCode.FAILED_UPLOAD_IMAGE);
-        }
+    private Review getMyReview(Long id, User user) {
+        return reviewRepository.findMyReview(id, user.getId());
+    }
+
+    private static boolean hasImage(MultipartFile multipartFile) {
+        return multipartFile != null && !multipartFile.isEmpty();
     }
 
     /**
@@ -138,48 +125,4 @@ private ReviewResponseDto toDto(Review review) {
                 .build();
     }
 
-    /**
-     * 이미지 업로드 메소드
-     *
-     * @param file
-     * @return
-     */
-    private String uploadImage(MultipartFile file) {
-
-        try {
-            return s3Uploader.upload(file);
-
-        } catch (IOException e) {
-            throw new CommonException(ErrorCode.FAILED_UPLOAD_IMAGE);
-        }
-    }
-
-    /**
-     * 이미지 재업로드 메소드 (기존 이미지 삭제 후 업로드)
-     *
-     * @param review
-     * @param file
-     */
-    private void reUploadImage(Review review, MultipartFile file) {
-
-        try {
-            if (review.getReviewImage() != null) {
-                s3Uploader.deleteImage(review.getReviewImage());
-            }
-
-            String imageUrl = uploadImage(file);
-            review.update(imageUrl);
-
-        } catch (IOException e) {
-            throw new CommonException(ErrorCode.FAILED_UPLOAD_IMAGE);
-        }
-
-    }
-
-    @Transactional(readOnly = true)
-    public List<ReviewResponseDto> findItemReviews(Long itemId, int page, int size) {
-        Pageable pageable = PageRequest.of(page - 1, size);
-        List<Review> reviews = reviewRepository.findReviewsByItemId(itemId, pageable).stream().toList();
-        return reviews.stream().map(this::toDto).toList();
-    }
 }

리뷰: _:hammer_and_wrench: Refactor suggestion_

**리뷰 삭제 시 이미지 제거 고려**  
포인트 차감 후 리뷰를 삭제하지만, 실제 이미지 파일 삭제 로직은 누락된 것으로 보입니다. 불필요해진 이미지를 정리하려면 `imageService.deleteImage(...)` 호출도 고려해주세요.  

다음과 같은 수정 예시를 참고해 보실 수 있습니다:
```diff
98     Review review = getMyReview(id, user);
99     pointService.deletePoint(user, review.getReviewImage());
+    imageService.deleteImage(review.getReviewImage());
     reviewRepository.delete(review);
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
        Review review = getMyReview(id, user);
        pointService.deletePoint(user, review.getReviewImage());
        imageService.deleteImage(review.getReviewImage());
        reviewRepository.delete(review);
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->