๐ค Stream์ผ๋ก ์๋ ํ์ด์ง?
์์ํ๊ธฐ์ ์์, ๋ณดํต JPA์์ ํ์ด์ง์ด ํ์ํ๋ฉด Page<T>
ํ์
์ผ๋ก ๋ฆฌํด๋ฐ๋ ๊ฒ ๊ฐ์ฅ ๊น๋ํ๋ค.
Page<Entity> res = repository.findByStatus("PENDING", pageable);
์ด ๋ฐฉ์์ด ๊ฐ์ฅ ์ด์์ ์ธ ํํ๊ณ , ์ฑ๋ฅ์์ผ๋ก๋ ํจ์จ์ ์ด๋ค.
ํ์ง๋ง ์ค๋ ๋์ ์ํฉ์์๋ stream์ผ๋ก ํํฐ๋ง ํ, PageImpl
๋ก ์๋ ํ์ด์ง์ ํ๋๊ฒ ๋์ ๋๊ฐ ์กด์ฌํ๋ค.
- ์ฌ์ฉ์์ ํํฐ ์กฐ๊ฑด์ด ๋ง๊ณ
- ๊ทธ ์ค ์ผ๋ถ๋ null์ผ ์๋ ์๊ณ
- ์ผ๋ถ๋ ํฌํจ ๊ฒ์์ด๊ณ
- ๋ ์ง ๋ฒ์ ์กฐ๊ฑด๊น์ง ์กด์ฌํ๋ค.
์ด ์กฐ๊ฑด๋ค์ ๋ชจ๋ JPQL์ด๋ @Query๋ก ์ง๋ ๊ฑด ๋ณต์ก๋๋ ๋๊ณ ์ ์ง๋ณด์์ ์ง์ฅ์ด ๋ ๊ฒ ๊ฐ์๋ค.
๊ทธ๋์ findAll()
์ด๋ ๊ฐ๋จํ ์กฐ๊ฑด์ ๊ฑธ์ด์ repository์์ ์กฐํ ํ stream().filter(...)
๋ก ํํฐ๋ง์ ํ๋ค.
๋ฌผ๋ก ๋ฐ์ดํฐ ์๊ฐ ์ ์๋๋ง ํด๋นํ๋ค.
๐ ์ ์ฒด ์ฝ๋ ์์
// 1. ๋ฐ์ดํฐ ์กฐํ
List<Entity> entityList = repository.findById(id);
// 2. ์กฐ๊ฑด ํํฐ๋ง + ์ ๋ ฌ
List<Entity> filteredEntityList = entityList.stream()
.filter(entity -> entity.getStatus().equals(dto.getStatus()))
.filter(entity -> entity.getCont().getContNm().toLowerCase().contains(dto.getSearchNm().toLowerCase())
.filter(entity -> dto.getTypeCodeList().contains(entity.getTypeCode())
.sorted(Comparator.comparing(Entity::getCrtTime).reversed())
.toList();
// 3. Pageable ๊ฐ์ฒด ์์ฑ (pageable์ F/E์์ ๋์ด์ด)
Pageable page = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize());
// 4. ํ์ด์ง ์ฒ๋ฆฌ
int start = (int) page.getOffset();
int end = Math.min((start + page.getPageSize()), filteredEntityList.size());
Page<Entity> entityPage = new PageImpl<>(
filteredEntityList.subList(start, end),
page,
filteredEntityList.size()
);
๐ฅ .filter(...) ์กฐ๊ฑด์ด ๋ง์์ง ๊ฒฝ์ฐ ๋ฆฌํฉํ ๋ง
Jave Stream์ filter()
์ ์กฐ๊ฑด์ด ๋ง์์ง์๋ก ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋ค.
์ด๋ฅผ ์ํด ์กฐ๊ฑด์ ๋ณ๋ ๋ฉ์๋๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค.
List<Entity> filteredEntityList = entityList.stream()
.filter(entity -> filterSearchNm(entity, dto.getSearchNm()))
.filter(entity -> filterReqTypeCode(entity, dto.getReqTypeCodeList()))
.sorted(Comparator.comparing(Entity::getCrtTime).reversed())
.toList();
// ์กฐ๊ฑด ๋ถ๋ฆฌ ๋ฉ์๋
private boolean filterSearchNm(Entity entity, String searchNm) {
if (StringUtils.isEmpty(searchNm)) return true;
String keyword = searchNm.toLowerCase();
return entity.getCont().getContNm().toLowerCase().contains(keyword) ||
entity.getComp().getCompNm().toLowerCase().contains(keyword);
}
private boolean filterReqTypeCode(Entity entity, List<String> codeList) {
return Collectionutils.isEmpty(codeList) ||
codeList.contains(entity.getReqTypeCode());
}
'Backend > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Data JPA] ํ์ด์ง(Pageable)๊ณผ ์ ๋ ฌ(Sort) ํ ๋ฒ์ ์ฒ๋ฆฌํ๊ธฐ (0) | 2025.04.30 |
---|