[게시판] 게시글 수정

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을 통해 불러온 게시글의 정보들 중 필요한 정보들만 넣어서 최종적으로 반환해주도록 한다.

 

 

포스트맨 확인.

# 토큰을 넣어 게시글 수정 api 호출

 

# 수정할 내용 기입 후 api 호출

 

수정된 내용으로 정상적으로 출력되는 것을 확인하였다.

728x90
반응형
LIST

'프로젝트 > 라이프 챌린지' 카테고리의 다른 글

[게시판] 게시글 조회  (0) 2023.01.25
[게시판] 게시글 삭제  (0) 2023.01.25
[게시판] 게시글 작성  (0) 2023.01.25
[회원관리] 회원탈퇴  (0) 2023.01.21
[회원관리] 로그아웃  (0) 2023.01.21