From 37d454b9f5359dba0d6e6785de245f43a9344d52 Mon Sep 17 00:00:00 2001 From: Minjae Chung Date: Sun, 22 Feb 2026 17:53:55 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[feat]=20posts=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EC=88=98(view=5Fcount)=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../daramg/server/post/application/PostQueryService.java | 2 ++ src/main/java/com/daramg/server/post/domain/Post.java | 7 +++++++ .../com/daramg/server/post/dto/PostDetailResponse.java | 2 ++ .../resources/db/migration/V7__add_view_count_to_posts.sql | 1 + 4 files changed, 12 insertions(+) create mode 100644 src/main/resources/db/migration/V7__add_view_count_to_posts.sql diff --git a/src/main/java/com/daramg/server/post/application/PostQueryService.java b/src/main/java/com/daramg/server/post/application/PostQueryService.java index 7a21cd4..60b6149 100644 --- a/src/main/java/com/daramg/server/post/application/PostQueryService.java +++ b/src/main/java/com/daramg/server/post/application/PostQueryService.java @@ -125,8 +125,10 @@ public PageResponseDto getUserScrappedPosts(Long userId, PageRe ); } + @Transactional public PostDetailResponse getPostById(Long postId, User user) { Post post = entityUtils.getEntity(postId, Post.class); + post.incrementViewCount(); Boolean isLiked = user != null ? postLikeRepository.existsByPostIdAndUserId(postId, user.getId()) : null; Boolean isScrapped = user != null ? postScrapRepository.existsByPostIdAndUserId(postId, user.getId()) : null; List comments = commentRepository.findByPostIdAndIsBlockedFalseOrderByCreatedAtAsc(postId); diff --git a/src/main/java/com/daramg/server/post/domain/Post.java b/src/main/java/com/daramg/server/post/domain/Post.java index c1b5db7..8536703 100644 --- a/src/main/java/com/daramg/server/post/domain/Post.java +++ b/src/main/java/com/daramg/server/post/domain/Post.java @@ -53,6 +53,9 @@ public abstract class Post extends BaseEntity { @Column(name = "comment_count", nullable = false) private int commentCount = 0; + @Column(name = "view_count", nullable = false) + private int viewCount = 0; + @Column(name = "is_blocked", nullable = false) private boolean isBlocked = false; @@ -133,6 +136,10 @@ public void incrementCommentCount(){ commentCount++; } + public void incrementViewCount(){ + viewCount++; + } + public void softDelete() { if (this.isDeleted) return; diff --git a/src/main/java/com/daramg/server/post/dto/PostDetailResponse.java b/src/main/java/com/daramg/server/post/dto/PostDetailResponse.java index 0e6b3dd..f7f0271 100644 --- a/src/main/java/com/daramg/server/post/dto/PostDetailResponse.java +++ b/src/main/java/com/daramg/server/post/dto/PostDetailResponse.java @@ -26,6 +26,7 @@ public record PostDetailResponse( PostStatus postStatus, int likeCount, int commentCount, + int viewCount, boolean isBlocked, LocalDateTime createdAt, LocalDateTime updatedAt, @@ -76,6 +77,7 @@ public static PostDetailResponse from(Post post, Boolean isLiked, Boolean isScra post.getPostStatus(), post.getLikeCount(), post.getCommentCount(), + post.getViewCount(), post.isBlocked(), post.getCreatedAt(), post.getUpdatedAt(), diff --git a/src/main/resources/db/migration/V7__add_view_count_to_posts.sql b/src/main/resources/db/migration/V7__add_view_count_to_posts.sql new file mode 100644 index 0000000..770874d --- /dev/null +++ b/src/main/resources/db/migration/V7__add_view_count_to_posts.sql @@ -0,0 +1 @@ +ALTER TABLE posts ADD COLUMN view_count INT NOT NULL DEFAULT 0; From 453a60dda22b9c4f921a4c9384f575097a2fe4c3 Mon Sep 17 00:00:00 2001 From: Minjae Chung Date: Sun, 22 Feb 2026 17:59:19 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[fix]=20PostDetailResponse=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=97=90=20viewCount=20=EC=9D=B8=EC=88=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../daramg/server/post/presentation/PostQueryControllerTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/com/daramg/server/post/presentation/PostQueryControllerTest.java b/src/test/java/com/daramg/server/post/presentation/PostQueryControllerTest.java index c478b2b..37597c9 100644 --- a/src/test/java/com/daramg/server/post/presentation/PostQueryControllerTest.java +++ b/src/test/java/com/daramg/server/post/presentation/PostQueryControllerTest.java @@ -664,6 +664,7 @@ public class PostQueryControllerTest extends ControllerTestSupport { PostStatus.PUBLISHED, 10, 5, + 0, false, createdAt, updatedAt, From 97bb605e22bae884505d3c63bc10db2be7d0db5b Mon Sep 17 00:00:00 2001 From: Minjae Chung Date: Sun, 22 Feb 2026 18:07:48 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[fix]=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20REST=20Docs=EC=97=90?= =?UTF-8?q?=20viewCount=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../daramg/server/post/presentation/PostQueryControllerTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/com/daramg/server/post/presentation/PostQueryControllerTest.java b/src/test/java/com/daramg/server/post/presentation/PostQueryControllerTest.java index 37597c9..6d2dd67 100644 --- a/src/test/java/com/daramg/server/post/presentation/PostQueryControllerTest.java +++ b/src/test/java/com/daramg/server/post/presentation/PostQueryControllerTest.java @@ -705,6 +705,7 @@ public class PostQueryControllerTest extends ControllerTestSupport { fieldWithPath("postStatus").type(JsonFieldType.STRING).description("포스트 상태 (PUBLISHED, DRAFT)"), fieldWithPath("likeCount").type(JsonFieldType.NUMBER).description("좋아요 개수"), fieldWithPath("commentCount").type(JsonFieldType.NUMBER).description("댓글 개수"), + fieldWithPath("viewCount").type(JsonFieldType.NUMBER).description("조회수"), fieldWithPath("isBlocked").type(JsonFieldType.BOOLEAN).description("포스트 블락 여부"), fieldWithPath("createdAt").type(JsonFieldType.STRING).description("생성일시 (ISO 8601 형식)"), fieldWithPath("updatedAt").type(JsonFieldType.STRING).description("수정일시 (ISO 8601 형식)"),