2022.07.13 TIL - Page<T> , Page<Tdto>

Wintering·2022년 7월 14일
0

2022TIL

목록 보기
69/87

7월13일(목)

내일배움캠프

✅Today I Learned
페이징처리를 할 때, 제네릭 타입으로 Dto 넣어주기

  • 현재 타임리프 페이징
/**
* Repository
**/
public interface PostRepository extends JpaRepository<Post, Long> {
    Page<Post> findAllByUserId(Long userId, Pageable pageRequest);
}
/**
* Controller
**/
  @GetMapping("/{id}/posts")
    public String getUserPostById(@PageableDefault Pageable pageable, @PathVariable Long id, 
    								Model model, User loginUser) {
        Page<Post> postList = postService.getPostListByUser(id, pageable);
        model.addAttribute("posts", postList);
        model.addAttribute("userNick", loginUser.getUserNickname());
        model.addAttribute("userId", loginUser.getId());

        return "/profile/profile-posts";
    }
/**
* Service
**/
    @Transactional(readOnly = true)
    public Page<Post> getPostListByUser(Long userId, Pageable pageable) {
        int page = (pageable.getPageNumber() == 0) ? 0 : (pageable.getPageNumber() - 1);
        pageable = PageRequest.of(page, 5);

        return postRepository.findAllByUserId(userId, pageable);
    }

페이징처리를 진행하면서 JPA의 Page타입에 대해서 엔티티객체 자체가 아닌 DTO 객체를 넣어서 전달하는 방법을 잘 모르겠었다. 처음에는 이 방법처럼 Dto와 엔티티를 메소드를 사용하여 Page의 형태로 하나씩 매핑하는 방법을 사용하려고 시도했으나 해당 방법은 Controller에서 Page에 해당하는 Start, Last등 사이즈를 일일이 함께 보내줘야해서, 현재 내가 구현하고 있는 타임리프의 페이징과 맞지 않아서 포기했다.

이후, 튜터님의 추천에 따라 객체를 그대로 전달하되 @JsonIgnore 어노테이션을 활용하는 것으로 Dto객체를 대신하려고했으나 태완님과 얘기를 나누던 중 다른 좋은 방법이 있어서 기록해놓으려고 한다!

/**
* Service
**/

public Page<CafeListResponseDto> findAllCafeList(int page, int size) {
        Pageable pageRequest = PageRequest.of(page, size, 
        									Sort.by(Sort.Direction.DESC, "createdDate"));
        Page<Cafe> all = cafeRepository.findAll(pageRequest);
        //return all.map(cafe -> new CafeListResponseDto(cafe));
        // 위의 주석단 람다식을 아래의 식으로 치환
        return all.map(CafeListResponseDto::new);
    }

Repository나 Controller의 부분은 모두 똑같고, Service단만 간단히 수정해주는 것으로 Dto객체를 반환할 수 있었는데
바로 all.map(Dto::new); 부분이었다. 주석처리 된 것과 같이 단순히 현재의 cafe 객체를 새 Dto에 매핑해주겠다는 간단한 식이어서 놀라웠다. 이걸 해보겠다고 2시간 정도 구글링 지옥에 빠져있었는데 이렇게 쉽게 해결되다니.. ^^; 꼭 기억해놓고 추후 프로젝트에도 이를 활용해야겠다.


  • (+) 정말로 허리가 너무 아프다 ㅠㅜㅠㅜ

0개의 댓글