[게시판] 게시글 조회

2023. 1. 25. 15:43프로젝트/라이프 챌린지

728x90
SMALL

기본적으로 게시글은 조회되어야 한다.

조회 기능을 만들어보자.

 


PostController

// 게시글 조회
@GetMapping("/post/read/{post_id}")
public ResponseEntity<ResponseBody> postRead(HttpServletRequest request, @PathVariable Long post_id){
    log.info("게시글 조회 - 조회 게시글 : {}", post_id);

    return postService.postRead(request, post_id);
}

컨트롤러에 특정 게시글을 조회할 api 를 만들어준다.

  • 단순히 조회하면 되기에 GetMapping method 타입으로 만들어준다.
  • Service 단에 넘겨줄 인자값은 HttpServletRequest, 조회할 게시글의 post_id

 

 

PostService

// 게시글 조회
@Transactional
public ResponseEntity<ResponseBody> postRead(HttpServletRequest request, Long post_id) {

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

    // 조회하고자 하는 게시글 조회
    if (queryFactory
            .selectFrom(post)
            .where(post.post_id.eq(post_id))
            .fetchOne() == null) {
        return new ResponseEntity<>(new ResponseBody(StatusCode.NOT_EXIST_POST_INFO.getStatusCode(), StatusCode.NOT_EXIST_POST_INFO.getStatus(), null), HttpStatus.BAD_REQUEST);
    }

    // 게시글 정보 불러오기
    Post read_post = queryFactory
            .selectFrom(post)
            .where(post.post_id.eq(post_id))
            .fetchOne();

    // 게시글 조회 수 업데이트
    queryFactory
            .update(post)
            .set(post.viewcnt, read_post.getViewcnt() + 1)
            .where(post.post_id.eq(post_id))
            .execute();

    entityManager.flush();
    entityManager.clear();


    // 조회하고자 하는 게시글의 정보들
    PostResponseDto postResponseDto = PostResponseDto.builder()
            .title(read_post.getTitle()) // 게시글 제목
            .content(read_post.getContent()) // 게시글 내용
            .nickname(read_post.getMember().getNickname()) // 게시글 작성자
            .createdAt(read_post.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy.MM.dd hh:mm"))) // 게시글 생성일자
            .viewcnt(read_post.getViewcnt()) // 게시글 조회 수
            .likecnt(read_post.getLikecnt()) // 게시글 좋아요 수
            .build();


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

조회할 Service 로직을 만들어준다.

  • 조회하고자 하는 유저가 유효한지 검증하는 checkAuthentication 을 통해 Member 객체를 반환받는다.
  • 조회하려는 게시글이 존재하는지 확인하는 에러 처리 로직을 만들어준다. (사실 존재하는 게시글을 눌러야지만 조회가 되기 때문에 해당 에러 처리 로직은 빼도 상관없을 것이다.)
  • 조회 게시글 Post 객체를 불러온다.
  • 조회정보를 반환하기에 앞서, 조회를 하면 해당 게시글에 대한 조회수가 업데이트 되어야 한다. update문을 통해 viewcnt를 +1 하여 업데이트 해준다.
  • 업데이트가 완료되었다면 EntityManager.flush() 를 통해 실제 DB에도 적용시켜주고, clear()를 통해 잔여 데이터를 비워준다.
  • 조회한 게시글을 Post 그 자체로 반환하면 이슈가 발생하기 때문에 PostResponseDto를 만들어주고 Dto에 조회하고자하는 게시글의 정보들을 담아 반환한다.

 

 

포스트맨으로 확인해보자.

# PathVariable로 받은 3번 게시글을 토큰을 넣어 조회

 

정상적으로 게시글 정보들이 출력되는 것을 확인할 수 있다.

또한, viewcnt에 정상적으로 반영되어 출력되는 것도 확인할 수 있다.

 

728x90
반응형
LIST