diff --git a/src/main/java/connectripbe/connectrip_be/accompany/comment/dto/AccompanyCommentRequest.java b/src/main/java/connectripbe/connectrip_be/accompany/comment/dto/AccompanyCommentRequest.java index 97d40f65..d67e89d8 100644 --- a/src/main/java/connectripbe/connectrip_be/accompany/comment/dto/AccompanyCommentRequest.java +++ b/src/main/java/connectripbe/connectrip_be/accompany/comment/dto/AccompanyCommentRequest.java @@ -1,8 +1,5 @@ package connectripbe.connectrip_be.accompany.comment.dto; -import connectripbe.connectrip_be.accompany.comment.entity.AccompanyCommentEntity; -import connectripbe.connectrip_be.accompany.post.entity.AccompanyPostEntity; -import connectripbe.connectrip_be.member.entity.MemberEntity; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; @@ -24,12 +21,4 @@ public class AccompanyCommentRequest { @NotBlank(message = "내용은 필수입니다.") private String content; - // DTO를 AccompanyComment 엔티티로 변환하는 메서드 - public AccompanyCommentEntity toEntity(AccompanyPostEntity post, MemberEntity member) { - return AccompanyCommentEntity.builder() - .accompanyPostEntity(post) - .memberEntity(member) - .content(this.content) - .build(); - } } diff --git a/src/main/java/connectripbe/connectrip_be/accompany/comment/entity/AccompanyCommentEntity.java b/src/main/java/connectripbe/connectrip_be/accompany/comment/entity/AccompanyCommentEntity.java index e1d3d5a9..f94747ed 100644 --- a/src/main/java/connectripbe/connectrip_be/accompany/comment/entity/AccompanyCommentEntity.java +++ b/src/main/java/connectripbe/connectrip_be/accompany/comment/entity/AccompanyCommentEntity.java @@ -17,7 +17,6 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; @Entity @Table(name = "accompany_comment") @@ -39,9 +38,11 @@ public class AccompanyCommentEntity extends BaseEntity { @JoinColumn(name = "accompany_post_id", nullable = false) private AccompanyPostEntity accompanyPostEntity; // 동행 아이디 (외래키) - @Setter @Column(nullable = false, length = 256) private String content; // 내용 - // 기존 생성자 제거 (빌더 패턴으로 대체됨) + public void updateContent(String newContent) { + this.content = newContent; + } + } diff --git a/src/main/java/connectripbe/connectrip_be/accompany/comment/repository/AccompanyCommentRepository.java b/src/main/java/connectripbe/connectrip_be/accompany/comment/repository/AccompanyCommentRepository.java index 1ddbaab9..544ff566 100644 --- a/src/main/java/connectripbe/connectrip_be/accompany/comment/repository/AccompanyCommentRepository.java +++ b/src/main/java/connectripbe/connectrip_be/accompany/comment/repository/AccompanyCommentRepository.java @@ -11,4 +11,9 @@ public interface AccompanyCommentRepository extends JpaRepository findByAccompanyPostEntity_IdAndDeletedAtIsNull(Long postId); + + boolean existsByIdAndMemberEntity_IdAndDeletedAtIsNull(Long commentId, Long memberId); + } + + diff --git a/src/main/java/connectripbe/connectrip_be/accompany/comment/service/impl/AccompanyCommentServiceImpl.java b/src/main/java/connectripbe/connectrip_be/accompany/comment/service/impl/AccompanyCommentServiceImpl.java index 1d950584..f95b62c7 100644 --- a/src/main/java/connectripbe/connectrip_be/accompany/comment/service/impl/AccompanyCommentServiceImpl.java +++ b/src/main/java/connectripbe/connectrip_be/accompany/comment/service/impl/AccompanyCommentServiceImpl.java @@ -29,12 +29,13 @@ public class AccompanyCommentServiceImpl implements AccompanyCommentService { /** - * 댓글을 생성하는 메서드. 사용자 이메일을 통해 MemberEntity를 조회하고, 게시물 ID를 통해 AccompanyPostEntity를 조회한 후 AccompanyCommentEntity를 생성하여 - * 데이터베이스에 저장 + * 댓글을 생성하는 메서드. 주어진 memberId를 통해 사용자 정보를 조회하고, 요청 정보에서 게시물 ID를 가져와 해당 게시물 정보를 조회한 후, AccompanyCommentRequest를 사용하여 + * 새로운 AccompanyCommentEntity를 생성하고 데이터베이스에 저장합니다. * * @param memberId 댓글 작성자의 아이디 - * @param request 댓글 생성 요청 정보 (게시물 ID, 댓글 내용 포함) - * @return 생성된 댓글의 정보를 담은 AccompanyCommentResponse 객체 + * @param request 댓글 생성 요청 정보 (게시물 ID 및 댓글 내용 포함) + * @return 생성된 댓글 정보를 담고 있는 AccompanyCommentResponse 객체 + * @throws GlobalException 사용자가 존재하지 않거나 게시물이 존재하지 않을 경우 예외 발생 */ @Override @RateLimit(capacity = 10, refillTokens = 10) @@ -42,7 +43,6 @@ public AccompanyCommentResponse createComment(Long memberId, AccompanyCommentReq MemberEntity member = getMember(memberId); AccompanyPostEntity post = getPost(request.getPostId()); - // 댓글 생성 AccompanyCommentEntity comment = AccompanyCommentEntity.builder() .memberEntity(member) .accompanyPostEntity(post) @@ -58,44 +58,59 @@ public AccompanyCommentResponse createComment(Long memberId, AccompanyCommentReq /** - * 댓글을 수정하는 메서드. 주어진 댓글 ID를 통해 AccompanyCommentEntity를 조회하고, 수정 권한이 있는지 확인한 후 댓글 내용을 업데이트 + * 댓글을 수정하는 메서드. 주어진 댓글 ID와 작성자 ID로 삭제되지 않은 댓글을 조회하고, 댓글 작성자와 현재 사용자가 일치하는지 확인한 후, 엔티티의 메서드를 사용해 댓글 내용을 업데이트합니다. * - * @param memberId 수정하려는 사용자의 아이디 - * @param request 댓글 수정 요청 정보 (수정된 댓글 내용 포함) + * @param memberId 댓글 작성자의 아이디 * @param commentId 수정할 댓글의 ID - * @return 수정된 댓글의 정보를 담은 AccompanyCommentResponse 객체 + * @param request 수정 요청 정보 (수정된 댓글 내용 포함) + * @return 수정된 댓글 정보를 담고 있는 AccompanyCommentResponse 객체 + * @throws GlobalException 댓글이 존재하지 않거나 작성자가 다를 경우 예외 발생 */ @Override @Transactional public AccompanyCommentResponse updateComment(Long memberId, Long commentId, AccompanyCommentRequest request) { - AccompanyCommentEntity comment = getComment(commentId); + // 댓글 ID로 삭제되지 않은 댓글을 조회 + AccompanyCommentEntity comment = accompanyCommentRepository.findByIdAndDeletedAtIsNull(commentId) + .orElseThrow(() -> new GlobalException(ErrorCode.COMMENT_NOT_FOUND)); + + // 댓글 작성자와 현재 사용자가 일치하는지 확인 + if (!accompanyCommentRepository.existsByIdAndMemberEntity_IdAndDeletedAtIsNull(commentId, memberId)) { + // 작성자가 아닌 사용자가 댓글 수정 시 예외 발생 + throw new GlobalException(ErrorCode.WRITE_NOT_YOURSELF); // 수정된 에러 코드 사용 + } - // 댓글 작성자와 요청한 사용자가 일치하는지 확인 - validateCommentAuthor(memberId, comment); + // 기존 댓글 내용을 새로운 내용으로 업데이트 + comment.updateContent(request.getContent()); - // 댓글 내용 업데이트 - comment.setContent(request.getContent()); + accompanyCommentRepository.save(comment); // 수정된 댓글 엔티티 저장 - return AccompanyCommentResponse.fromEntity(accompanyCommentRepository.save(comment)); + return AccompanyCommentResponse.fromEntity(comment); // 수정된 댓글 응답 생성 } + /** - * 댓글을 삭제하는 메서드. 주어진 댓글 ID를 통해 AccompanyCommentEntity를 조회한 후, 삭제 권한이 있는지 확인하고 해당 댓글을 데이터베이스에서 삭제 + * 댓글을 삭제하는 메서드. 주어진 댓글 ID와 작성자 ID로 삭제되지 않은 댓글을 조회하고, 해당 댓글이 본인의 댓글인지 확인한 후, 삭제 처리합니다. * * @param memberId 삭제하려는 사용자의 아이디 * @param commentId 삭제할 댓글의 ID + * @throws GlobalException 댓글이 존재하지 않거나 작성자가 다를 경우 예외 발생 */ @Override @Transactional public void deleteComment(Long memberId, Long commentId) { - AccompanyCommentEntity comment = getComment(commentId); + AccompanyCommentEntity comment = accompanyCommentRepository.findByIdAndDeletedAtIsNull(commentId) + .orElseThrow(() -> new GlobalException(ErrorCode.COMMENT_NOT_FOUND)); - // 댓글 작성자와 요청한 사용자가 일치하는지 확인 - validateCommentAuthor(memberId, comment); + if (!accompanyCommentRepository.existsByIdAndMemberEntity_IdAndDeletedAtIsNull(commentId, memberId)) { + throw new GlobalException(ErrorCode.WRITE_NOT_YOURSELF); + } + + comment.deleteEntity(); // deleteEntity 메서드로 삭제 처리 - comment.deleteEntity(); + accompanyCommentRepository.save(comment); // 변경된 댓글 엔티티 저장 } + /** * 특정 게시물에 달린 모든 댓글을 조회하는 메서드. 주어진 게시물 ID를 통해 해당 게시물에 달린 삭제되지 않은 댓글 목록을 조회한 후, 이를 DTO로 변환하여 반환 * @@ -112,16 +127,6 @@ public List getCommentsByPost(Long postId) { .toList(); } - /** - * 주어진 댓글 ID로 댓글을 조회하는 메서드. 만약 해당 댓글이 존재하지 않으면 GlobalException 을 발생 - * - * @param commentId 조회할 댓글의 ID - * @return 조회된 AccompanyCommentEntity 객체 - */ - private AccompanyCommentEntity getComment(Long commentId) { - return accompanyCommentRepository.findByIdAndDeletedAtIsNull(commentId) - .orElseThrow(() -> new GlobalException(ErrorCode.COMMENT_NOT_FOUND)); - } /** * 주어진 게시물 ID로 게시물을 조회하는 메서드. 만약 해당 게시물이 존재하지 않으면 GlobalException을 발생 @@ -144,16 +149,4 @@ private MemberEntity getMember(Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new GlobalException(ErrorCode.NOT_FOUND_MEMBER)); } - - /** - * 댓글 작성자와 요청한 사용자가 일치하는지 확인하는 메서드. 만약 일치하지 않으면 GlobalException을 발생 - * - * @param memberId 요청한 사용자의 아이디 - * @param comment 조회된 AccompanyCommentEntity 객체 - */ - private void validateCommentAuthor(Long memberId, AccompanyCommentEntity comment) { - if (!comment.getMemberEntity().getId().equals(memberId)) { - throw new GlobalException(ErrorCode.WRITE_NOT_YOURSELF); - } - } } diff --git a/src/main/java/connectripbe/connectrip_be/community/comment/entity/CommunityCommentEntity.java b/src/main/java/connectripbe/connectrip_be/community/comment/entity/CommunityCommentEntity.java index 339a8771..57fef623 100644 --- a/src/main/java/connectripbe/connectrip_be/community/comment/entity/CommunityCommentEntity.java +++ b/src/main/java/connectripbe/connectrip_be/community/comment/entity/CommunityCommentEntity.java @@ -17,7 +17,6 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; @Entity @Table(name = "community_comment") @@ -39,8 +38,11 @@ public class CommunityCommentEntity extends BaseEntity { @JoinColumn(name = "community_post_id", nullable = false) private CommunityPostEntity communityPostEntity; // 커뮤니티 아이디 (외래키) - @Setter @Column(nullable = false, length = 256) private String content; // 내용 + public void updateContent(String content) { + this.content = content; + } + } diff --git a/src/main/java/connectripbe/connectrip_be/community/comment/repository/CommunityCommentRepository.java b/src/main/java/connectripbe/connectrip_be/community/comment/repository/CommunityCommentRepository.java index 56779424..84e4b96b 100644 --- a/src/main/java/connectripbe/connectrip_be/community/comment/repository/CommunityCommentRepository.java +++ b/src/main/java/connectripbe/connectrip_be/community/comment/repository/CommunityCommentRepository.java @@ -11,4 +11,8 @@ public interface CommunityCommentRepository extends JpaRepository findByCommunityPostEntity_IdAndDeletedAtIsNull(Long postId); + + boolean existsByIdAndMemberEntity_IdAndDeletedAtIsNull(Long commentId, Long memberId); + + } diff --git a/src/main/java/connectripbe/connectrip_be/community/comment/service/impl/CommunityCommentServiceImpl.java b/src/main/java/connectripbe/connectrip_be/community/comment/service/impl/CommunityCommentServiceImpl.java index 96aa1aab..6e8ef331 100644 --- a/src/main/java/connectripbe/connectrip_be/community/comment/service/impl/CommunityCommentServiceImpl.java +++ b/src/main/java/connectripbe/connectrip_be/community/comment/service/impl/CommunityCommentServiceImpl.java @@ -58,33 +58,45 @@ public CommunityCommentResponse createComment(Long memberId, CommunityCommentReq * @param commentId 수정할 댓글의 ID * @param request 수정된 댓글 내용을 포함한 요청 정보 * @return 수정된 댓글 정보를 담은 CommunityCommentResponse 객체 + * @throws GlobalException 수정 권한이 없는 경우 예외 발생 */ @Override @Transactional public CommunityCommentResponse updateComment(Long memberId, Long commentId, CommunityCommentRequest request) { - CommunityCommentEntity comment = getComment(commentId); + CommunityCommentEntity comment = communityCommentRepository.findByIdAndDeletedAtIsNull(commentId) + .orElseThrow(() -> new GlobalException(ErrorCode.COMMENT_NOT_FOUND)); + + if (!communityCommentRepository.existsByIdAndMemberEntity_IdAndDeletedAtIsNull(commentId, memberId)) { + throw new GlobalException(ErrorCode.WRITE_NOT_YOURSELF); + } - validateCommentAuthor(memberId, comment); + comment.updateContent(request.getContent()); - comment.setContent(request.getContent()); + communityCommentRepository.save(comment); - return CommunityCommentResponse.fromEntity(communityCommentRepository.save(comment)); + return CommunityCommentResponse.fromEntity(comment); } + /** - * 댓글을 삭제하는 메서드. 주어진 댓글 ID로 댓글을 조회하고, 삭제 권한이 있는지 확인한 후 댓글을 삭제합니다. + * 댓글을 삭제하는 메서드. 주어진 댓글 ID로 댓글을 조회하고, 댓글 작성자와 현재 사용자가 일치하는지 확인한 후 삭제 처리합니다. * * @param memberId 삭제 요청자의 ID * @param commentId 삭제할 댓글의 ID + * @throws GlobalException 댓글이 존재하지 않거나 작성자가 아닌 경우 예외 발생 */ @Override @Transactional public void deleteComment(Long memberId, Long commentId) { - CommunityCommentEntity comment = getComment(commentId); + CommunityCommentEntity comment = communityCommentRepository.findByIdAndDeletedAtIsNull(commentId) + .orElseThrow(() -> new GlobalException(ErrorCode.COMMENT_NOT_FOUND)); - validateCommentAuthor(memberId, comment); + if (!communityCommentRepository.existsByIdAndMemberEntity_IdAndDeletedAtIsNull(commentId, memberId)) { + throw new GlobalException(ErrorCode.WRITE_NOT_YOURSELF); + } comment.deleteEntity(); + communityCommentRepository.save(comment); } /** @@ -104,17 +116,6 @@ public List getCommentsByPost(Long postId) { .toList(); } - /** - * 주어진 댓글 ID로 댓글을 조회하는 메서드. 만약 해당 댓글이 존재하지 않거나 삭제된 경우 예외를 발생시킵니다. - * - * @param commentId 조회할 댓글의 ID - * @return 조회된 CommunityCommentEntity 객체 - */ - private CommunityCommentEntity getComment(Long commentId) { - return communityCommentRepository.findByIdAndDeletedAtIsNull(commentId) - .orElseThrow(() -> new GlobalException(ErrorCode.COMMENT_NOT_FOUND)); - } - /** * 주어진 게시물 ID로 게시물을 조회하는 메서드. 게시물이 존재하지 않거나 삭제된 경우 예외를 발생시킵니다. * @@ -136,16 +137,4 @@ private MemberEntity getMember(Long memberId) { return memberRepository.findById(memberId) .orElseThrow(() -> new GlobalException(ErrorCode.NOT_FOUND_MEMBER)); } - - /** - * 댓글 작성자와 요청자가 일치하는지 확인하는 메서드. 일치하지 않을 경우 예외를 발생시킵니다. - * - * @param memberId 요청자의 ID - * @param comment 조회된 댓글 엔티티 - */ - private void validateCommentAuthor(Long memberId, CommunityCommentEntity comment) { - if (!comment.getMemberEntity().getId().equals(memberId)) { - throw new GlobalException(ErrorCode.WRITE_NOT_YOURSELF); - } - } }