Controller 코드
@GetMapping("/admin/users")
public ResponseEntity<Page<GetUserResponse>> getUsers(
@RequestParam String keyword,
@PageableDefault Pageable pageable, // 기본값 page = 0, size = 10
@RequestParam(defaultValue = "1") int page,
@RequestParam UserStatus status
) {
Pageable converted = PageRequest.of(
page - 1,
pageable.getPageSize(),
pageable.getSort()
);
return ResponseEntity.ok(userService.findAllUsers(keyword, converted, status));
}
Service 코드
@Transactional(readOnly = true)
public Page<GetUserResponse> findAllUsers(String keyword, Pageable pageable, UserStatus status) {
Page<User> users;
if (keyword.contains("@")) {
users = userRepository.findByEmailKeyword(keyword,pageable,status); // pageable 사용
} else {
users = userRepository.findByNameKeyword(keyword,pageable,status);
}
return users.map(user -> new GetUserResponse(
user.getId(),
user.getName(),
user.getEmail(),
user.getPhoneNumber(),
user.getStatus().getStatus(),
user.getCreatedAt(),
user.getModifiedAt()
));
}
Repository 코드
public interface UserRepository extends JpaRepository<User,Long> {
@Query(value = "SELECT u FROM User u " +
"WHERE (:keyword IS NULL OR u.email = :keyword) " +
"AND (:status IS NULL OR u.status = :status)")
Page<User> findByEmailKeyword(String keyword, Pageable pageable, UserStatus status);
@Query(value = "SELECT u FROM User u " +
"WHERE (:keyword IS NULL OR u.name = :keyword) " +
"AND (:status IS NULL OR u.status = :status)")
Page<User> findByNameKeyword(String keyword, Pageable pageable, UserStatus status);
}
Controller에서 정렬 기준을 Pageable객체에 담아서 Service 및 Repository에서는 Pageable 객체만 담아주면 사용이 가능하다