From e9d2f616a9e9db4cc83279ffb0869c574d9f7e2c Mon Sep 17 00:00:00 2001 From: SeokGeunHo Date: Tue, 23 Sep 2025 16:40:55 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=8C=93=EA=B8=80=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comment/controller/CommentController.java | 32 +++++++++++++++++++ .../dto/request/CommentCreateRequestDto.java | 1 - .../dto/request/CommentUpdateRequestDto.java | 6 ++++ .../domain/post/comment/entity/Comment.java | 4 +++ .../post/comment/service/CommentService.java | 21 ++++++++++++ 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/back/domain/post/comment/dto/request/CommentUpdateRequestDto.java diff --git a/src/main/java/com/back/domain/post/comment/controller/CommentController.java b/src/main/java/com/back/domain/post/comment/controller/CommentController.java index 2e641904..ee59bb87 100644 --- a/src/main/java/com/back/domain/post/comment/controller/CommentController.java +++ b/src/main/java/com/back/domain/post/comment/controller/CommentController.java @@ -1,8 +1,10 @@ package com.back.domain.post.comment.controller; import com.back.domain.post.comment.dto.request.CommentCreateRequestDto; +import com.back.domain.post.comment.dto.request.CommentUpdateRequestDto; import com.back.domain.post.comment.dto.response.CommentResponseDto; import com.back.domain.post.comment.service.CommentService; +import com.back.domain.post.post.dto.request.PostUpdateRequestDto; import com.back.domain.post.post.dto.response.PostResponseDto; import com.back.global.rsData.RsData; import io.swagger.v3.oas.annotations.Operation; @@ -11,6 +13,7 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -41,6 +44,12 @@ public RsData createComment( return RsData.successOf(commentService.createComment(postId, reqBody)); // code=200, message="success" } + /** + * 댓글 다건 조회 API + * @param postId 댓글이 작성된 게시글 ID + * @param lastId 마지막으로 조회한 댓글 ID (페이징 처리용, optional) + * @return 댓글 목록 + */ @GetMapping @Operation(summary = "댓글 다건 조회") public RsData> getComments( @@ -50,6 +59,12 @@ public RsData> getComments( return RsData.successOf(commentService.getComments(postId, lastId)); // code=200, message="success" } + /** + * 댓글 단건 조회 API + * @param postId 댓글이 작성된 게시글 ID + * @param commentId 조회할 댓글 ID + * @return 해당 ID의 댓글 정보 + */ @GetMapping("/{commentId}") @Operation(summary = "댓글 단건 조회") public RsData getComment( @@ -58,4 +73,21 @@ public RsData getComment( ) { return RsData.successOf(commentService.getComment(postId, commentId)); // code=200, message="success" } + + /** + * 댓글 수정 API + * @param postId 댓글이 작성된 게시글 ID + * @param commentId 수정할 댓글 ID + * @param reqBody 댓글 수정 요청 DTO + * @return 수정된 댓글 정보 + */ + @PatchMapping("/{commentId}") + @Operation(summary = "댓글 수정") + public RsData updateComment( + @PathVariable Long postId, + @PathVariable Long commentId, + @Valid @RequestBody CommentUpdateRequestDto reqBody + ) { + return RsData.successOf(commentService.updateComment(postId, commentId, reqBody)); // code=200, message="success" + } } diff --git a/src/main/java/com/back/domain/post/comment/dto/request/CommentCreateRequestDto.java b/src/main/java/com/back/domain/post/comment/dto/request/CommentCreateRequestDto.java index af9620d9..7b6cd67b 100644 --- a/src/main/java/com/back/domain/post/comment/dto/request/CommentCreateRequestDto.java +++ b/src/main/java/com/back/domain/post/comment/dto/request/CommentCreateRequestDto.java @@ -3,7 +3,6 @@ import jakarta.validation.constraints.NotBlank; public record CommentCreateRequestDto( - Long postId, @NotBlank (message = "내용은 필수입니다.") String content ) { diff --git a/src/main/java/com/back/domain/post/comment/dto/request/CommentUpdateRequestDto.java b/src/main/java/com/back/domain/post/comment/dto/request/CommentUpdateRequestDto.java new file mode 100644 index 00000000..a685d508 --- /dev/null +++ b/src/main/java/com/back/domain/post/comment/dto/request/CommentUpdateRequestDto.java @@ -0,0 +1,6 @@ +package com.back.domain.post.comment.dto.request; + +public record CommentUpdateRequestDto( + String content +) { +} \ No newline at end of file diff --git a/src/main/java/com/back/domain/post/comment/entity/Comment.java b/src/main/java/com/back/domain/post/comment/entity/Comment.java index fffacef6..9dbb0cd5 100644 --- a/src/main/java/com/back/domain/post/comment/entity/Comment.java +++ b/src/main/java/com/back/domain/post/comment/entity/Comment.java @@ -56,4 +56,8 @@ public class Comment { // 댓글 내용 @Column(name = "content", nullable = false, columnDefinition = "TEXT") private String content; + + public void updateContent(String content) { + this.content = content; + } } diff --git a/src/main/java/com/back/domain/post/comment/service/CommentService.java b/src/main/java/com/back/domain/post/comment/service/CommentService.java index d995b18b..1b80a9d4 100644 --- a/src/main/java/com/back/domain/post/comment/service/CommentService.java +++ b/src/main/java/com/back/domain/post/comment/service/CommentService.java @@ -1,6 +1,7 @@ package com.back.domain.post.comment.service; import com.back.domain.post.comment.dto.request.CommentCreateRequestDto; +import com.back.domain.post.comment.dto.request.CommentUpdateRequestDto; import com.back.domain.post.comment.dto.response.CommentResponseDto; import com.back.domain.post.comment.entity.Comment; import com.back.domain.post.comment.repository.CommentRepository; @@ -66,4 +67,24 @@ public CommentResponseDto getComment(Long postId, Long commentId) { return new CommentResponseDto(comment); } + + // 댓글 수정 로직 + @Transactional + public CommentResponseDto updateComment(Long postId, Long commentId, CommentUpdateRequestDto requestDto) { + User user = rq.getActor(); + + Comment comment = commentRepository.findById(commentId) + .orElseThrow(() -> new IllegalArgumentException("댓글이 존재하지 않습니다. id=" + commentId)); + + if (!comment.getPost().getId().equals(postId)) { + throw new IllegalStateException("댓글이 해당 게시글에 속하지 않습니다."); + } + + if (!comment.getUser().equals(user)) { + throw new IllegalStateException("본인의 댓글만 수정할 수 있습니다."); + } + + comment.updateContent(requestDto.content()); + return new CommentResponseDto(comment); + } }