From 2deb0f3477cb640c8a321c174623eb25756335fa Mon Sep 17 00:00:00 2001 From: SeokGeunHo Date: Tue, 23 Sep 2025 12:22:13 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=8C=93=EA=B8=80=20=EC=9E=91=EC=84=B1?= =?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 | 26 +++++++++++++++++ .../dto/request/CommentCreateRequestDto.java | 10 +++++++ .../dto/response/CommentResponseDto.java | 25 ++++++++++++++++ .../post/comment/service/CommentService.java | 29 +++++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 src/main/java/com/back/domain/post/comment/dto/request/CommentCreateRequestDto.java create mode 100644 src/main/java/com/back/domain/post/comment/dto/response/CommentResponseDto.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 2ea555f9..4e9cbca8 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,7 +1,16 @@ package com.back.domain.post.comment.controller; +import com.back.domain.post.comment.dto.request.CommentCreateRequestDto; +import com.back.domain.post.comment.dto.response.CommentResponseDto; +import com.back.domain.post.comment.service.CommentService; +import com.back.global.rsData.RsData; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -11,4 +20,21 @@ @RequiredArgsConstructor public class CommentController { + private final CommentService commentService; + + /** + * 댓글 작성 API + * @param postId 댓글을 작성할 게시글 ID + * @param reqBody 댓글 작성 요청 DTO + * @return 작성된 댓글 정보 + */ + @PostMapping + @Operation(summary = "댓글 작성") + public RsData createComment( + @PathVariable Long postId, + @Valid @RequestBody CommentCreateRequestDto reqBody + ) { + return RsData.successOf(commentService.createComment(postId, 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 new file mode 100644 index 00000000..af9620d9 --- /dev/null +++ b/src/main/java/com/back/domain/post/comment/dto/request/CommentCreateRequestDto.java @@ -0,0 +1,10 @@ +package com.back.domain.post.comment.dto.request; + +import jakarta.validation.constraints.NotBlank; + +public record CommentCreateRequestDto( + Long postId, + @NotBlank (message = "내용은 필수입니다.") + String content +) { +} \ No newline at end of file diff --git a/src/main/java/com/back/domain/post/comment/dto/response/CommentResponseDto.java b/src/main/java/com/back/domain/post/comment/dto/response/CommentResponseDto.java new file mode 100644 index 00000000..5131adcb --- /dev/null +++ b/src/main/java/com/back/domain/post/comment/dto/response/CommentResponseDto.java @@ -0,0 +1,25 @@ +package com.back.domain.post.comment.dto.response; + +import com.back.domain.post.comment.entity.Comment; +import java.time.LocalDateTime; + +public record CommentResponseDto( + Long commentId, + Long postId, + String userNickName, + LocalDateTime createdAt, + LocalDateTime updatedAt, + String content +) { + + public CommentResponseDto(Comment comment) { + this( + comment.getId(), + comment.getPost().getId(), + comment.getUser().getNickname(), + comment.getCreatedAt(), + comment.getUpdatedAt(), + comment.getContent() + ); + } +} \ No newline at end of file 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 97edf5b8..e35195ba 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,10 +1,39 @@ package com.back.domain.post.comment.service; +import com.back.domain.post.comment.dto.request.CommentCreateRequestDto; +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; +import com.back.domain.post.post.entity.Post; +import com.back.domain.post.post.repository.PostRepository; +import com.back.domain.user.entity.User; +import com.back.global.rq.Rq; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor public class CommentService { + private final CommentRepository commentRepository; + private final PostRepository postRepository; + private final Rq rq; + + // 댓글 작성 로직 + @Transactional + public CommentResponseDto createComment(Long postId, CommentCreateRequestDto reqBody) { + User user = rq.getActor(); + + Post post = postRepository.findById(postId) + .orElseThrow(() -> new IllegalArgumentException("게시글이 존재하지 않습니다. id=" + postId)); + + Comment comment = Comment.builder() + .post(post) + .user(user) + .content(reqBody.content()) + .build(); + + return new CommentResponseDto(commentRepository.save(comment)); + } }