@@ -6,6 +6,7 @@
 import com.doubleowner.revibe.domain.review.service.ReviewService;
 import com.doubleowner.revibe.global.common.dto.CommonResponseBody;
 import com.doubleowner.revibe.global.config.auth.UserDetailsImpl;
+import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
@@ -17,31 +18,31 @@
 import java.util.List;
 
 @RestController
-@RequestMapping
+@RequestMapping("/api/reviews")
 @RequiredArgsConstructor
 public class ReviewController {
     private final ReviewService reviewService;
 
-    @PostMapping(value = "/reviews", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
-    public ResponseEntity<CommonResponseBody<ReviewResponseDto>> writeReview(@AuthenticationPrincipal UserDetailsImpl userDetails, @RequestPart ReviewRequestDto reviewRequestDto, @RequestPart(name = "image", required = false) MultipartFile file) {
+    @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public ResponseEntity<CommonResponseBody<ReviewResponseDto>> writeReview(@AuthenticationPrincipal UserDetailsImpl userDetails, @Valid @RequestPart ReviewRequestDto reviewRequestDto, @RequestPart(name = "image", required = false) MultipartFile file) {
         ReviewResponseDto review = reviewService.write(reviewRequestDto, file, userDetails.getUser());
         return new ResponseEntity<>(new CommonResponseBody<>("리뷰가 등록되었습니다.", review), HttpStatus.CREATED);
     }
 
-    @GetMapping("/reviews")
+    @GetMapping
     public ResponseEntity<CommonResponseBody<List<ReviewResponseDto>>> findReviews(@AuthenticationPrincipal UserDetailsImpl userDetails) {
         List<ReviewResponseDto> read = reviewService.findReview(userDetails.getUser());
         return new ResponseEntity<>(new CommonResponseBody<>("리뷰가 조회 되었습니다", read), HttpStatus.OK);
     }
 
-    @PutMapping(value = "/reviews/{id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
-    public ResponseEntity<CommonResponseBody<Void>> updateReview(@PathVariable Long id, @AuthenticationPrincipal UserDetailsImpl userDetails, @RequestPart UpdateReviewRequestDto updateReviewRequestDto, @RequestPart(name = "image", required = false) MultipartFile file) {
+    @PutMapping(value = "/{id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public ResponseEntity<CommonResponseBody<Void>> updateReview(@PathVariable Long id, @AuthenticationPrincipal UserDetailsImpl userDetails, @Valid @RequestPart UpdateReviewRequestDto updateReviewRequestDto, @RequestPart(name = "image", required = false) MultipartFile file) {
         reviewService.updateReview(id, userDetails, updateReviewRequestDto, file);
         return new ResponseEntity<>(new CommonResponseBody<>("리뷰가 수정되었습니다."), HttpStatus.OK);
 
     }
 
-    @DeleteMapping("/reviews/{id}")
+    @DeleteMapping("/{id}")
     public ResponseEntity<CommonResponseBody<Void>> deleteReview(@PathVariable Long id, @AuthenticationPrincipal UserDetailsImpl userDetails) {
         reviewService.deleteReview(id, userDetails.getUser());
         return new ResponseEntity<>(new CommonResponseBody<>("리뷰가 삭제되었습니다."), HttpStatus.OK);

리뷰: _:bulb: Codebase verification_



**파일 업로드 보안 검증이 미흡합니다** 

현재 파일 크기 제한(5MB)만 설정되어 있으며, 다음과 같은 중요한 보안 검증이 누락되어 있습니다:

1. 이미지 파일 형식 검증 로직 (허용된 확장자: jpg, png 등)
2. Content-Type 검증 (`image/*`)
3. 파일명 보안 처리 (XSS 방지를 위한 특수문자 제거 등)

구현 제안:
- `FileValidator` 클래스를 생성하여 위 검증 로직을 구현하고 `ReviewService`에서 활용
- 파일 업로드 전 `MediaType.IMAGE_*` 타입 검증
- Apache Commons IO의 `FilenameUtils`를 활용한 파일명 정규화

<details>
<summary>🔗 Analysis chain</summary>

**Multipart 요청에 대한 검증이 필요합니다.**

`@Valid`를 추가하여 DTO 검증을 강화한 것은 좋은 개선이지만, 파일 업로드와 관련하여 몇 가지 검토가 필요합니다:

1. 파일 크기 제한
2. 허용된 이미지 형식 검증
3. 파일명 보안 처리

다음 설정들이 적용되어 있는지 확인해주세요:




Also applies to: 38-39

</details>

<details>
<summary>🏁 Scripts executed</summary>

The following scripts were executed for the analysis:

Script:

```shell
#!/bin/bash
# application.properties/yml에서 파일 업로드 관련 설정 확인
rg "multipart|spring.servlet.multipart" 

# 파일 검증 로직 확인
rg "MediaType.IMAGE|ContentType|FileValidator" -A 5

```

Length of output: 2892

---

Script:

```shell
#!/bin/bash
# Check ReviewService for file validation
ast-grep --pattern 'class ReviewService {
  $$$
  writeReview($$$) {
    $$$
  }
  $$$
}'

# Check for any image validation
rg -i "image.*validation|validate.*image|file.*type" -A 3

```

Length of output: 612

</details>

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