[댓글] 댓글 수정

2023. 1. 28. 12:51프로젝트/라이프 챌린지

728x90
SMALL

댓글 작성은 구현했으니 댓글 수정 api를 만들어보자.

수정은 게시글과 마찬가지로 작성한 작성자만이 수정이 가능하다.

 


CommnetController

// 댓글 수정
@PutMapping("/comment/update/{comment_id}")
public ResponseEntity<ResponseBody> commentUpdate(HttpServletRequest request, @RequestBody CommentRequestDto commentRequestDto, @PathVariable Long comment_id){
    log.info("댓글 수정 - 댓글 수정 유저 : {}, 댓글 수정 내용 일부분 : {}", jwtTokenProvider.getMemberFromAuthentication().getNickname(), commentRequestDto.getContent().substring(0,5));

    return commentService.commentUpdate(request, commentRequestDto, comment_id);
}

댓글 수정 메소드를 작성해준다.

  • 수정 작업이 진행될 것이므로 PutMapping 타입 메소드로 지정해준다.
  • 인자값은 토큰 값이 저장된 HttpServletRequest, @RequestBody로  Service 에 넘겨줄 수정된 댓글 데이터가 저장된 CommentRequestDto 객체, @PathVariable로 주소에 직접 넘겨받은 수정될 Comment 의 id

 

 

 

CommentRequestDto

import lombok.Getter;

@Getter
public class CommentRequestDto {
    private String content;
}

댓글은 수정사항이 내용밖에 없기 때문에 작성시 사용했던 CommentRequestDto  그대로를 사용해도 좋을 것이다.

 

 

 

 

CommentService

// 댓글 수정
@Transactional
public ResponseEntity<ResponseBody> commentUpdate(HttpServletRequest request, CommentRequestDto commentRequestDto, Long comment_id){

    // 유저 검증
    Member auth_member = checkAuthentication(request);

    // 댓글 작성자가 아니라면 댓글을 수정할 수 없음.
    if(queryFactory
            .selectFrom(comment)
            .where(comment.comment_id.eq(comment_id).and(comment.nickname.eq(auth_member.getNickname())))
            .fetchOne() == null){
        return new ResponseEntity<>(new ResponseBody(StatusCode.NOT_MATCH_COMMENT_WRITER.getStatusCode(), StatusCode.NOT_MATCH_COMMENT_WRITER.getStatus(), null), HttpStatus.BAD_REQUEST);
    }

    // 댓글 수정
    queryFactory
            .update(comment)
            .set(comment.content, commentRequestDto.getContent())
            .set(comment.modifiedAt, LocalDateTime.now())
            .where(comment.comment_id.eq(comment_id))
            .execute();


    entityManager.flush(); // 실제 DB에 수정 사항 반영
    entityManager.clear(); // 반영 후 남은 잔여 데이터 비워주기


    // 수정된 댓글 불러오기
    Comment update_comment = queryFactory
            .selectFrom(comment)
            .where(comment.comment_id.eq(comment_id))
            .fetchOne();


    // Dto에 불러온 댓글 정보 담기
    CommentResponseDto commentResponseDto = CommentResponseDto.builder()
            .content(update_comment.getContent())
            .nickname(update_comment.getNickname())
            .createdAt(update_comment.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy.MM.dd hh:mm")))
            .modifiedAt(update_comment.getModifiedAt().format(DateTimeFormatter.ofPattern("yyyy.MM.dd hh:mm")))
            .build();


    return new ResponseEntity<>(new ResponseBody(StatusCode.OK.getStatusCode(), StatusCode.OK.getStatus(), commentResponseDto), HttpStatus.OK);
}

댓글 수정 로직이 실행될 메소드를 만들어준다.

  • checkAuthentication(request) 로 유저 검증을 통해 Member 객체를 반환받는다.
  • 만약 수정하고자 하는 댓글이 현 유저가 작성한 댓글이 아니라면 수정할 수 없도록 에러 처리를 해준다.
  • 맞다면 content와 modifiedAt을 업데이트해준다.
  • entitymanager.flush()로 실 DB에 반영해주고, entitymanager.clear()로 영속성 컨텍스트에 남아있는 잔여 데이터를 비워내준다.
  • 수정된 댓글 정보를 조회하여 가져온다.
  • 반환 데이터를 담는 CommentResponseDto 객체에 수정된 Comment 데이터 정보를 담아서 반환한다.

 

 

 

CommentResponseDto

import lombok.Builder;
import lombok.Getter;

@Builder
@Getter
public class CommentResponseDto {
    private String content;
    private String nickname;
    private String createdAt;
    private String modifiedAt;
}

수정된 댓글의 정보를 결과적으로 반환할 때 담을 CommentResponseDto 객체이다.

  • @Builder를 통해 수정된 Comment 데이터 주입
  • CommentResponseDto에 담길 정보들은 네 가지
    • content : 댓글 내용
    • nickname : 댓글 작성자
    • createdAt : 댓글 생성일자
    • modifiedAt : 댓글 수정일자

 

 

 

포스트맨으로 확인해보자

 

# 댓글 수정

 

정상적으로 댓글이 수정된 것을 확인할 수 있다.

(Header 토큰 필요!)

728x90
반응형
LIST