java 배우기/TIL

List를 Page 화 하기

checkuu 2024. 10. 22. 23:42

매번 할때마다 조금씩 까먹어서 Page로 표현하는법 기록하기

 

기존 List로 모든 게시글 불러오는 메서드

 

Controller

@GetMapping
    public ResponseEntity<ApiResponse<List<BoardsDetailResponseDto>>> getboardss(){
        List<BoardsDetailResponseDto> dtoList = boardsService.getBoardss();
        return ResponseEntity.ok(ApiResponse.success(dtoList));
    }

 

Service

public List<BoardsDetailResponseDto> getBoardss(){
        List<Boards> boardsList = boardsRepository.findAll();
        List<BoardsDetailResponseDto> dtos = new ArrayList<>();

        for (Boards boards : boardsList) {
            BoardsDetailResponseDto dto = new BoardsDetailResponseDto(boards);
            dtos.add(dto);
        }
        return dtos;
    }


-> for문은 Stream 으로 변환 가능
 return boards.stream()
                     .map(BoardsDetailResponseDto::new)
                     .collect(Collectors.toList());

 

 

Page

나타내는 값이 조금은 다르지만 Page 를 써서 가져왔다.

 

Controller

@GetMapping("/my-boards")
    public ResponseEntity<ApiResponse<Page<BoardsDetailResponseDto>>> getMyBoards(@AuthenticationPrincipal AuthUser authUser,
                                                                                @RequestParam(defaultValue = "1") int page,
                                                                                @RequestParam(defaultValue = "5") int size){
        return ResponseEntity.ok(ApiResponse.success(boardsService.getMyBoards(authUser,page,size)));
    }


Service

public Page<BoardsDetailResponseDto> getMyBoards(AuthUser authUser, int page, int size) {
        //사용자 찾기
        User user = userService.findUser(authUser.getUserId());
        //페이지 요청 객체 생성 (페이지 숫자가 실제로는 0부터 시작하므로 원하는 숫자 -1을 입력해야 해당 페이지가 나온다)
        Pageable pageable = PageRequest.of(page -1, size);
        //해당 유저가 쓴 게시글 페이지네이션해서 가져오기
        Page<Boards> boards = boardsRepository.findAllByUserId(user.getId(),pageable);
        //찾은게시글들 responseDto에 맞춰서 반환하기
        return boards.map(BoardsDetailResponseDto::new);
    }

 

int page : 현재 요청한 페이지 이며 페이지네이션에서 첫페이지는 0이다 그러므로 pageable 을 생성할때 page -1 을 해줘야 원하는 위치의 페이지를 조회할 수 있다.

 

int size : 한페이지에 나타낼 페이지의 수

 

Pageable : 페이지네이션을 위한 정보를 담고 있는 인터페이스 

 

PageRequest : Pageable 인터페이스의 구현 클래스, 페이지 번호와 페이지 크기를 기반으로 페이지 요청을 생성

 

map : page 객체의 메서드로 페이지내 각요소에 대해 변환 작업을 수행

 

BoardsDetailResponseDto::new : Dto 생성자를 참조하여 ,Boards객체를 입력 받아 Dto 객체를 생성하는 역할, new - 해당 클래스의 생성자를 호출하는 shorthand

 

자주 하는것도 까먹을 수 있으니 기록하는 습관 가지자