[Spring] random List를 Page로 바꾸는 방법(JPA Pageable)
2023. 8. 3. 02:58
문제 상황
Spring Boot로 개발을 진행하던 중 random한 list를, 그것도 filter를 적용한 list를 page로 직접 변환해야 하는 일이 생겼다.
JPA는 pageable을 사용하여 손쉽게 pagination을 적용할 수 있게 해주지만 내 경우에는 list를 page 객체로 직접 변환해야 했기 때문에 구글링을 좀 했어야 했다.
해결 방법
결론적으로 그 방법은
List를 하나 정의 한 후,
List<ImageListResDto> fileList = new ArrayList<>();
fileList를 생성 후 반복문을 돌면서 list에 원소를 추가한다.
fileRepository.findAll().forEach(file-> {
if (file.getItem() != null) {
if (Boolean.FALSE.equals(file.getItem().getIsDeleted())) {
fileList.add(new ImageListResDto(file.getUrl(), file.getItem().getItemId(), null));
}
} else {
Optional<Portfolio> portfolio = portfolioRepository.findByFile(file);
if (portfolio.isPresent() && Boolean.FALSE.equals(portfolio.get().getIsDeleted())) {
fileList.add(new ImageListResDto(file.getUrl(), null, portfolio.get().getPortfolioId()));
}
}
});
Collections.shuffle을 사용해 이미지를 랜덤하게 섞는다.
//이미지 랜덤하게 섞기
Collections.shuffle(fileList);
page 객체를 이렇게 직접 생성하여 내가 생성한 리스트에 pagination을 적용한다.
//list를 page로 변환
int start = (int) pageable.getOffset();
int end = Math.min((start + pageable.getPageSize()), fileList.size());
return new PageImpl<>(fileList.subList(start, end), pageable, fileList.size());
'Spring Boot' 카테고리의 다른 글
[Spring] serviceImpl 패턴을 활용한 likeService 리팩토링(객체지향원칙) (0) | 2023.11.10 |
---|---|
[Spring] @Transactional(readOnly = true)를 왜 붙여야 하나요? (0) | 2023.11.10 |
[Spring] Redis Redisson과 AOP를 이용하여 분산락 구현하기 (0) | 2023.10.13 |
[Spring] 좋아요 기능 구현 시 테이블 설계 고민과 성능 테스트 결과 (0) | 2023.10.11 |
[Spring] AOP, Custom Annotation으로 코드 성능 측정하기 (0) | 2023.10.11 |