From 053bb289c0ab5ed0c7387519f1e0f0eccf558981 Mon Sep 17 00:00:00 2001 From: nohy6630 Date: Tue, 28 May 2024 15:58:30 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20exception=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/context/CustomExceptionContext.java | 2 ++ .../notfound/NotFoundArticleLikeException.java | 13 +++++++++++++ .../notfound/NotFoundCommentLikeException.java | 11 +++++++++++ 3 files changed, 26 insertions(+) create mode 100644 daepiro-common/src/main/java/com/numberone/backend/exception/notfound/NotFoundArticleLikeException.java create mode 100644 daepiro-common/src/main/java/com/numberone/backend/exception/notfound/NotFoundCommentLikeException.java diff --git a/daepiro-common/src/main/java/com/numberone/backend/exception/context/CustomExceptionContext.java b/daepiro-common/src/main/java/com/numberone/backend/exception/context/CustomExceptionContext.java index d05dc48..7bbe795 100644 --- a/daepiro-common/src/main/java/com/numberone/backend/exception/context/CustomExceptionContext.java +++ b/daepiro-common/src/main/java/com/numberone/backend/exception/context/CustomExceptionContext.java @@ -42,6 +42,7 @@ public enum CustomExceptionContext implements ExceptionContext { // article 관련 예외 NOT_FOUND_ARTICLE("해당 게시글을 찾을 수 없습니다.", 8000), + NOT_FOUND_ARTICLE_LIKE("해당 게시글의 좋아요를 찾을 수 없습니다.", 8001), // article image 관련 예외 NOT_FOUND_ARTICLE_IMAGE("해당 이미지를 찾을 수 없습니다.", 9000), @@ -49,6 +50,7 @@ public enum CustomExceptionContext implements ExceptionContext { // comment 관련 예외 NOT_FOUND_COMMENT("해당 댓글을 찾을 수 없습니다.", 10000), + NOT_FOUND_COMMENT_LIKE("해당 댓글의 좋아요를 찾을 수 없습니다.", 10001), // like 관련 예외 ALREADY_LIKED_ERROR("이미 좋아요 처리된 엔티티입니다.", 11000), diff --git a/daepiro-common/src/main/java/com/numberone/backend/exception/notfound/NotFoundArticleLikeException.java b/daepiro-common/src/main/java/com/numberone/backend/exception/notfound/NotFoundArticleLikeException.java new file mode 100644 index 0000000..31e5f39 --- /dev/null +++ b/daepiro-common/src/main/java/com/numberone/backend/exception/notfound/NotFoundArticleLikeException.java @@ -0,0 +1,13 @@ +package com.numberone.backend.exception.notfound; + + +import com.numberone.backend.exception.context.CustomExceptionContext; +import com.numberone.backend.exception.context.ExceptionContext; + +import static com.numberone.backend.exception.context.CustomExceptionContext.NOT_FOUND_ARTICLE_LIKE; + +public class NotFoundArticleLikeException extends NotFoundException { + public NotFoundArticleLikeException() { + super(NOT_FOUND_ARTICLE_LIKE); + } +} diff --git a/daepiro-common/src/main/java/com/numberone/backend/exception/notfound/NotFoundCommentLikeException.java b/daepiro-common/src/main/java/com/numberone/backend/exception/notfound/NotFoundCommentLikeException.java new file mode 100644 index 0000000..fa99424 --- /dev/null +++ b/daepiro-common/src/main/java/com/numberone/backend/exception/notfound/NotFoundCommentLikeException.java @@ -0,0 +1,11 @@ +package com.numberone.backend.exception.notfound; + +import com.numberone.backend.exception.context.ExceptionContext; + +import static com.numberone.backend.exception.context.CustomExceptionContext.NOT_FOUND_COMMENT_LIKE; + +public class NotFoundCommentLikeException extends NotFoundException{ + public NotFoundCommentLikeException() { + super(NOT_FOUND_COMMENT_LIKE); + } +} From 665e753ac33776f7b34794f74eb361c5b0811691 Mon Sep 17 00:00:00 2001 From: nohy6630 Date: Wed, 29 May 2024 03:19:36 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20=EC=A2=8B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20repository=20method=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/like/service/LikeService.java | 69 ++++++++----------- .../domain/article/entity/Article.java | 13 +++- .../repository/ArticleLikeRepository.java | 4 +- .../repository/CommentLikeRepository.java | 5 ++ 4 files changed, 47 insertions(+), 44 deletions(-) diff --git a/daepiro-api/src/main/java/com/numberone/backend/domain/like/service/LikeService.java b/daepiro-api/src/main/java/com/numberone/backend/domain/like/service/LikeService.java index 880d2cf..58b1f06 100644 --- a/daepiro-api/src/main/java/com/numberone/backend/domain/like/service/LikeService.java +++ b/daepiro-api/src/main/java/com/numberone/backend/domain/like/service/LikeService.java @@ -13,12 +13,10 @@ import com.numberone.backend.domain.notification.entity.NotificationEntity; import com.numberone.backend.domain.notification.entity.NotificationTag; import com.numberone.backend.domain.notification.repository.NotificationRepository; +import com.numberone.backend.exception.notfound.*; import com.numberone.backend.provider.security.SecurityContextProvider; import com.numberone.backend.exception.conflict.AlreadyLikedException; import com.numberone.backend.exception.conflict.AlreadyUnLikedException; -import com.numberone.backend.exception.notfound.NotFoundApiException; -import com.numberone.backend.exception.notfound.NotFoundCommentException; -import com.numberone.backend.exception.notfound.NotFoundMemberException; import com.numberone.backend.provider.fcm.service.FcmMessageProvider; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -45,15 +43,14 @@ public class LikeService { @Transactional public Integer increaseArticleLike(Long articleId) { - long principal = SecurityContextProvider.getAuthenticatedUserId(); - Member member = memberRepository.findById(principal) + Long memberId = SecurityContextProvider.getAuthenticatedUserId(); + Member member = memberRepository.findById(memberId) .orElseThrow(NotFoundMemberException::new); Article article = articleRepository.findById(articleId) .orElseThrow(NotFoundApiException::new); - if (isAlreadyLikedArticle(member, articleId)) { - // 이미 좋아요를 누른 게시글입니다. + + if (isAlreadyLikedArticle(memberId, articleId)) throw new AlreadyLikedException(); - } article.increaseLikeCount(); articleLikeRepository.save(new ArticleLike(member, article)); @@ -75,38 +72,33 @@ public Integer increaseArticleLike(Long articleId) { @Transactional public Integer decreaseArticleLike(Long articleId) { - long principal = SecurityContextProvider.getAuthenticatedUserId(); - Member member = memberRepository.findById(principal) + Long memberId = SecurityContextProvider.getAuthenticatedUserId(); + Member member = memberRepository.findById(memberId) .orElseThrow(NotFoundMemberException::new); Article article = articleRepository.findById(articleId) .orElseThrow(NotFoundApiException::new); - if (!isAlreadyLikedArticle(member, articleId)) { - // 좋아요를 누르지 않은 게시글이라 취소할 수 없습니다. + if (!isAlreadyLikedArticle(member.getId(), articleId)) throw new AlreadyUnLikedException(); - } - article.decreaseLikeCount(); // 사용자의 게시글 좋아요 목록에서 제거 - List articleLikeList = articleLikeRepository.findByMember(member); - articleLikeList.forEach(articleLike -> { - if (articleLike.getArticleId().equals(articleId)) - articleLikeRepository.delete(articleLike); - }); + article.decreaseLikeCount(); + ArticleLike articleLike = articleLikeRepository.findByMemberIdAndArticleId(memberId, articleId) + .orElseThrow(NotFoundArticleLikeException::new); + articleLikeRepository.delete(articleLike); return article.getLikeCount(); } @Transactional public Integer increaseCommentLike(Long commentId) { - long principal = SecurityContextProvider.getAuthenticatedUserId(); - Member member = memberRepository.findById(principal) + Long memberId = SecurityContextProvider.getAuthenticatedUserId(); + Member member = memberRepository.findById(memberId) .orElseThrow(NotFoundMemberException::new); CommentEntity commentEntity = commentRepository.findById(commentId) .orElseThrow(NotFoundCommentException::new); - if (isAlreadyLikedComment(member, commentId)) { - // 이미 좋아요를 누른 댓글입니다. + if (isAlreadyLikedComment(member.getId(), commentId)) throw new AlreadyLikedException(); - } + commentEntity.increaseLikeCount(); commentLikeRepository.save(new CommentLike(member, commentEntity)); @@ -129,34 +121,27 @@ public Integer increaseCommentLike(Long commentId) { @Transactional public Integer decreaseCommentLike(Long commentId) { - long principal = SecurityContextProvider.getAuthenticatedUserId(); - Member member = memberRepository.findById(principal) + long memberId = SecurityContextProvider.getAuthenticatedUserId(); + Member member = memberRepository.findById(memberId) .orElseThrow(NotFoundMemberException::new); CommentEntity commentEntity = commentRepository.findById(commentId) .orElseThrow(NotFoundCommentException::new); - if (!isAlreadyLikedComment(member, commentId)) { - // 좋아요를 누르지 않은 댓글이라 좋아요를 취소할 수 없습니다. + if (!isAlreadyLikedComment(member.getId(), commentId)) throw new AlreadyUnLikedException(); - } + commentEntity.decreaseLikeCount(); - // 사용자의 댓글 좋아요 목록에서 제거 - List commentLikeList = commentLikeRepository.findByMember(member); - commentLikeList.forEach(commentLike -> { - if (commentLike.getCommentId().equals(commentId)) - commentLikeRepository.delete(commentLike); - }); + CommentLike commentLike = commentLikeRepository.findByMemberIdAndCommentId(memberId, commentId) + .orElseThrow(NotFoundCommentLikeException::new); + commentLikeRepository.delete(commentLike); return commentEntity.getLikeCount(); } - private boolean isAlreadyLikedArticle(Member member, Long articleId) { - return articleLikeRepository.findByMember(member).stream() - .anyMatch(articleLike -> articleLike.getArticleId().equals(articleId)); + private boolean isAlreadyLikedArticle(Long memberId, Long articleId) { + return articleLikeRepository.existsByMemberIdAndArticleId(memberId, articleId); } - private boolean isAlreadyLikedComment(Member member, Long commentId) { - return commentLikeRepository.findByMember(member).stream() - .anyMatch(commentLike -> commentLike.getCommentId().equals(commentId)); + private boolean isAlreadyLikedComment(Long memberId, Long commentId) { + return commentLikeRepository.existsByMemberIdAndCommentId(memberId, commentId); } - } diff --git a/daepiro-core/src/main/java/com/numberone/backend/domain/article/entity/Article.java b/daepiro-core/src/main/java/com/numberone/backend/domain/article/entity/Article.java index c0bee56..a9f7184 100644 --- a/daepiro-core/src/main/java/com/numberone/backend/domain/article/entity/Article.java +++ b/daepiro-core/src/main/java/com/numberone/backend/domain/article/entity/Article.java @@ -6,6 +6,7 @@ import com.numberone.backend.domain.comment.entity.CommentEntity; import jakarta.persistence.*; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.ColumnDefault; @@ -70,6 +71,7 @@ public class Article extends BaseTimeEntity { @Comment("작성자 ID") private Long articleOwnerId; + @Builder public Article(String title, String content, Long articleOwnerId, ArticleTag tag) { this.title = title; this.content = content; @@ -98,7 +100,7 @@ public void updateAddress(String address) { this.address = address; } - public void updateAddressDetail (String[] addressDetails) { + public void updateAddressDetail(String[] addressDetails) { int length = addressDetails.length; this.lv1 = length > 0 ? addressDetails[0] : ""; this.lv2 = length > 1 ? addressDetails[1] : ""; @@ -115,4 +117,13 @@ public void decreaseLikeCount() { } } + public static Article of(String title, String content, Long articleOwnerId, ArticleTag tag) { + return Article.builder() + .title(title) + .content(content) + .articleOwnerId(articleOwnerId) + .tag(tag) + .build(); + } + } diff --git a/daepiro-core/src/main/java/com/numberone/backend/domain/like/repository/ArticleLikeRepository.java b/daepiro-core/src/main/java/com/numberone/backend/domain/like/repository/ArticleLikeRepository.java index 390e5ec..2a38754 100644 --- a/daepiro-core/src/main/java/com/numberone/backend/domain/like/repository/ArticleLikeRepository.java +++ b/daepiro-core/src/main/java/com/numberone/backend/domain/like/repository/ArticleLikeRepository.java @@ -5,9 +5,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface ArticleLikeRepository extends JpaRepository { - List findByMember(Member member); + Optional findByMemberIdAndArticleId(Long memberId, Long articleId); + boolean existsByMemberIdAndArticleId(Long memberId, Long articleId); } diff --git a/daepiro-core/src/main/java/com/numberone/backend/domain/like/repository/CommentLikeRepository.java b/daepiro-core/src/main/java/com/numberone/backend/domain/like/repository/CommentLikeRepository.java index c6ee3d8..fe1dbd1 100644 --- a/daepiro-core/src/main/java/com/numberone/backend/domain/like/repository/CommentLikeRepository.java +++ b/daepiro-core/src/main/java/com/numberone/backend/domain/like/repository/CommentLikeRepository.java @@ -1,11 +1,16 @@ package com.numberone.backend.domain.like.repository; +import com.numberone.backend.domain.like.entity.ArticleLike; import com.numberone.backend.domain.like.entity.CommentLike; import com.numberone.backend.domain.member.entity.Member; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface CommentLikeRepository extends JpaRepository { List findByMember(Member member); + Optional findByMemberIdAndCommentId(Long memberId, Long commentId); + + boolean existsByMemberIdAndCommentId(Long memberId, Long commentId); } From 817599f0c7a5b061e629ab5fe0aa82349019a2b7 Mon Sep 17 00:00:00 2001 From: nohy6630 Date: Wed, 29 May 2024 03:20:03 +0900 Subject: [PATCH 3/5] =?UTF-8?q?test:=20=EC=A2=8B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/like/service/LikeServiceTest.java | 218 ++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 daepiro-api/src/test/java/com/numberone/backend/domain/like/service/LikeServiceTest.java diff --git a/daepiro-api/src/test/java/com/numberone/backend/domain/like/service/LikeServiceTest.java b/daepiro-api/src/test/java/com/numberone/backend/domain/like/service/LikeServiceTest.java new file mode 100644 index 0000000..2e85f72 --- /dev/null +++ b/daepiro-api/src/test/java/com/numberone/backend/domain/like/service/LikeServiceTest.java @@ -0,0 +1,218 @@ +package com.numberone.backend.domain.like.service; + +import com.numberone.backend.domain.article.entity.Article; +import com.numberone.backend.domain.article.entity.ArticleTag; +import com.numberone.backend.domain.article.repository.ArticleRepository; +import com.numberone.backend.domain.comment.entity.CommentEntity; +import com.numberone.backend.domain.comment.repository.CommentRepository; +import com.numberone.backend.domain.like.entity.ArticleLike; +import com.numberone.backend.domain.like.entity.CommentLike; +import com.numberone.backend.domain.like.repository.ArticleLikeRepository; +import com.numberone.backend.domain.like.repository.CommentLikeRepository; +import com.numberone.backend.domain.member.entity.Member; +import com.numberone.backend.domain.member.repository.MemberRepository; +import com.numberone.backend.domain.notification.repository.NotificationRepository; +import com.numberone.backend.provider.fcm.service.FcmMessageProvider; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class LikeServiceTest { + @InjectMocks + private LikeService likeService; + @Mock + private ArticleLikeRepository articleLikeRepository; + @Mock + private ArticleRepository articleRepository; + @Mock + private MemberRepository memberRepository; + @Mock + private FcmMessageProvider fcmMessageProvider; + @Mock + private NotificationRepository notificationRepository; + @Mock + private CommentRepository commentRepository; + @Mock + private CommentLikeRepository commentLikeRepository; + + private Member loginMember; + + @BeforeEach + void setUp() { + setAuthentication(); + } + + @AfterEach + void tearDown() { + clearAuthentication(); + } + + @Test + @DisplayName("게시글의 좋아요를 설정한다") + void increaseArticleLike() { + // given + Member articleOwner = getDummyArticleOwner(); + given(articleOwner.getFcmToken()) + .willReturn("fcmToken123"); + given(memberRepository.findById(articleOwner.getId())) + .willReturn(Optional.of(articleOwner)); + + Article article = getDummyArticle(articleOwner); + given(article.getId()) + .willReturn(1L); + given(articleRepository.findById(article.getId())) + .willReturn(Optional.of(article)); + + //when + likeService.increaseArticleLike(article.getId()); + + // then + assertThat(article.getLikeCount()).isEqualTo(1); + verify(articleLikeRepository, times(1)).save(any()); + verify(fcmMessageProvider, times(1)).sendFcm(eq(articleOwner.getFcmToken()), any(), any()); + verify(notificationRepository, times(1)).save(any()); + } + + @Test + @DisplayName("게시글의 좋아요를 취소한다") + void decreaseArticleLike() { + // given + Member articleOwner = getDummyArticleOwner(); + + Article article = getDummyArticle(articleOwner); + article.increaseLikeCount(); + article.increaseLikeCount(); + given(article.getId()) + .willReturn(1L); + given(articleRepository.findById(article.getId())) + .willReturn(Optional.of(article)); + + ArticleLike articleLike = new ArticleLike(loginMember, article); + given(articleLikeRepository.existsByMemberIdAndArticleId(loginMember.getId(), article.getId())) + .willReturn(true); + given(articleLikeRepository.findByMemberIdAndArticleId(loginMember.getId(), article.getId())) + .willReturn(Optional.of(articleLike)); + + //when + likeService.decreaseArticleLike(article.getId()); + + // then + assertThat(article.getLikeCount()).isEqualTo(1); + verify(articleLikeRepository, times(1)).delete(any()); + } + + @Test + @DisplayName("댓글의 좋아요를 설정한다") + void increaseCommentLike() { + //given + Member articleOwner = getDummyArticleOwner(); + + Article article = getDummyArticle(articleOwner); + + Member commentOwner = getDummyCommentOwner(); + given(memberRepository.findById(commentOwner.getId())) + .willReturn(Optional.of(commentOwner)); + given(commentOwner.getFcmToken()) + .willReturn("fcmToken123"); + + CommentEntity commentEntity = getDummyComment(article, commentOwner); + given(commentEntity.getId()) + .willReturn(1L); + given(commentRepository.findById(commentEntity.getId())) + .willReturn(Optional.of(commentEntity)); + + //when + likeService.increaseCommentLike(commentEntity.getId()); + + //then + assertThat(commentEntity.getLikeCount()).isEqualTo(1); + verify(commentLikeRepository, times(1)).save(any()); + verify(fcmMessageProvider, times(1)).sendFcm(eq(commentOwner.getFcmToken()), any(), any()); + verify(notificationRepository, times(1)).save(any()); + } + + @Test + @DisplayName("댓글의 좋아요를 취소한다") + void decreaseCommentLike() { + //given + Member articleOwner = getDummyArticleOwner(); + + Article article = getDummyArticle(articleOwner); + + Member commentOwner = getDummyCommentOwner(); + + CommentEntity commentEntity = getDummyComment(article, commentOwner); + commentEntity.increaseLikeCount(); + commentEntity.increaseLikeCount(); + given(commentEntity.getId()) + .willReturn(1L); + given(commentRepository.findById(commentEntity.getId())) + .willReturn(Optional.of(commentEntity)); + + CommentLike commentLike = new CommentLike(loginMember, commentEntity); + given(commentLikeRepository.existsByMemberIdAndCommentId(loginMember.getId(), commentEntity.getId())) + .willReturn(true); + given(commentLikeRepository.findByMemberIdAndCommentId(loginMember.getId(), commentEntity.getId())) + .willReturn(Optional.of(commentLike)); + + //when + likeService.decreaseCommentLike(commentEntity.getId()); + + //then + assertThat(commentEntity.getLikeCount()).isEqualTo(1); + verify(commentLikeRepository, times(1)).delete(any()); + } + + private Member getDummyCommentOwner() { + Member commentOwner = spy(Member.ofKakao(3456L)); + given(commentOwner.getId()) + .willReturn(3L); + return commentOwner; + } + + private Member getDummyArticleOwner() { + Member articleOwner = spy(Member.ofKakao(2345L)); + given(articleOwner.getId()) + .willReturn(2L); + return articleOwner; + } + + private Article getDummyArticle(Member articleOwner) { + return spy(Article.of("title1", "content1", articleOwner.getId(), ArticleTag.LIFE)); + } + + private CommentEntity getDummyComment(Article article, Member commentOwner) { + return spy(new CommentEntity("hello", article, commentOwner)); + } + + private void setAuthentication() { + loginMember = spy(Member.ofKakao(1234L)); + given(loginMember.getId()) + .willReturn(1L); + given(memberRepository.findById(loginMember.getId())) + .willReturn(Optional.of(loginMember)); + + Authentication authentication = UsernamePasswordAuthenticationToken.authenticated(loginMember.getId(), null, null); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + + private void clearAuthentication() { + SecurityContextHolder.clearContext(); + } +} \ No newline at end of file From 4978fa213a0fb0c4ddafbf8c0e9f440d1df15672 Mon Sep 17 00:00:00 2001 From: nohy6630 Date: Wed, 29 May 2024 18:11:31 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactor:=20=EC=A2=8B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20entity=20=EC=A0=95=EC=A0=81=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/article/service/ArticleService.java | 2 +- .../domain/comment/service/CommentService.java | 2 +- .../backend/domain/like/service/LikeService.java | 4 ++-- .../backend/domain/like/service/LikeServiceTest.java | 6 +++--- .../backend/domain/comment/entity/CommentEntity.java | 11 ++++++++++- .../backend/domain/like/entity/ArticleLike.java | 11 ++++++++++- .../backend/domain/like/entity/CommentLike.java | 11 ++++++++++- 7 files changed, 37 insertions(+), 10 deletions(-) diff --git a/daepiro-api/src/main/java/com/numberone/backend/domain/article/service/ArticleService.java b/daepiro-api/src/main/java/com/numberone/backend/domain/article/service/ArticleService.java index a6773ba..040d98a 100644 --- a/daepiro-api/src/main/java/com/numberone/backend/domain/article/service/ArticleService.java +++ b/daepiro-api/src/main/java/com/numberone/backend/domain/article/service/ArticleService.java @@ -219,7 +219,7 @@ public CreateCommentResponse createComment(Long articleId, CreateCommentRequest Article article = articleRepository.findById(articleId) .orElseThrow(NotFoundArticleException::new); CommentEntity savedComment = commentRepository.save( - new CommentEntity(request.getContent(), article, member) + CommentEntity.of(request.getContent(), article, member) ); Member articleOwner = memberRepository.findById(article.getArticleOwnerId()) .orElseThrow(NotFoundMemberException::new); diff --git a/daepiro-api/src/main/java/com/numberone/backend/domain/comment/service/CommentService.java b/daepiro-api/src/main/java/com/numberone/backend/domain/comment/service/CommentService.java index ab9d268..1dfb969 100644 --- a/daepiro-api/src/main/java/com/numberone/backend/domain/comment/service/CommentService.java +++ b/daepiro-api/src/main/java/com/numberone/backend/domain/comment/service/CommentService.java @@ -57,7 +57,7 @@ public CreateChildCommentResponse createChildComment( CommentEntity parentComment = commentRepository.findById(parentCommentId) .orElseThrow(NotFoundCommentException::new); - CommentEntity childComment = commentRepository.save(new CommentEntity(request.getContent(), article, member)); + CommentEntity childComment = commentRepository.save(CommentEntity.of(request.getContent(), article, member)); childComment.updateParent(parentComment); articleParticipantRepository.save(new ArticleParticipant(article, member)); diff --git a/daepiro-api/src/main/java/com/numberone/backend/domain/like/service/LikeService.java b/daepiro-api/src/main/java/com/numberone/backend/domain/like/service/LikeService.java index 58b1f06..255afed 100644 --- a/daepiro-api/src/main/java/com/numberone/backend/domain/like/service/LikeService.java +++ b/daepiro-api/src/main/java/com/numberone/backend/domain/like/service/LikeService.java @@ -52,7 +52,7 @@ public Integer increaseArticleLike(Long articleId) { if (isAlreadyLikedArticle(memberId, articleId)) throw new AlreadyLikedException(); article.increaseLikeCount(); - articleLikeRepository.save(new ArticleLike(member, article)); + articleLikeRepository.save(ArticleLike.of(member, article)); Long ownerId = article.getArticleOwnerId(); Member owner = memberRepository.findById(ownerId) @@ -100,7 +100,7 @@ public Integer increaseCommentLike(Long commentId) { throw new AlreadyLikedException(); commentEntity.increaseLikeCount(); - commentLikeRepository.save(new CommentLike(member, commentEntity)); + commentLikeRepository.save(CommentLike.of(member, commentEntity)); Long ownerId = commentEntity.getAuthorId(); diff --git a/daepiro-api/src/test/java/com/numberone/backend/domain/like/service/LikeServiceTest.java b/daepiro-api/src/test/java/com/numberone/backend/domain/like/service/LikeServiceTest.java index 2e85f72..bfc8130 100644 --- a/daepiro-api/src/test/java/com/numberone/backend/domain/like/service/LikeServiceTest.java +++ b/daepiro-api/src/test/java/com/numberone/backend/domain/like/service/LikeServiceTest.java @@ -103,7 +103,7 @@ void decreaseArticleLike() { given(articleRepository.findById(article.getId())) .willReturn(Optional.of(article)); - ArticleLike articleLike = new ArticleLike(loginMember, article); + ArticleLike articleLike = ArticleLike.of(loginMember, article); given(articleLikeRepository.existsByMemberIdAndArticleId(loginMember.getId(), article.getId())) .willReturn(true); given(articleLikeRepository.findByMemberIdAndArticleId(loginMember.getId(), article.getId())) @@ -165,7 +165,7 @@ void decreaseCommentLike() { given(commentRepository.findById(commentEntity.getId())) .willReturn(Optional.of(commentEntity)); - CommentLike commentLike = new CommentLike(loginMember, commentEntity); + CommentLike commentLike = CommentLike.of(loginMember, commentEntity); given(commentLikeRepository.existsByMemberIdAndCommentId(loginMember.getId(), commentEntity.getId())) .willReturn(true); given(commentLikeRepository.findByMemberIdAndCommentId(loginMember.getId(), commentEntity.getId())) @@ -198,7 +198,7 @@ private Article getDummyArticle(Member articleOwner) { } private CommentEntity getDummyComment(Article article, Member commentOwner) { - return spy(new CommentEntity("hello", article, commentOwner)); + return spy(CommentEntity.of("hello", article, commentOwner)); } private void setAuthentication() { diff --git a/daepiro-core/src/main/java/com/numberone/backend/domain/comment/entity/CommentEntity.java b/daepiro-core/src/main/java/com/numberone/backend/domain/comment/entity/CommentEntity.java index 24978a8..594586f 100644 --- a/daepiro-core/src/main/java/com/numberone/backend/domain/comment/entity/CommentEntity.java +++ b/daepiro-core/src/main/java/com/numberone/backend/domain/comment/entity/CommentEntity.java @@ -5,6 +5,7 @@ import com.numberone.backend.domain.member.entity.Member; import jakarta.persistence.*; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.Comment; @@ -46,7 +47,8 @@ public class CommentEntity extends BaseTimeEntity { @OneToMany(mappedBy = "parent", orphanRemoval = true) private List childs = new ArrayList<>(); - public CommentEntity(String content, Article article, Member author) { + @Builder + private CommentEntity(String content, Article article, Member author) { this.depth = 0; this.content = content; this.article = article; @@ -68,4 +70,11 @@ public void decreaseLikeCount() { } } + public static CommentEntity of(String content, Article article, Member author) { + return CommentEntity.builder() + .content(content) + .article(article) + .author(author) + .build(); + } } diff --git a/daepiro-core/src/main/java/com/numberone/backend/domain/like/entity/ArticleLike.java b/daepiro-core/src/main/java/com/numberone/backend/domain/like/entity/ArticleLike.java index 53f0dbe..00a1cf8 100644 --- a/daepiro-core/src/main/java/com/numberone/backend/domain/like/entity/ArticleLike.java +++ b/daepiro-core/src/main/java/com/numberone/backend/domain/like/entity/ArticleLike.java @@ -5,6 +5,7 @@ import com.numberone.backend.domain.member.entity.Member; import jakarta.persistence.*; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.Comment; @@ -26,8 +27,16 @@ public class ArticleLike extends BaseTimeEntity { private Long articleId; - public ArticleLike(Member member, Article article){ + @Builder + private ArticleLike(Member member, Article article){ this.member = member; this.articleId = article.getId(); } + + public static ArticleLike of(Member member, Article article) { + return ArticleLike.builder() + .member(member) + .article(article) + .build(); + } } diff --git a/daepiro-core/src/main/java/com/numberone/backend/domain/like/entity/CommentLike.java b/daepiro-core/src/main/java/com/numberone/backend/domain/like/entity/CommentLike.java index 3675911..d0fea74 100644 --- a/daepiro-core/src/main/java/com/numberone/backend/domain/like/entity/CommentLike.java +++ b/daepiro-core/src/main/java/com/numberone/backend/domain/like/entity/CommentLike.java @@ -5,6 +5,7 @@ import com.numberone.backend.domain.member.entity.Member; import jakarta.persistence.*; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.Comment; @@ -26,8 +27,16 @@ public class CommentLike extends BaseTimeEntity { private Long commentId; - public CommentLike(Member member, CommentEntity comment) { + @Builder + private CommentLike(Member member, CommentEntity comment) { this.member = member; this.commentId = comment.getId(); } + + public static CommentLike of(Member member, CommentEntity comment) { + return CommentLike.builder() + .member(member) + .comment(comment) + .build(); + } } From 84924454bc0f563989d5370cdfe2d9d710ec4759 Mon Sep 17 00:00:00 2001 From: nohy6630 Date: Thu, 30 May 2024 00:43:08 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix=20:=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/like/service/LikeService.java | 2 +- .../backend/domain/like/service/LikeServiceTest.java | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/daepiro-api/src/main/java/com/numberone/backend/domain/like/service/LikeService.java b/daepiro-api/src/main/java/com/numberone/backend/domain/like/service/LikeService.java index b985f9d..eda1ed1 100644 --- a/daepiro-api/src/main/java/com/numberone/backend/domain/like/service/LikeService.java +++ b/daepiro-api/src/main/java/com/numberone/backend/domain/like/service/LikeService.java @@ -45,7 +45,7 @@ public Integer increaseArticleLike(Long articleId) { Member member = memberRepository.findById(memberId) .orElseThrow(NotFoundMemberException::new); Article article = articleRepository.findByIdFetchJoin(articleId) - .orElseThrow(NotFoundApiException::new); + .orElseThrow(NotFoundArticleException::new); if (isAlreadyLikedArticle(memberId, articleId)) throw new AlreadyLikedException(); diff --git a/daepiro-api/src/test/java/com/numberone/backend/domain/like/service/LikeServiceTest.java b/daepiro-api/src/test/java/com/numberone/backend/domain/like/service/LikeServiceTest.java index bfc8130..aa37297 100644 --- a/daepiro-api/src/test/java/com/numberone/backend/domain/like/service/LikeServiceTest.java +++ b/daepiro-api/src/test/java/com/numberone/backend/domain/like/service/LikeServiceTest.java @@ -68,15 +68,15 @@ void tearDown() { void increaseArticleLike() { // given Member articleOwner = getDummyArticleOwner(); + given(articleOwner.getId()) + .willReturn(2L); given(articleOwner.getFcmToken()) .willReturn("fcmToken123"); - given(memberRepository.findById(articleOwner.getId())) - .willReturn(Optional.of(articleOwner)); Article article = getDummyArticle(articleOwner); given(article.getId()) .willReturn(1L); - given(articleRepository.findById(article.getId())) + given(articleRepository.findByIdFetchJoin(article.getId())) .willReturn(Optional.of(article)); //when @@ -188,13 +188,11 @@ private Member getDummyCommentOwner() { private Member getDummyArticleOwner() { Member articleOwner = spy(Member.ofKakao(2345L)); - given(articleOwner.getId()) - .willReturn(2L); return articleOwner; } private Article getDummyArticle(Member articleOwner) { - return spy(Article.of("title1", "content1", articleOwner.getId(), ArticleTag.LIFE)); + return spy(Article.of("title1", "content1", articleOwner, ArticleTag.LIFE)); } private CommentEntity getDummyComment(Article article, Member commentOwner) {