단건 조회


// 단건 조회
@GetMapping("/post/{id}")
public PostResponse readPost(@PathVariable Long id) {
    return postService.readPost(id);
}
  1. 위 컨트롤러에서 Post 엔티티의 id 정보를 받아오고, Service단으로 정보를 넘겨준다.
@Transactional(readOnly = true)
public PostResponse readPost(Long id) {
    Post post = postRepository.findById(id).orElseThrow(() -> new RuntimeException("없는 아이디"));
    return new PostResponse(post);  // TODO: 아예 DTO로 조회해오는 로직이 있으면 한줄 더 감소할 것 같다.(영한님 강의 참고)
}
  1. 받아온 id 정보를 토대로 Post 엔티티를 찾고, PostResponse DTO 로 data를 내려준다.

여러건 조회 + 페이징


@GetMapping("/")
public Page<PostResponse> test(Pageable pageable) {
    return postService.getPostList(pageable);
}
  1. Controller에서 Pageable 객체를 받아서 서비스단에 넘겨준다
@Transactional(readOnly = true)
public Page<PostResponse> getPostList(Pageable pageable) {
    return postRepository.pagingPost(pageable).map(PostResponse::new);
}
  1. 받아온 Pageable 객체를 postRepository에 QueryDsl로 구현한 로직인 pagingPost에 넘겨준다.
@Override
public Page<Post> pagingPost(Pageable pageable) {

    // 모집 완료 글이 아닌 경우에만 노출
    List<Post> totalList = jpaQueryFactory.selectFrom(post)
            .where(post.isCompleted.eq(false))
            .fetch();

    List<Post> postList = jpaQueryFactory.selectFrom(post)
            .where(post.isCompleted.eq(false))
            .limit(pageable.getPageSize())
            .offset(pageable.getOffset())
            .orderBy(post.createdDate.desc())
            .fetch();

    return new PageImpl<>(postList, pageable, totalList.size());
}
  1. PostRepositoryImpl 내부의 구현 로직이다.