Skip to content

Commit

Permalink
Merge pull request #242 from 100-hours-a-week/fix-comment
Browse files Browse the repository at this point in the history
동행, 커뮤니티 댓글 기능 리팩토링
  • Loading branch information
Namgyu11 authored Oct 2, 2024
2 parents 49018f7 + d92a822 commit 7f9f157
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 88 deletions.
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Table(name = "accompany_comment")
Expand All @@ -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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,9 @@ public interface AccompanyCommentRepository extends JpaRepository<AccompanyComme

// AccompanyPostEntity 의 ID로 삭제되지 않은 댓글 목록 조회
List<AccompanyCommentEntity> findByAccompanyPostEntity_IdAndDeletedAtIsNull(Long postId);

boolean existsByIdAndMemberEntity_IdAndDeletedAtIsNull(Long commentId, Long memberId);

}


Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,20 @@ 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)
public AccompanyCommentResponse createComment(Long memberId, AccompanyCommentRequest request) {
MemberEntity member = getMember(memberId);
AccompanyPostEntity post = getPost(request.getPostId());

// 댓글 생성
AccompanyCommentEntity comment = AccompanyCommentEntity.builder()
.memberEntity(member)
.accompanyPostEntity(post)
Expand All @@ -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로 변환하여 반환
*
Expand All @@ -112,16 +127,6 @@ public List<AccompanyCommentResponse> 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을 발생
Expand All @@ -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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Table(name = "community_comment")
Expand All @@ -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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,8 @@ public interface CommunityCommentRepository extends JpaRepository<CommunityComme

// CommunityPostEntity 의 ID로 삭제되지 않은 댓글 목록 조회
List<CommunityCommentEntity> findByCommunityPostEntity_IdAndDeletedAtIsNull(Long postId);

boolean existsByIdAndMemberEntity_IdAndDeletedAtIsNull(Long commentId, Long memberId);


}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

/**
Expand All @@ -104,17 +116,6 @@ public List<CommunityCommentResponse> 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로 게시물을 조회하는 메서드. 게시물이 존재하지 않거나 삭제된 경우 예외를 발생시킵니다.
*
Expand All @@ -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);
}
}
}

0 comments on commit 7f9f157

Please sign in to comment.