From bb0b448f2e4884a17f6b49f3a5c085408cc4d7c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=B0=EC=84=9D=ED=98=84?= Date: Mon, 4 Aug 2025 18:48:12 +0900 Subject: [PATCH] =?UTF-8?q?[FIX]=20=EC=88=98=EC=A0=95=EC=8B=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EA=B4=80=EB=A0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/controller/PostController.java | 16 ++++++----- .../loop/domain/post/service/PostService.java | 27 ++++++++++++++++--- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/src/main/java/server/loop/domain/post/controller/PostController.java b/src/main/java/server/loop/domain/post/controller/PostController.java index a19c240..0a8c3bb 100644 --- a/src/main/java/server/loop/domain/post/controller/PostController.java +++ b/src/main/java/server/loop/domain/post/controller/PostController.java @@ -58,14 +58,18 @@ public ResponseEntity getPost( // 게시글 수정 @Operation(summary = "게시글 수정", description = "작성자 본인의 게시글을 수정합니다.") - @PutMapping("/{postId}") - public ResponseEntity updatePost(@PathVariable Long postId, - @RequestBody PostUpdateRequestDto requestDto, - @AuthenticationPrincipal UserDetails userDetails) throws AccessDeniedException { - postService.updatePost(postId, requestDto, userDetails.getUsername()); - return ResponseEntity.ok("게시글이 성공적으로 수정되었습니다. ID: "+postId); + @PutMapping(value = "/{postId}", consumes = "multipart/form-data") + public ResponseEntity updatePost( + @PathVariable Long postId, + @RequestPart("requestDto") PostUpdateRequestDto requestDto, + @RequestPart(value = "images", required = false) List images, + @AuthenticationPrincipal UserDetails userDetails + ) throws AccessDeniedException, IOException { + postService.updatePost(postId, requestDto, images, userDetails.getUsername()); + return ResponseEntity.ok("게시글이 성공적으로 수정되었습니다. ID: " + postId); } + // 게시글 삭제 @Operation(summary = "게시글 삭제", description = "작성자 본인의 게시글을 삭제합니다.") @DeleteMapping("/{postId}") diff --git a/src/main/java/server/loop/domain/post/service/PostService.java b/src/main/java/server/loop/domain/post/service/PostService.java index cb0f1ff..cd7f2e2 100644 --- a/src/main/java/server/loop/domain/post/service/PostService.java +++ b/src/main/java/server/loop/domain/post/service/PostService.java @@ -91,20 +91,41 @@ public SliceResponseDto getPostsSlice(Category category, Pageab } // 게시글 수정 - public Long updatePost(Long postId, PostUpdateRequestDto requestDto, String email) throws AccessDeniedException { + public Long updatePost(Long postId, PostUpdateRequestDto requestDto, List images, String email) + throws AccessDeniedException, IOException { + Post post = postRepository.findById(postId) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 게시글입니다.")); - // 작성자 본인인지 확인 + // 작성자 본인 확인 if (!post.getAuthor().getEmail().equals(email)) { throw new AccessDeniedException("게시글을 수정할 권한이 없습니다."); } - // Post Entity에 만들어 둔 update 메소드 사용 + // 게시글 내용 수정 post.update(requestDto.getCategory(), requestDto.getTitle(), requestDto.getContent()); + + // === 이미지 처리 === + if (images != null && !images.isEmpty()) { + // 1) 기존 이미지 S3에서 삭제 + post.getImages().forEach(img -> s3UploadService.deleteImageFromS3(img.getImageUrl())); + // 2) DB에서 기존 이미지 레코드 제거 + post.getImages().clear(); + + // 3) 새 이미지 업로드 + for (MultipartFile image : images) { + String imageUrl = s3UploadService.uploadFile(image, "post-images"); + PostImage postImage = new PostImage(imageUrl); + post.addImage(postImage); + } + } + // images가 null 또는 비어있으면 → 기존 이미지 유지 + return postId; } + + // 게시글 삭제 public void deletePost(Long postId, String email) throws AccessDeniedException { Post post = postRepository.findById(postId)