커뮤니티 게시판 목록 조회 – QueryDSL 기반 카테고리별 검색 + 페이징 처리

롯데ON의 커뮤니티 목록 페이지는 공지사항, 자유게시판, 자료실 세 가지 카테고리로 구성되어 있으며, 각 카테고리별로 게시글을 분리해서 조회할 수 있습니다.

QueryDSL 기반의 동적 쿼리를 활용해 카테고리 조건을 유연하게 처리했으며, 페이징 처리를 통해 대량 데이터도 빠르게 로드할 수 있도록 구현했습니다.


✅ 핵심 기술: Spring MVC, QueryDSL, 페이지네이션, ModelMapper


기술 흐름

@GetMapping("/Community/notice")
public String notice(PageRequestDTO pageRequestDTO, Model model) {
    pageRequestDTO.setCate("notice");
    PageResponseDTO pageResponseDTO = communityService.findAll(pageRequestDTO);
    model.addAttribute(pageResponseDTO);
    return "/Community/notice";
}


Page<Tuple> pageCommunity = communityRepository1.selectAllForList(pageRequestDTO, pageable);
List<Community1DTO> communityDTOList = pageCommunity.getContent().stream().map(tuple -> {
    Community1 community = tuple.get(0, Community1.class);
    String name = tuple.get(1, String.class);
    Community1DTO dto = modelMapper.map(community, Community1DTO.class);
    dto.setName(name);
    return dto;
}).toList();


    @Override
    public Page<Tuple> selectAllForList(PageRequestDTO pageRequestDTO, Pageable pageable) {

        String cate = pageRequestDTO.getCate();

        BooleanExpression expression = qCommunity.cate.contains(cate);

        List<Tuple> tupleList = queryFactory
                .select(qCommunity, qUser.name)
                .from(qCommunity)
                .join(qUser)
                .on(qCommunity.user.id.eq(qUser.id))
                .where(expression)
                .offset(pageable.getOffset())
                .limit(pageable.getPageSize())
                .orderBy(qCommunity.no.desc())
                .fetch();

        long total = queryFactory
                .select(qCommunity.count())
                .from(qCommunity)
                .join(qUser)
                .on(qCommunity.user.id.eq(qUser.id))
                .where(expression)
                .fetchOne();

        return new PageImpl<>(tupleList, pageable, total);
    }


@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResponseDTO<T> {
    private List<T> dtoList;
    private String cate;
    private int pg;
    private int size;
    private int total;
    private int startNo;
    private int start, end;
    private boolean prev, next;
    private String searchType;
    private String keyword;
}


문제와 해결