From 33f2cc0dcb9eb3911d5ef08c31c5318c27b2a259 Mon Sep 17 00:00:00 2001 From: uni-j-uni Date: Sat, 13 Dec 2025 04:38:12 +0900 Subject: [PATCH 1/3] =?UTF-8?q?:sparkles:Feat:=20=EC=BB=A4=EB=AE=A4?= =?UTF-8?q?=EB=8B=88=ED=8B=B0=20=EC=B6=94=EA=B0=80=20API=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comment/controller/CommentController.java | 4 + .../controller/CommentControllerImpl.java | 7 ++ .../comment/dto/request/CommentRequest.java | 3 + .../dto/response/CommentDetailResponse.java | 16 +++ .../refit/domain/comment/entity/Comment.java | 12 +++ .../domain/comment/entity/CommentLike.java | 43 ++++++++ .../domain/comment/mapper/CommentMapper.java | 23 +++- .../repository/CommentLikeRepository.java | 47 ++++++++ .../comment/service/CommentService.java | 7 ++ .../comment/service/CommentServiceImpl.java | 101 +++++++++++++++++- .../sku/refit/domain/post/entity/Post.java | 8 ++ .../domain/post/service/PostServiceImpl.java | 2 + src/main/resources | 2 +- 13 files changed, 267 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/sku/refit/domain/comment/entity/CommentLike.java create mode 100644 src/main/java/com/sku/refit/domain/comment/repository/CommentLikeRepository.java diff --git a/src/main/java/com/sku/refit/domain/comment/controller/CommentController.java b/src/main/java/com/sku/refit/domain/comment/controller/CommentController.java index e84360e..5a22ce4 100644 --- a/src/main/java/com/sku/refit/domain/comment/controller/CommentController.java +++ b/src/main/java/com/sku/refit/domain/comment/controller/CommentController.java @@ -35,6 +35,10 @@ ResponseEntity> createComment( @RequestBody @Valid CommentRequest request, @Parameter(description = "댓글을 작성할 게시글 식별자", example = "1") @RequestParam Long postId); + @PostMapping("/{id}/like") + @Operation(summary = "댓글 좋아요 토글") + ResponseEntity> toggleLike(@PathVariable Long id); + @GetMapping @Operation(summary = "특정 게시글의 댓글 조회", description = "특정 게시글의 댓글 리스트를 조회합니다.") ResponseEntity>> getAllCommentsByPostId( diff --git a/src/main/java/com/sku/refit/domain/comment/controller/CommentControllerImpl.java b/src/main/java/com/sku/refit/domain/comment/controller/CommentControllerImpl.java index b1b3187..1aab203 100644 --- a/src/main/java/com/sku/refit/domain/comment/controller/CommentControllerImpl.java +++ b/src/main/java/com/sku/refit/domain/comment/controller/CommentControllerImpl.java @@ -35,6 +35,13 @@ public ResponseEntity> createComment( return ResponseEntity.ok(BaseResponse.success(response)); } + @Override + public ResponseEntity> toggleLike(@PathVariable Long id) { + + commentService.toggleLike(id); + return ResponseEntity.ok(BaseResponse.success()); + } + @Override public ResponseEntity>> getAllCommentsByPostId( @RequestParam Long postId) { diff --git a/src/main/java/com/sku/refit/domain/comment/dto/request/CommentRequest.java b/src/main/java/com/sku/refit/domain/comment/dto/request/CommentRequest.java index 0fcfe71..7922b6e 100644 --- a/src/main/java/com/sku/refit/domain/comment/dto/request/CommentRequest.java +++ b/src/main/java/com/sku/refit/domain/comment/dto/request/CommentRequest.java @@ -21,4 +21,7 @@ public class CommentRequest { @NotBlank(message = "댓글 내용은 필수입니다.") @Schema(description = "댓글 내용", example = "답변 감사합니다~~~") private String content; + + @Schema(description = "답글을 작성할 댓글의 식별자", example = "1") + private Long parentCommentId; } diff --git a/src/main/java/com/sku/refit/domain/comment/dto/response/CommentDetailResponse.java b/src/main/java/com/sku/refit/domain/comment/dto/response/CommentDetailResponse.java index 79bccf8..a0f2694 100644 --- a/src/main/java/com/sku/refit/domain/comment/dto/response/CommentDetailResponse.java +++ b/src/main/java/com/sku/refit/domain/comment/dto/response/CommentDetailResponse.java @@ -4,6 +4,7 @@ package com.sku.refit.domain.comment.dto.response; import java.time.LocalDateTime; +import java.util.List; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @@ -20,9 +21,24 @@ public class CommentDetailResponse { @Schema(description = "댓글 내용", example = "처음 가보는거라 질문 드립니다 ㅠㅠ") private String content; + @Schema(description = "댓글 작성자", example = "김다입") + private String nickname; + @Schema(description = "댓글 작성자 여부", example = "true") private Boolean isWriter; @Schema(description = "댓글 작성 시간", example = "20250101T120000") private LocalDateTime createdAt; + + @Schema(description = "부모 댓글 ID (null이면 일반 댓글)", example = "null") + private Long parentCommentId; + + @Schema(description = "좋아요 개수", example = "3") + private Long likeCount; + + @Schema(description = "내가 좋아요를 눌렀는지 여부", example = "true") + private Boolean isLiked; + + @Schema(description = "답글 리스트") + private List replies; } diff --git a/src/main/java/com/sku/refit/domain/comment/entity/Comment.java b/src/main/java/com/sku/refit/domain/comment/entity/Comment.java index 249c58f..8b72dbe 100644 --- a/src/main/java/com/sku/refit/domain/comment/entity/Comment.java +++ b/src/main/java/com/sku/refit/domain/comment/entity/Comment.java @@ -3,6 +3,10 @@ */ package com.sku.refit.domain.comment.entity; +import java.util.ArrayList; +import java.util.List; + +import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -11,6 +15,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; import jakarta.persistence.Table; import com.sku.refit.domain.post.entity.Post; @@ -46,6 +51,13 @@ public class Comment extends BaseTimeEntity { @JoinColumn(name = "post_id", nullable = false) private Post post; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "parent_id") + private Comment parent; + + @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true) + private List replies = new ArrayList<>(); + public void update(String content) { this.content = content; } diff --git a/src/main/java/com/sku/refit/domain/comment/entity/CommentLike.java b/src/main/java/com/sku/refit/domain/comment/entity/CommentLike.java new file mode 100644 index 0000000..a2bdb44 --- /dev/null +++ b/src/main/java/com/sku/refit/domain/comment/entity/CommentLike.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) SKU 다시입을Lab + */ +package com.sku.refit.domain.comment.entity; + +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; + +import com.sku.refit.domain.user.entity.User; +import com.sku.refit.global.common.BaseTimeEntity; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Builder +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Table( + name = "comment_like", + uniqueConstraints = {@UniqueConstraint(columnNames = {"comment_id", "user_id"})}) +public class CommentLike extends BaseTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + private Comment comment; + + @ManyToOne(fetch = FetchType.LAZY) + private User user; +} diff --git a/src/main/java/com/sku/refit/domain/comment/mapper/CommentMapper.java b/src/main/java/com/sku/refit/domain/comment/mapper/CommentMapper.java index 978d64e..3c7c172 100644 --- a/src/main/java/com/sku/refit/domain/comment/mapper/CommentMapper.java +++ b/src/main/java/com/sku/refit/domain/comment/mapper/CommentMapper.java @@ -3,6 +3,8 @@ */ package com.sku.refit.domain.comment.mapper; +import java.util.List; + import org.springframework.stereotype.Component; import com.sku.refit.domain.comment.dto.request.CommentRequest; @@ -14,17 +16,32 @@ @Component public class CommentMapper { - public Comment toComment(CommentRequest request, User user, Post post) { - return Comment.builder().content(request.getContent()).user(user).post(post).build(); + public Comment toComment(CommentRequest request, Comment parent, User user, Post post) { + return Comment.builder() + .content(request.getContent()) + .parent(parent) + .user(user) + .post(post) + .build(); } - public CommentDetailResponse toDetailResponse(Comment comment, User user) { + public CommentDetailResponse toDetailResponse( + Comment comment, + User user, + Long likeCount, + Boolean isLiked, + List replies) { return CommentDetailResponse.builder() .commentId(comment.getId()) .content(comment.getContent()) + .nickname(comment.getUser().getNickname()) .isWriter(comment.getUser().getId().equals(user.getId())) .createdAt(comment.getCreatedAt()) + .parentCommentId(comment.getParent() != null ? comment.getParent().getId() : null) + .likeCount(likeCount) + .isLiked(isLiked) + .replies(replies) .build(); } } diff --git a/src/main/java/com/sku/refit/domain/comment/repository/CommentLikeRepository.java b/src/main/java/com/sku/refit/domain/comment/repository/CommentLikeRepository.java new file mode 100644 index 0000000..dab993a --- /dev/null +++ b/src/main/java/com/sku/refit/domain/comment/repository/CommentLikeRepository.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) SKU 다시입을Lab + */ +package com.sku.refit.domain.comment.repository; + +import java.util.List; +import java.util.Optional; +import java.util.Set; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import com.sku.refit.domain.comment.entity.Comment; +import com.sku.refit.domain.comment.entity.CommentLike; +import com.sku.refit.domain.user.entity.User; + +import io.lettuce.core.dynamic.annotation.Param; + +@Repository +public interface CommentLikeRepository extends JpaRepository { + + boolean existsByCommentAndUser(Comment comment, User user); + + Optional findByCommentAndUser(Comment comment, User user); + + long countByComment(Comment comment); + + @Query( + """ + select cl.comment.id, count(cl) + from CommentLike cl + where cl.comment.id in :commentIds + group by cl.comment.id +""") + List countByCommentIds(@Param("commentIds") List commentIds); + + @Query( + """ + select cl.comment.id + from CommentLike cl + where cl.comment.id in :commentIds + and cl.user.id = :userId +""") + Set findLikedCommentIds( + @Param("commentIds") List commentIds, @Param("userId") Long userId); +} diff --git a/src/main/java/com/sku/refit/domain/comment/service/CommentService.java b/src/main/java/com/sku/refit/domain/comment/service/CommentService.java index afb1728..1b6e6e8 100644 --- a/src/main/java/com/sku/refit/domain/comment/service/CommentService.java +++ b/src/main/java/com/sku/refit/domain/comment/service/CommentService.java @@ -19,6 +19,13 @@ public interface CommentService { */ CommentDetailResponse createComment(CommentRequest request, Long postId); + /** + * 댓글 좋아요 등록 + * + * @param commentId + */ + void toggleLike(Long commentId); + /** * 특정 게시글의 댓글 전체 조회 * diff --git a/src/main/java/com/sku/refit/domain/comment/service/CommentServiceImpl.java b/src/main/java/com/sku/refit/domain/comment/service/CommentServiceImpl.java index 3e353f1..23784ec 100644 --- a/src/main/java/com/sku/refit/domain/comment/service/CommentServiceImpl.java +++ b/src/main/java/com/sku/refit/domain/comment/service/CommentServiceImpl.java @@ -3,7 +3,11 @@ */ package com.sku.refit.domain.comment.service; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -11,8 +15,10 @@ import com.sku.refit.domain.comment.dto.request.CommentRequest; import com.sku.refit.domain.comment.dto.response.CommentDetailResponse; import com.sku.refit.domain.comment.entity.Comment; +import com.sku.refit.domain.comment.entity.CommentLike; import com.sku.refit.domain.comment.exception.CommentErrorCode; import com.sku.refit.domain.comment.mapper.CommentMapper; +import com.sku.refit.domain.comment.repository.CommentLikeRepository; import com.sku.refit.domain.comment.repository.CommentRepository; import com.sku.refit.domain.post.entity.Post; import com.sku.refit.domain.post.exception.PostErrorCode; @@ -31,6 +37,7 @@ public class CommentServiceImpl implements CommentService { private final CommentRepository commentRepository; + private final CommentLikeRepository commentLikeRepository; private final PostRepository postRepository; private final CommentMapper commentMapper; private final UserService userService; @@ -46,10 +53,51 @@ public CommentDetailResponse createComment(CommentRequest request, Long postId) .findById(postId) .orElseThrow(() -> new CustomException(PostErrorCode.POST_NOT_FOUND)); - Comment comment = commentMapper.toComment(request, user, post); + Comment parent = null; + if (request.getParentCommentId() != null) { + parent = + commentRepository + .findById(request.getParentCommentId()) + .orElseThrow(() -> new CustomException(CommentErrorCode.COMMENT_NOT_FOUND)); + } + + Comment comment = commentMapper.toComment(request, parent, user, post); commentRepository.save(comment); - return commentMapper.toDetailResponse(comment, user); + + return commentMapper.toDetailResponse(comment, user, 0L, false, new ArrayList<>()); + } + + @Override + @Transactional + public void toggleLike(Long commentId) { + + User user = userService.getCurrentUser(); + + Comment comment = + commentRepository + .findById(commentId) + .orElseThrow(() -> new CustomException(CommentErrorCode.COMMENT_NOT_FOUND)); + + commentLikeRepository + .findByCommentAndUser(comment, user) + .ifPresentOrElse( + like -> { + commentLikeRepository.delete(like); + log.info( + "[COMMENT LIKE] UNLIKE - commentId={}, userId={}", comment.getId(), user.getId()); + }, + () -> { + CommentLike saved = + commentLikeRepository.save( + CommentLike.builder().comment(comment).user(user).build()); + + log.info( + "[COMMENT LIKE] LIKE - commentId={}, userId={}, likeId={}", + comment.getId(), + user.getId(), + saved.getId()); + }); } @Override @@ -62,7 +110,49 @@ public List getAllCommentsByPostId(Long postId) { List comments = commentRepository.findAllByPostIdOrderByCreatedAtAsc(postId); - return comments.stream().map(comment -> commentMapper.toDetailResponse(comment, user)).toList(); + if (comments.isEmpty()) { + return List.of(); + } + + List commentIds = comments.stream().map(Comment::getId).toList(); + + List likeCounts = commentLikeRepository.countByCommentIds(commentIds); + + Map likeCountMap = new HashMap<>(); + for (Object[] row : likeCounts) { + Long commentId = (Long) row[0]; + Long count = (Long) row[1]; + likeCountMap.put(commentId, count); + } + + Set likedCommentIds = commentLikeRepository.findLikedCommentIds(commentIds, user.getId()); + + Map responseMap = new HashMap<>(); + + for (Comment comment : comments) { + responseMap.put( + comment.getId(), + commentMapper.toDetailResponse( + comment, + user, + likeCountMap.getOrDefault(comment.getId(), 0L), + likedCommentIds.contains(comment.getId()), + new ArrayList<>())); + } + + List result = new ArrayList<>(); + + for (Comment comment : comments) { + CommentDetailResponse response = responseMap.get(comment.getId()); + + if (comment.getParent() == null) { + result.add(response); + } else { + responseMap.get(comment.getParent().getId()).getReplies().add(response); + } + } + + return result; } @Override @@ -81,7 +171,10 @@ public CommentDetailResponse updateComment(Long id, CommentRequest request) { comment.update(request.getContent()); - return commentMapper.toDetailResponse(comment, user); + long likeCount = commentLikeRepository.countByComment(comment); + boolean isLiked = commentLikeRepository.existsByCommentAndUser(comment, user); + + return commentMapper.toDetailResponse(comment, user, likeCount, isLiked, new ArrayList<>()); } @Override diff --git a/src/main/java/com/sku/refit/domain/post/entity/Post.java b/src/main/java/com/sku/refit/domain/post/entity/Post.java index 96d7ac0..f925077 100644 --- a/src/main/java/com/sku/refit/domain/post/entity/Post.java +++ b/src/main/java/com/sku/refit/domain/post/entity/Post.java @@ -48,6 +48,10 @@ public class Post extends BaseTimeEntity { @Column(nullable = false) private String content; + @Column(nullable = false) + @Builder.Default + private Integer views = 0; + @ElementCollection @CollectionTable(name = "post_category", joinColumns = @JoinColumn(name = "post_id")) @Column(nullable = false) @@ -75,4 +79,8 @@ public void update(String title, String content, List imageUrlList) { this.content = content; this.imageUrlList = imageUrlList; } + + public void increaseViews() { + this.views += 1; + } } diff --git a/src/main/java/com/sku/refit/domain/post/service/PostServiceImpl.java b/src/main/java/com/sku/refit/domain/post/service/PostServiceImpl.java index 669afac..081c7d5 100644 --- a/src/main/java/com/sku/refit/domain/post/service/PostServiceImpl.java +++ b/src/main/java/com/sku/refit/domain/post/service/PostServiceImpl.java @@ -114,6 +114,8 @@ public PostDetailResponse getPostById(Long id) { .findById(id) .orElseThrow(() -> new CustomException(PostErrorCode.POST_NOT_FOUND)); + post.increaseViews(); + return postMapper.toDetailResponse(post, user); } diff --git a/src/main/resources b/src/main/resources index 5471022..d23b7c2 160000 --- a/src/main/resources +++ b/src/main/resources @@ -1 +1 @@ -Subproject commit 547102251cecc07b04c80516470cd71d4f4a2145 +Subproject commit d23b7c2b63504e84ea800b139b7e9235d4bf045f From 0a91147ddd4d475df8965404074359105befd1cc Mon Sep 17 00:00:00 2001 From: uni-j-uni Date: Sat, 13 Dec 2025 13:28:07 +0900 Subject: [PATCH 2/3] =?UTF-8?q?:recycle:Refactor:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EA=B8=B0=EB=B0=98=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../refit/domain/comment/entity/Comment.java | 1 + .../repository/CommentLikeRepository.java | 3 +-- .../comment/service/CommentServiceImpl.java | 24 +++++++++++++++++- .../post/dto/response/PostDetailResponse.java | 3 +++ .../sku/refit/domain/post/entity/Post.java | 4 +-- .../refit/domain/post/mapper/PostMapper.java | 1 + .../domain/post/service/PostServiceImpl.java | 25 ++++++++++++++++++- 7 files changed, 55 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/sku/refit/domain/comment/entity/Comment.java b/src/main/java/com/sku/refit/domain/comment/entity/Comment.java index 8b72dbe..80d360f 100644 --- a/src/main/java/com/sku/refit/domain/comment/entity/Comment.java +++ b/src/main/java/com/sku/refit/domain/comment/entity/Comment.java @@ -56,6 +56,7 @@ public class Comment extends BaseTimeEntity { private Comment parent; @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true) + @Builder.Default private List replies = new ArrayList<>(); public void update(String content) { diff --git a/src/main/java/com/sku/refit/domain/comment/repository/CommentLikeRepository.java b/src/main/java/com/sku/refit/domain/comment/repository/CommentLikeRepository.java index dab993a..cb59dd5 100644 --- a/src/main/java/com/sku/refit/domain/comment/repository/CommentLikeRepository.java +++ b/src/main/java/com/sku/refit/domain/comment/repository/CommentLikeRepository.java @@ -9,14 +9,13 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import com.sku.refit.domain.comment.entity.Comment; import com.sku.refit.domain.comment.entity.CommentLike; import com.sku.refit.domain.user.entity.User; -import io.lettuce.core.dynamic.annotation.Param; - @Repository public interface CommentLikeRepository extends JpaRepository { diff --git a/src/main/java/com/sku/refit/domain/comment/service/CommentServiceImpl.java b/src/main/java/com/sku/refit/domain/comment/service/CommentServiceImpl.java index 23784ec..edcef96 100644 --- a/src/main/java/com/sku/refit/domain/comment/service/CommentServiceImpl.java +++ b/src/main/java/com/sku/refit/domain/comment/service/CommentServiceImpl.java @@ -65,6 +65,13 @@ public CommentDetailResponse createComment(CommentRequest request, Long postId) commentRepository.save(comment); + log.info( + "[COMMENT CREATE] commentId={}, postId={}, userId={}, parentId={}", + comment.getId(), + postId, + user.getId(), + parent != null ? parent.getId() : null); + return commentMapper.toDetailResponse(comment, user, 0L, false, new ArrayList<>()); } @@ -148,10 +155,17 @@ public List getAllCommentsByPostId(Long postId) { if (comment.getParent() == null) { result.add(response); } else { - responseMap.get(comment.getParent().getId()).getReplies().add(response); + CommentDetailResponse parentResponse = responseMap.get(comment.getParent().getId()); + if (parentResponse != null) { + parentResponse.getReplies().add(response); + } else { + result.add(response); + } } } + log.info("[COMMENT LIST] postId={}, commentCount={}", postId, comments.size()); + return result; } @@ -174,6 +188,8 @@ public CommentDetailResponse updateComment(Long id, CommentRequest request) { long likeCount = commentLikeRepository.countByComment(comment); boolean isLiked = commentLikeRepository.existsByCommentAndUser(comment, user); + log.info("[COMMENT UPDATE] commentId={}, userId={}", comment.getId(), user.getId()); + return commentMapper.toDetailResponse(comment, user, likeCount, isLiked, new ArrayList<>()); } @@ -194,6 +210,12 @@ public void deleteComment(Long id) { Post post = comment.getPost(); post.getCommentList().remove(comment); + log.info( + "[COMMENT DELETE] commentId={}, postId={}, userId={}", + comment.getId(), + comment.getPost().getId(), + user.getId()); + commentRepository.delete(comment); } } diff --git a/src/main/java/com/sku/refit/domain/post/dto/response/PostDetailResponse.java b/src/main/java/com/sku/refit/domain/post/dto/response/PostDetailResponse.java index da86f8f..7dc1a91 100644 --- a/src/main/java/com/sku/refit/domain/post/dto/response/PostDetailResponse.java +++ b/src/main/java/com/sku/refit/domain/post/dto/response/PostDetailResponse.java @@ -27,6 +27,9 @@ public class PostDetailResponse { @Schema(description = "게시글 내용", example = "처음 가보는거라 질문 드립니다 ㅠㅠ") private String content; + @Schema(description = "게시글 조회수", example = "100") + private Long views; + @Schema(description = "게시글 작성 시간", example = "2025-12-03T14:37:17") private LocalDateTime createdAt; diff --git a/src/main/java/com/sku/refit/domain/post/entity/Post.java b/src/main/java/com/sku/refit/domain/post/entity/Post.java index f925077..ec05b62 100644 --- a/src/main/java/com/sku/refit/domain/post/entity/Post.java +++ b/src/main/java/com/sku/refit/domain/post/entity/Post.java @@ -50,7 +50,7 @@ public class Post extends BaseTimeEntity { @Column(nullable = false) @Builder.Default - private Integer views = 0; + private Long views = 0L; @ElementCollection @CollectionTable(name = "post_category", joinColumns = @JoinColumn(name = "post_id")) @@ -81,6 +81,6 @@ public void update(String title, String content, List imageUrlList) { } public void increaseViews() { - this.views += 1; + this.views += 1L; } } diff --git a/src/main/java/com/sku/refit/domain/post/mapper/PostMapper.java b/src/main/java/com/sku/refit/domain/post/mapper/PostMapper.java index 44c48a4..885a6ef 100644 --- a/src/main/java/com/sku/refit/domain/post/mapper/PostMapper.java +++ b/src/main/java/com/sku/refit/domain/post/mapper/PostMapper.java @@ -33,6 +33,7 @@ public PostDetailResponse toDetailResponse(Post post, User user) { .postId(post.getId()) .title(post.getTitle()) .content(post.getContent()) + .views(post.getViews()) .createdAt(post.getCreatedAt()) .nickname(user.getNickname()) .categoryList(post.getCategoryList()) diff --git a/src/main/java/com/sku/refit/domain/post/service/PostServiceImpl.java b/src/main/java/com/sku/refit/domain/post/service/PostServiceImpl.java index 081c7d5..774a298 100644 --- a/src/main/java/com/sku/refit/domain/post/service/PostServiceImpl.java +++ b/src/main/java/com/sku/refit/domain/post/service/PostServiceImpl.java @@ -59,6 +59,12 @@ public PostDetailResponse createPost(PostRequest request, List im Post post = postMapper.toPost(request, imageUrlList, user); postRepository.save(post); + log.info( + "[POST CREATE] postId={}, userId={}, imageCount={}", + post.getId(), + user.getId(), + imageUrlList.size()); + return postMapper.toDetailResponse(post, user); } @@ -69,6 +75,8 @@ public List getAllPosts() { User user = userService.getCurrentUser(); List posts = postRepository.findAll(); + log.info("[POST LIST] userId={}, postCount={}", user.getId(), posts.size()); + return posts.stream().map(post -> postMapper.toDetailResponse(post, user)).toList(); } @@ -101,11 +109,14 @@ public InfiniteResponse getPostsByCategory( Long newLastCursor = posts.isEmpty() ? null : posts.getLast().getId(); + log.info( + "[POST CATEGORY LIST] category={}, lastPostId={}, size={}", category, lastPostId, size); + return infiniteMapper.toInfiniteResponse(postResponseList, newLastCursor, hasNext, size); } @Override - @Transactional(readOnly = true) + @Transactional public PostDetailResponse getPostById(Long id) { User user = userService.getCurrentUser(); @@ -116,6 +127,14 @@ public PostDetailResponse getPostById(Long id) { post.increaseViews(); + post.increaseViews(); + + log.info( + "[POST DETAIL] postId={}, userId={}, views={}", + post.getId(), + user.getId(), + post.getViews()); + return postMapper.toDetailResponse(post, user); } @@ -164,6 +183,8 @@ public PostDetailResponse updatePost(Long id, PostRequest request, List Date: Sat, 13 Dec 2025 13:32:42 +0900 Subject: [PATCH 3/3] =?UTF-8?q?:recycle:Refactor:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=EA=B8=B0=EB=B0=98=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sku/refit/domain/comment/service/CommentServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/sku/refit/domain/comment/service/CommentServiceImpl.java b/src/main/java/com/sku/refit/domain/comment/service/CommentServiceImpl.java index edcef96..d7e4ea0 100644 --- a/src/main/java/com/sku/refit/domain/comment/service/CommentServiceImpl.java +++ b/src/main/java/com/sku/refit/domain/comment/service/CommentServiceImpl.java @@ -59,6 +59,9 @@ public CommentDetailResponse createComment(CommentRequest request, Long postId) commentRepository .findById(request.getParentCommentId()) .orElseThrow(() -> new CustomException(CommentErrorCode.COMMENT_NOT_FOUND)); + if (!parent.getPost().getId().equals(postId)) { + throw new CustomException(CommentErrorCode.COMMENT_NOT_FOUND); + } } Comment comment = commentMapper.toComment(request, parent, user, post);