스파르타 내일배움캠프에서 진행하는 심화 프로젝트 일지를 작성합니다.
다음은 심화 프로젝트의 Starting Assignment의 피드백 내용이다.
- 문서가 벌써부터 틀이 잡혀있고 공유도 잘 되고있는 느낌이라 매우 좋습니당.
- 기능분담도 체계적으로 잘 된것같아서 좋네요. 하지만 서로 체크해주고 같이 고민해주는것 잊지마세용.
- 매칭 주제정보가 좀더 명확해지면 좋을 것 같습니다.
- 모든 테이블에 생성일시, 수정일시 필드 추가하는거 검토해주세요.
열심히 정리한 내용인데 칭찬 받아서 아주 뿌듯하다!
매칭 주제 정보를 프로젝트 소개 부분에 제대로 정리하지 않았는데 이 부분 수정해야할 거 같고 helper 신청글의 테이블에 생성일시, 수정일시 필드를 추가하기로 했다.
오늘 구현한 관리자의 role별 유저 조회 기능에서 페이징을 사용했다.
페이징(Paging)
페이징은 정돈 되어있는 데이터를 대상으로 데이터베이스에 한정된 양의 레코드를 요청하는 것
이렇게 말하면 뭔가 이해가 안 되는데 예시를 들어보자!
게시판에 게시글을 작성일자 순으로 10개씩 나눠 조회
정돈 되어있는 => 작성일자 순으로 정렬된 / 한정된 양 => 10개
이런 페이징을 스프링 JPA에서 제공하는 Pageable을 통해 간단하게 구현할 수 있다!
Spring JPA에서 JpaRepository의 부모 인터페이스인 PagingAndSortingRepository에서 페이징과 소팅 기능을 제공한다.
이 인터페이스에 명시된 findAll() 메서드의 반환 타입과 파라미터는 페이징 기능의 핵심적인 역할이다.
org.springframework.data.domain.Pageable
org.springframework.data.domain.Page
Pageable: 페이징을 제공하는 중요한 인터페이스
Page: 페이징 findAll()의 기본적인 반환 메서드로 여러 반환 타입 중 하나
JpaRepository<>를 사용할 때, findAll() 메서드를 Pageable 인터페이스로 파라미터를 넘기면 페이징을 사용할 수 있다.
오늘 작성한 코드의 일부이다.
controller
public Page<User> getUserAllByRoll(
@RequestParam("page") int page,
@RequestParam("size") int size,
@RequestParam("isAsc") boolean isAsc,
@RequestParam("role") String role
) {
return adminService.getUserAllByRole(page, size, isAsc, role);
}
controller단에서는 메소드의 리턴값을 Page 타입으로 받고 메소드의 파라미터로 page(첫 페이지 번호), size(한 페이지에 들어갈 데이터 개수), isAsc(정렬방법)을 통해 페이징의 세부사항을 설정하기 위한 데이터를 받는다.
service
public Page<User> getUserAllByRole(int page, int size, boolean isAsc, String role) {
//페이징 처리
//삼항연산자로 true ASC / false DESC 정렬 설정
//sortBy로 정렬 기준이 되는 property 설정 - id
Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
Sort sort = Sort.by(direction, "id");
Pageable pageable = PageRequest.of(page, size, sort);
Page<User> users = userRepository.findByUserRoleEnum(pageable, UserRoleEnum.ADMIN);
return users;
}
service단에서는 입력받은 페이징 세부사항 데이터로 세부사항을 설정한다.
Sort.Direction에서 삼항연산자를 통해 정렬방법을 정한다.
Sort.by(정렬방법, 정렬기준)으로 어떤 데이터를 기준으로 어떻게 정렬할지 결정한다.
Pagable 변수에 page, size, sort값을 넣은 설정값을 해당 repository의 find 메소드에 파라미터로 전달한다.
repostiory
public interface UserRepository extends JpaRepository<User,Long> {
Page<User> findByUserRoleEnum(UserRoleEnum role, Pageable pagable);
}
repository단에서는 파라미터로 Pageable을 입력받고 상황에 따라 다른 값도 함께 입력받아서 출력할 데이터를 설정한다.