내배캠

팀 프로젝트 트러블슈팅 - 뉴스피드 프로젝트

muerha 2024. 11. 21. 11:29

 

💡뉴스피드 팀 프로젝트 

 

 

배경

뉴스피드 조회 기능 중에서 생성일자를 기준으로 한 내림차순 정렬과 페이지네이션 기능을 추가하던 중

 

 

발단

서비스 레이어에서 Pageable 객체를 인자로 받아와 아래와 같이 findAll() 메서드를 수정하려고 하였다.

// Repository
Page<Post> findAll(Pageable pageable);
public List<PostResponseDto> findAll(Pageable pageable) {
    return postRepository.findAll(pageable)  
                         .map(PostResponseDto::toDto)
                         .toList();
}

 

 

 

전개

그러자 타입 불일치 오류가 발생한 것을 알 수 있었다.

 

이유는 postRepository.findAll(pageable)은 Page<Post>를 반환하는데 List<PostResponseDto> 타입으로 반환하려고 해서 타입 불일치 오류가 발생한 것이었다.

 

Page 객체는 데이터를 반환할 때 그 페이지에 해당하는 데이터뿐만 아니라 페이징 정보도 함께 제공하기 때문에 List로 변환할 수 없었다.

 

 

위기

public Page<PostResponseDto> findAll(Pageable pageable) {
    return postRepository.findAll(pageable)
    					 .stream()
                         .map(PostResponseDto::toDto)
                         .toList();  
}

 

반환 타입을 Page<PostResponseDto>로 변경하고 Page.map() 메서드를 사용하여 페이징된 데이터를 그대로 반환하도록 수정하였는데 컴파일 오류가 뜨는 것을 알 수 있었다.

 

 

 

해결

public Page<PostResponseDto> findAll(Pageable pageable) {
    return postRepository.findAll(pageable)
                         .map(PostResponseDto::toDto);
}

 

Page 객체는 이미 페이징된 데이터를 포함하고 있기 때문에 stream()을 호출할 필요 없이 직접 map()을 사용하여 변환하면 된다는 것을 알게되어 .stream()과 .toList()를 없애주었다.