[캡스톤] 기능 개발 - 댓글 기능

이신행·2024년 6월 28일

capstone

목록 보기
12/15
post-thumbnail

프로젝트에서 댓글 기능이 필요한 이유

이전 포스트에서 Emergency 알림을 구현했습니다.
다시 한번 간단히 설명하자면, Emergency 알림은 피보호자의 주변 멤버들에게 알림을 전송하는 기능입니다.
즉, 이 알림은 피보호자의 안전이 확인되지 않을 때 사용하는 기능입니다.
알림을 받은 멤버는 자신의 주변에 도움이 필요한 사람이 있다는 것을 알 수 있습니다.
만약 그 사람을 발견한다면 해당 인물의 보호자에게 제보를 할 방법이 있어야 합니다.
그럴 때 Emergency 알림에 댓글을 달아 제보할 수 있도록 기능을 구현했습니다.

구현

가독성을 위해 일부 코드를 수정, 삭제했습니다. 코드 전문은 아래의 깃허브에서 확인하실 수 있습니다. (특히 optional null check 등의 예외 처리 + 알림을 저장하는 메서드)

Entity

public class Comment {
    @Id 
    private Long commentId;
    @ManyToOne
    private Emergency emergency;
    @ManyToOne
    private Member commentator;
    private String comment;
    private LocalDateTime createdAt;
}

Controller

@PostMapping("/write-comment")
public ResponseEntity<Map<String, String>> writeComment(@RequestBody CommentRequestDTO commentRequestDTO) {
    HashMap<String, String> result = new HashMap<>();
    if (! emergencyService.writeComment(commentRequestDTO)) {
        return addErrorStatus(result);
    }
    return addOkStatus(result);
}

@PostMapping("/delete-comment")
public ResponseEntity<Map<String, String>> deleteComment(@RequestBody CommentIdDTO dto) {
    HashMap<String, String> result = new HashMap<>();
    if(! emergencyService.deleteComment(dto.getCommentId())){
        return addErrorStatus(result);
    }
    return addOkStatus(result);
}

@Transactional
@PostMapping("/emergency-detail")
public ResponseEntity<Map<String, CommentResponseDTO>> emergencyDetail(@RequestBody EmergencyIdDTO dto) {
    HashMap<String, CommentResponseDTO> result = new HashMap<>();
    Emergency emergency = emergencyService.getEmergencyDetail(dto.getEmergencyId());
   
    List<Comment> commentList = emergencyService.getCommentOfEmergency(dto.getEmergencyId());
    for (Comment comment : commentList) {
        String format = comment.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        result.put(comment.getCommentId().toString(),
                CommentResponseDTO.builder()
                        .commentator(comment.getCommentator().getMemberId())
                        .commentDate(format)
                        .content(comment.getComment())
                        .build()
        );
    }
    return ResponseEntity.ok().body(result);
}

Service

@Transactional
public boolean writeComment(CommentRequestDTO commentRequestDTO) {
    Optional<Member> foundMember = memberRepository.findById(commentRequestDTO.getCommentatorId());
    Optional<Emergency> foundEmergency = emergencyRepository.findById(Long.valueOf(commentRequestDTO.getEmergencyId()));

    Comment comment = Comment.builder()
            .commentator(foundMember.get())
            .emergency(foundEmergency.get())
            .comment(commentRequestDTO.getCommentContent())
            .build();

    commentRepository.save(comment);
    foundEmergency.get().commentList.add(comment);
    return true;
}

@Transactional
public Emergency getEmergencyDetail(String emergencyId) {
    Optional<Emergency> foundEmergency = emergencyRepository.findById(Long.valueOf(emergencyId));
    return foundEmergency.orElse(null);
}

@Transactional
public List<Comment> getCommentOfEmergency(String emergencyId) {
    Emergency emergencyDetail = getEmergencyDetail(emergencyId);
    return commentRepository.findAllByEmergency(emergencyDetail);
}

@Transactional
public boolean deleteComment(String commentId) {
    Optional<Comment> foundComment = commentRepository.findById(Long.valueOf(commentId));
    commentRepository.delete(foundComment.get());
    return true;
}

마무리

Emergency에 댓글을 달아서 제보할 수 있는 기능을 구현했습니다.
크게 어려움 없이 구현하다보니 포스트의 대부분을 코드로 채우게 되었습니다.

코드 깃허브

https://github.com/LeeShinHaeng/safeGuard

profile
언제나 Response 하는 Ability가 있는 서버를 만드는, Responsibility 있는 개발자가 되자

0개의 댓글