[게시판] 게시글 수정
2023. 1. 25. 15:20ㆍ프로젝트/라이프 챌린지
728x90
SMALL
게시글 수정 기능을 구현해보자.
해당 기능은 수정하고자하는 게시글이 수정하고자하는 유저가 작성한 게시글이 맞을 경우에만 정상적으로 처리가 되어야한다.
PostController
// 게시글 수정
@PutMapping("/post/update/{post_id}")
public ResponseEntity<ResponseBody> postUpdate(HttpServletRequest request, @RequestBody PostRequestDto postRequestDto, @PathVariable Long post_id){
log.info("게시글 수정 - 수정 제목 : {}, 수정 내용 : {}, 수정 게시글 id : {}" , postRequestDto.getTitle(), postRequestDto.getContent(), post_id);
return postService.postUpdate(request, postRequestDto, post_id);
}
컨트롤러에 게시글 수정 api를 만들어준다.
- 수정 변경사항이 발생하므로 PutMapping method 타입으로 지정해준다.
- Service 단에 넘길 정보들은 HttpServletRequest, 수정할 내용이 담겨있는 PostRequestDto, 그리고 어떤 게시글인지 알 수 있는 PathVariable post_id 변수이다. (@PathVariable은 매핑 주소에 {}를 통하여 인자값을 주소에 주입할 수 있다. post_id는 Long 타입이므로 Long타입으로 지정하여 인자값으로 넘겨준다.)
PostService
// 게시글 수정
@Transactional
public ResponseEntity<ResponseBody> postUpdate(HttpServletRequest request, PostRequestDto postRequestDto, Long post_id) {
// 게시글 작성 유저 정보 불러오기
Member auth_member = checkAuthentication(request);
// 게시글 작성 정보는 null일 수 없음
if (postRequestDto.getTitle() == null || postRequestDto.getContent() == null) {
return new ResponseEntity<>(new ResponseBody(StatusCode.NOT_EXIST_POST_INFO.getStatusCode(), StatusCode.NOT_EXIST_POST_INFO.getStatus(), null), HttpStatus.BAD_REQUEST);
}
// 수정하고자 하는 유저가 해당 게시글을 작성한 유저가 맞는지 확인
if (queryFactory
.selectFrom(post)
.where(post.post_id.eq(post_id).and(post.member.eq(auth_member)))
.fetchOne() == null) {
return new ResponseEntity<>(new ResponseBody(StatusCode.NOT_MATCH_POST_WRITER.getStatusCode(), StatusCode.NOT_MATCH_POST_WRITER.getStatus(), null), HttpStatus.BAD_REQUEST);
}
// 게시글 수정
queryFactory
.update(post)
.set(post.title, postRequestDto.getTitle()) // 게시글 제목 수정
.set(post.content, postRequestDto.getContent()) // 게시글 내용 수정
.set(post.modifiedAt, LocalDateTime.now()) // 게시글 수정일자 업데이트
.where(post.post_id.eq(post_id)) // 수정하고자하는 게시글의 id
.execute();
entityManager.flush(); // DB에 반영
entityManager.clear(); // 캐시에 남아있는 정보 비워냄
// 업데이트한 게시글 정보 조회
Post update_post = queryFactory
.selectFrom(post)
.where(post.post_id.eq(post_id))
.fetchOne();
// 게시글 수장 완료 후 게시글 정보들 HashMap으로 출력
HashMap<String, String> updatePostInfoSet = new HashMap<>();
updatePostInfoSet.put("title", update_post.getTitle()); // 제목
updatePostInfoSet.put("content", update_post.getContent()); // 내용
updatePostInfoSet.put("viewcnt", update_post.getViewcnt().toString()); // 조회수
updatePostInfoSet.put("likecnt", update_post.getLikecnt().toString()); // 좋아요 수
updatePostInfoSet.put("nickname", update_post.getMember().getNickname()); // 게시글 작성자 닉네임
updatePostInfoSet.put("createdAt", update_post.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy.MM.dd hh:mm"))); // 게시글 작성일자
updatePostInfoSet.put("modifiedAt", update_post.getModifiedAt().format(DateTimeFormatter.ofPattern("yyyy.MM.dd hh:mm"))); // 게시글 수정일자
return new ResponseEntity<>(new ResponseBody(StatusCode.OK.getStatusCode(), StatusCode.OK.getStatus(), updatePostInfoSet), HttpStatus.OK);
}
작성된 게시글의 내용을 수정할 로직을 만든다.
- 넘겨받은 HttpRequest를 통해 유저 검증을 하고, 인증된 유저의 Member 객체를 반환받는다.
- 수정할 게시글의 정보(제목, 내용)들이 공백이어선 안되는 것을 확인하는 에러 처리를 넣어준다.
- 수정하고자하는 게시글이 현재 수정하려고 하는 유저가 작성한 게시글이 맞는지 확인하는 에러 처리를 넣어준다.
- 작성자가 맞다면, Update 문을 통해 해당 정보들을 수정해준다.
- 제목, 내용, 수정일자를 변경하여 적용한다.
- 적용이 완료되었다면 EntityManager의 flush() 함수를 사용하여 DB에도 적용시켜준다.
- 또한, clear() 를 사용하여 EntityManager에 존재하는 기존의 정보들을 비워준다.
- 수정이 완료된 게시글을 불러온다.
- HashMap을 통해 불러온 게시글의 정보들 중 필요한 정보들만 넣어서 최종적으로 반환해주도록 한다.
포스트맨 확인.
수정된 내용으로 정상적으로 출력되는 것을 확인하였다.
728x90
반응형
LIST
'프로젝트 > 라이프 챌린지' 카테고리의 다른 글
[게시판] 게시글 조회 (0) | 2023.01.25 |
---|---|
[게시판] 게시글 삭제 (0) | 2023.01.25 |
[게시판] 게시글 작성 (0) | 2023.01.25 |
[회원관리] 회원탈퇴 (0) | 2023.01.21 |
[회원관리] 로그아웃 (0) | 2023.01.21 |