Home ✨TIL - 사이드 프로젝트 전체글 조회
Post
Cancel

✨TIL - 사이드 프로젝트 전체글 조회


전체글 조회 구현


기사 전체 조회 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()를 사용해서 페이지 크기를 구하게 되면

스크린샷 2023-02-24 오후 1 24 02

이처럼 전체 페이지들에 대한 정보를 담아오지 못한다.



쿼리문을 작성해 페이지 전체에 대한 정보들 불러와
totalSize라는 변수안에 담아주었다.

1
2
3
4
5
6
			long totalSize = jpaQueryFactory
					.selectFrom(post)
					.fetch().size();

		return new PageImpl<>(result, pageable, totalSize);	
}

스크린샷 2023-02-24 오후 1 21 35

이렇게 전체 페이지에 대한 정보를 불러올 수 있다.

This post is licensed under CC BY 4.0 by the author.