[댓글] 댓글 수정
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
'프로젝트 > 라이프 챌린지' 카테고리의 다른 글
[뷰 구현 (1)] 초기 뷰 페이지 구현 (프로토타입) (0) | 2023.02.12 |
---|---|
[댓글] 댓글 삭제 (0) | 2023.01.28 |
[댓글] 댓글 작성 (0) | 2023.01.28 |
[게시판] 게시글 좋아요 / 좋아요 취소 (0) | 2023.01.25 |
[게시판] 게시글 전체 목록 조회 (0) | 2023.01.25 |