ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [무한댓글 게시판] 4. QueryDSL로 게시판 리스트 출력하기 (+페이지네이션)
    Spring Boot 2024. 2. 16. 10:43

     

    BoardController.java

    package com.se.social.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    import com.se.social.domain.PageRequestDTO;
    import com.se.social.domain.PageResultDTO;
    import com.se.social.entity.Board;
    import com.se.social.service.BoardService;
    
    import lombok.AllArgsConstructor;
    
    @AllArgsConstructor
    @Controller
    @RequestMapping(value = "/board")
    public class BoardController {
    
    	private BoardService boardService;
    
    	// List =====================================================
    	@GetMapping("/boardPage")
    	public void getBoardList(Model model, @RequestParam(value = "page", defaultValue = "1") int page,
    			@RequestParam(value = "searchType", defaultValue = "") String searchType,
    			@RequestParam(value = "keyword", defaultValue = "") String keyword) {
    
    		PageRequestDTO requestDTO = PageRequestDTO.builder().page(page).size(5).build();
    		PageResultDTO<Board> resultDTO = boardService.selectList(requestDTO, searchType, keyword); 
    
    		model.addAttribute("selectList", resultDTO.getEntityList());
    		model.addAttribute("resultDTO", resultDTO);
    		model.addAttribute("searchType", searchType);
    		model.addAttribute("keyword", keyword);
    		
    	}
    }

     

    게시판 리스트를 GetMapping해주는 메서드 getBoardList에 페이지네이션 로직을 넣어주었다.

    PageResultDTO.java

    페이지네이션 로직을 위한 PageResultDTO 안에 PageReultDTO를 게시판 리스트를 QueryDSL을 사용해서 리스트를 출력해야하는 로직으로 바꿨기 때문에 메서드 타입을 달리해서 오버로딩을 해주었다.

     

    BoardService.java

    package com.se.social.service;
    
    import java.util.List;
    import java.util.Optional;
    
    import com.se.social.domain.PageRequestDTO;
    import com.se.social.domain.PageResultDTO;
    import com.se.social.entity.Board;
    
    public interface BoardService {
    
    	// selectList
    	public PageResultDTO<Board> selectList(PageRequestDTO requestDTO, String searchType, String keyword);
    
    	// selectDetail
    	public Board selectDetail(int board_id);
    
    	// insert, update
    	public String save(Board entity);
    
    	// delete
    	public int delete(int board_id);
    }

    페이지네이션 로직 추가로 selectList를 PageResultDTO로 타입을 변경해주고 파라미터 값을 추가해주었다.

    그렇기 때문에 BoardServiceImpl도 그에 맞게 수정해줘야한다.

    BoardServiceImpl.java

    일단 JPAQueryFactory를 사용하기 위해 라이브러리를 가져와 변수를 생성해주었다.

    @Override
    	public PageResultDTO<Board> selectList(PageRequestDTO requestDTO, String searchType, String keyword) {
    		BooleanExpression searchCondition = getSearchCondition(searchType, keyword);
    
    		// QueryResults 자바에서 지원해주는 것
    		QueryResults<Board> result = queryFactory.selectFrom(board)
    				.where(board.board_delyn.eq('N').and(searchCondition)).orderBy(board.board_id.desc())
    				.offset(requestDTO.getPageable().getOffset()).limit(requestDTO.getPageable().getPageSize())
    				.fetchResults();
    		// count의 역할
    		// 요즘은 지원안하는 함수
    
    		return new PageResultDTO<>(result, requestDTO.getPageable());
    	}
    
    	private BooleanExpression getSearchCondition(String searchType, String keyword) {
    		if ("all".equals(searchType) || "".equals(keyword)) {
    			return null;
    		}
    
    		switch (searchType) {
    		case "useremail":
    			return board.useremail.contains(keyword);
    		case "board_title":
    			return board.board_title.contains(keyword);
    		case "board_content":
    			return board.board_content.contains(keyword);
    		default:
    			return null;
    		}
    	}

    자바에서 지원하는 QueryResults 타입을 사용하여 필요한 list 출력을 위한 QueryDSL 구문을 작성을 해주었고,

    그에 따라 필터 기능을 추가 할 것이라 getSearchCondition 메서드를 만들어주었다.

    switch 문으로 세가지로 필터 기능을 추가할것이다.

    fetchresults가 요즘은 잘 사용을 하지 않아, 지원되지 않아서 비활성화?되게 되어있는데, QueryResults를 사용하기 위해서 해당 함수를 사용하였다. (count와 같은 역할을 한다.)

     

    View

    home.jsp

    home.jsp에서 게시판으로 이동하는 a태그 안에 경로를 설정해주었다.

    boardPage.jsp

    boardPage.jsp에 페이지네이션 로직을 넣어줬고, 그에 맞는 경로와 뽑아올 리스트를 for문을 통해 로직을 작성하였다.

    그럼이제 어플리케이션 실행을 하고 localhost로 들어가보자.

     


    일단 naver social login을 해주었다.

    게시판가기 click

    workbench로 넣어준 data가 떠야지 정상.

    리스트가 잘출력이되었다.

    의도했던대로 작성일 기준 최신순으로 출력이 된것을 확인할수 있다

    (SQL문을 desc로 작성했기 때문)

    페이지네이션도 잘 기능을한다.

Designed by Tistory.