Skip to content

Commit df78cd7

Browse files
authored
Merge pull request #454 from Team-0ops/develop
Develop
2 parents f320b50 + f06de34 commit df78cd7

7 files changed

Lines changed: 85 additions & 10 deletions

File tree

‎src/main/java/Oops/backend/domain/auth/dto/request/JoinDto.java‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,15 @@
22

33
import io.swagger.v3.oas.annotations.media.Schema;
44
import jakarta.validation.constraints.NotBlank;
5+
import lombok.AllArgsConstructor;
56
import lombok.Builder;
67
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
79

810
@Getter
911
@Builder
12+
@NoArgsConstructor
13+
@AllArgsConstructor
1014
public class JoinDto {
1115

1216
@Schema(description = "사용자 이메일", example = "test123@test.com")

‎src/main/java/Oops/backend/domain/comment/controller/CommentRestController.java‎

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import Oops.backend.common.status.SuccessStatus;
55
import Oops.backend.domain.auth.AuthenticatedUser;
66
import Oops.backend.domain.comment.dto.CommentRequestDto;
7+
import Oops.backend.domain.comment.entity.SortType;
78
import Oops.backend.domain.comment.service.CommentCommandService;
89
import Oops.backend.domain.comment.service.CommentQueryService;
910
import Oops.backend.domain.user.entity.User;
@@ -66,10 +67,14 @@ public ResponseEntity<BaseResponse> cheerComment(@PathVariable Long commentId,
6667

6768
@Operation(summary = "게시글에 대한 댓글 조회")
6869
@GetMapping("/post/{postId}/comments")
69-
public ResponseEntity<BaseResponse> getCommentsOfPost(@PathVariable Long postId,
70-
@Parameter(hidden = true)@AuthenticatedUser User user){
71-
72-
return BaseResponse.onSuccess(SuccessStatus._OK, commentQueryService.findCommentsOfPost(postId, user));
70+
public ResponseEntity<BaseResponse> getCommentsOfPost(
71+
@Parameter(name = "postId", description = "게시글 ID", required = true, example = "1")
72+
@PathVariable("postId") Long postId,
73+
@Parameter(hidden = true) @AuthenticatedUser User user,
74+
@Parameter(name = "sortType", description = "정렬 타입 (LIKE: 좋아요순, RECENT: 최신순)", required = true, example = "LIKE")
75+
@RequestParam("sortType") SortType sortType){
76+
77+
return BaseResponse.onSuccess(SuccessStatus._OK, commentQueryService.findCommentsOfPost(postId, user, sortType));
7378
}
7479

7580

‎src/main/java/Oops/backend/domain/comment/dto/CommentRequestDto.java‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package Oops.backend.domain.comment.dto;
22

33
import jakarta.validation.constraints.NotNull;
4+
import lombok.AllArgsConstructor;
45
import lombok.Builder;
56
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
68

79
public class CommentRequestDto {
810

911
@Getter
1012
@Builder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
1115
public static class LeaveCommentDto {
1216

1317
Long parentId;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package Oops.backend.domain.comment.entity;
2+
3+
public enum SortType {
4+
5+
LIKE,
6+
RECENT
7+
}

‎src/main/java/Oops/backend/domain/comment/repository/CommentRepository.java‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package Oops.backend.domain.comment.repository;
22

33
import Oops.backend.domain.comment.entity.Comment;
4+
import Oops.backend.domain.post.entity.Post;
45
import org.springframework.data.jpa.repository.JpaRepository;
56
import org.springframework.data.jpa.repository.Modifying;
67
import org.springframework.data.jpa.repository.Query;
78
import org.springframework.data.repository.query.Param;
89

10+
import java.util.List;
11+
912
public interface CommentRepository extends JpaRepository<Comment, Long> {
1013

1114
@Modifying
@@ -16,5 +19,17 @@ public interface CommentRepository extends JpaRepository<Comment, Long> {
1619
@Query("update Comment c set c.likes = c.likes-1 where c.id = :commentId")
1720
public void minusCommentLikes(@Param("commentId") Long commentId);
1821

22+
public List<Comment> findCommentByPostOrderByLikesDesc(Post post);
23+
24+
public List<Comment> findCommentByPostOrderByCreatedAtDesc(Post post);
25+
26+
// 일반 댓글만 좋아요순으로 조회 (좋아요가 같으면 최신순으로 정렬)
27+
List<Comment> findByPostAndParentIsNullOrderByLikesDescCreatedAtDesc(Post post);
28+
29+
// 일반 댓글만 최신순으로 조회
30+
List<Comment> findByPostAndParentIsNullOrderByCreatedAtDesc(Post post);
31+
32+
// 답글들을 최신순으로 조회
33+
List<Comment> findByPostAndParentIsNotNullOrderByCreatedAtDesc(Post post);
1934

2035
}

‎src/main/java/Oops/backend/domain/comment/service/CommentQueryService.java‎

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@
44
import Oops.backend.common.status.ErrorStatus;
55
import Oops.backend.domain.comment.dto.CommentResponse;
66
import Oops.backend.domain.comment.entity.Comment;
7+
import Oops.backend.domain.comment.entity.SortType;
78
import Oops.backend.domain.comment.repository.CommentRepository;
89
import Oops.backend.domain.post.entity.Post;
910
import Oops.backend.domain.post.service.PostQueryService;
1011
import Oops.backend.domain.user.entity.User;
1112
import lombok.RequiredArgsConstructor;
1213
import org.springframework.stereotype.Service;
14+
import org.springframework.transaction.annotation.Transactional;
1315

14-
import java.util.List;
16+
import java.util.*;
17+
import java.util.stream.Collectors;
1518

1619
@Service
1720
@RequiredArgsConstructor
@@ -29,15 +32,48 @@ public Comment findComment(Long commentId){
2932
return comment;
3033
}
3134

32-
public List<CommentResponse> findCommentsOfPost(Long postId, User user){
35+
@Transactional
36+
public List<CommentResponse> findCommentsOfPost(Long postId, User user, SortType sortType){
3337

3438
Post post = postQueryService.findPost(postId);
3539

36-
List<CommentResponse> comments = post.getComments().stream()
37-
.map((comment) -> CommentResponse.of(comment, commentLikeService.existsCommentLike(comment, user)))
38-
.toList();
40+
// 1. 일반 댓글(parent가 null) 조회 및 정렬
41+
List<Comment> parentComments;
42+
if (sortType == SortType.LIKE) {
43+
// 좋아요순 정렬 (좋아요가 같으면 최신순으로 2차 정렬)
44+
parentComments = commentRepository.findByPostAndParentIsNullOrderByLikesDescCreatedAtDesc(post);
45+
} else {
46+
// 최신순 정렬
47+
parentComments = commentRepository.findByPostAndParentIsNullOrderByCreatedAtDesc(post);
48+
}
3949

40-
return comments;
50+
// 2. 모든 답글 조회 (parent가 null이 아님) - 이미 최신순으로 정렬됨
51+
List<Comment> allReplyComments = commentRepository.findByPostAndParentIsNotNullOrderByCreatedAtDesc(post);
52+
53+
// 3. 답글을 parentId별로 그룹화 (Map<parentId, List<답글>>)
54+
// 답글들은 이미 최신순으로 정렬되어 있으므로 그대로 사용
55+
Map<Long, List<Comment>> repliesByParentId = allReplyComments.stream()
56+
.collect(Collectors.groupingBy(
57+
reply -> reply.getParent().getId(),
58+
Collectors.toList()
59+
));
60+
61+
// 4. 일반 댓글과 그 답글들을 순서대로 변환
62+
// 결과: [댓글1, 댓글1-답글1, 댓글1-답글2, 댓글2, 댓글2-답글1, 댓글3, ...]
63+
List<CommentResponse> result = new ArrayList<>();
64+
65+
for (Comment parentComment : parentComments) {
66+
// 일반 댓글 추가
67+
result.add(CommentResponse.of(parentComment, commentLikeService.existsCommentLike(parentComment, user)));
68+
69+
// 해당 일반 댓글의 답글들 추가 (이미 최신순으로 정렬되어 있음)
70+
List<Comment> replies = repliesByParentId.getOrDefault(parentComment.getId(), Collections.emptyList());
71+
for (Comment reply : replies) {
72+
result.add(CommentResponse.of(reply, commentLikeService.existsCommentLike(reply, user)));
73+
}
74+
}
75+
76+
return result;
4177
}
4278

4379

‎src/main/java/Oops/backend/domain/user/dto/request/LoginDto.java‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44
import jakarta.validation.constraints.Email;
55
import jakarta.validation.constraints.NotBlank;
66
import jakarta.validation.constraints.Pattern;
7+
import lombok.AllArgsConstructor;
78
import lombok.Builder;
89
import lombok.Getter;
10+
import lombok.NoArgsConstructor;
911

1012
@Builder
1113
@Getter
14+
@NoArgsConstructor
15+
@AllArgsConstructor
1216
public class LoginDto {
1317

1418
@Schema(description = "사용자 이메일", example = "test123@test.com")

0 commit comments

Comments
 (0)