전체글 조회 구현
기사 전체 조회 Api 부터 완성하기로 하였다.
수정없이 조회만할 부분이라
조회 성능이 좋고, N+1 문제를 방지하기 위해
Projections를 사용해 구현하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import com.ilcle.ilcle_back.dto.response.PostResponseDto;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import static com.ilcle.ilcle_back.entity.QPost.post;
@RequiredArgsConstructor
public class PostRepositoryImpl implements PostRepositoryCustom {
private final JPAQueryFactory jpaQueryFactory;
// 전체글 조회(최신순)
@Override
public Page<PostResponseDto> getAllPosts(Pageable pageable) {
List<PostResponseDto> result = jpaQueryFactory.from(post)
.select(Projections.constructor(PostResponseDto.class,
post.id,
post.title,
post.contents,
post.url,
post.imageUrl,
post.writeDate,
post.writer
))
.limit(pageable.getPageSize())
.offset(pageable.getOffset())
.orderBy(post.writeDate.desc())
.fetch();
long totalSize = jpaQueryFactory
.selectFrom(post)
.fetch().size();
return new PageImpl<>(result, pageable, totalSize);
}
}
Post에서 Dto로 데이터를 옮겨담아 리스트로 만들어주어서
전체글 조회가 되게 구현하였다.
정렬은 orderBy를 사용해 기사가 쓰여진 날짜의 최신순으로 정렬하였다.
1
.orderBy(post.writeDate.desc())
page의 크기 정보
지금 조회하려는 글은 20개가 있고,
글을 10개씩 한페이지에 담아 총 2페이지가 존재한다.
1
2
3
4
5
6
// long totalSize = jpaQueryFactory
// .selectFrom(post)
// .fetch().size();
return new PageImpl<>(result, pageable, result.size());
}
size()를 사용해서 페이지 크기를 구하게 되면
이처럼 전체 페이지들에 대한 정보를 담아오지 못한다.
쿼리문을 작성해 페이지 전체에 대한 정보들 불러와
totalSize라는 변수안에 담아주었다.
1
2
3
4
5
6
long totalSize = jpaQueryFactory
.selectFrom(post)
.fetch().size();
return new PageImpl<>(result, pageable, totalSize);
}
이렇게 전체 페이지에 대한 정보를 불러올 수 있다.