단건 조회
// 단건 조회
@GetMapping("/post/{id}")
public PostResponse readPost(@PathVariable Long id) {
return postService.readPost(id);
}
- 위 컨트롤러에서
Post
엔티티의 id
정보를 받아오고, Service단으로 정보를 넘겨준다.
- 글을 “조회"하는 것이기 때문에
GetMethod
를 사용한다.
@Transactional(readOnly = true)
public PostResponse readPost(Long id) {
Post post = postRepository.findById(id).orElseThrow(() -> new RuntimeException("없는 아이디"));
return new PostResponse(post); // TODO: 아예 DTO로 조회해오는 로직이 있으면 한줄 더 감소할 것 같다.(영한님 강의 참고)
}
- 받아온 id 정보를 토대로
Post
엔티티를 찾고, PostResponse
DTO 로 data를 내려준다.
- 조회용이기 때문에
@Transactional(readOnly = true)
를 설정함
여러건 조회 + 페이징
@GetMapping("/")
public Page<PostResponse> test(Pageable pageable) {
return postService.getPostList(pageable);
}
- Controller에서 Pageable 객체를 받아서 서비스단에 넘겨준다
@Transactional(readOnly = true)
public Page<PostResponse> getPostList(Pageable pageable) {
return postRepository.pagingPost(pageable).map(PostResponse::new);
}
- 받아온 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());
}
- PostRepositoryImpl 내부의 구현 로직이다.
- Pageable 객체를 받아서 처리한다.
- totalList를 구하는 로직 → 나중에 글의 총 개수 정보용으로 사용
- paging을 하는 로직 → 페이지에 따른 글 목록 조회
- 두 로직 모두 Post 엔티티의
isCompleted
필드가 false
인경우만 찾는다.
- 마지막으로 PageImpl을 이용하여 Page<Post>를 리턴한다