아이템 목록을 효과적으로 관리하기 위해 페이지네이션(Pagination)을 사용한다. 이를 통해 한 번에 몇 개씩 아이템을 로드하여 사용자에게 제공한다. 페이지네이션은 페이지 크기를 설정하여 사용자가 아이템을 효과적으로 탐색할 수 있게 한다.




Controller: GET 요청으로 페이지 번호를 받아서 Service에 요청한다.
DTO: 객체를 DTO로 변환하는 메서드를 제공하여 페이지네이션된 아이템 목록을 생성한다.
Service: 페이지 번호를 받아서 해당 페이지의 아이템 목록을 Repository에 요청하고 결과인 DTO 객체를 Controller로 반환한다. 1페이지에 아이템은 10개씩 보여준다.
Repository: 페이지네이션을 위해 데이터베이스에서 필요한 페이지의 아이템 목록을 조회하고 Service로 반환한다.
@Repository
public interface ItemRepository extends JpaRepository<Item, Long> {
Page<Item> findAll(Pageable pageable);
}
@Getter
@Builder
@AllArgsConstructor
public class ItemResponseDTO {
private Long itemId;
private String name;
private Integer price;
private String itemImage;
private String description;
private Category category;
public static Page<ItemResponseDTO> toDTOPage(Page<Item> items) {
return items.map(item -> ItemResponseDTO.builder()
.itemId(item.getItemId())
.name(item.getName())
.price(item.getPrice())
.itemImage(item.getItemImage())
.description(item.getDescription())
.category(item.getCategory())
.build());
}
}
@Service
@RequiredArgsConstructor
public class ItemService {
private final ItemRepository itemRepository;
public Page<Item> getList(int page) {
Pageable pageable = PageRequest.of(page, 10, Sort.DEFAULT_DIRECTION, "itemId");
return itemRepository.findAll(pageable);
}
}
@RequiredArgsConstructor
@RestController
@RequestMapping("/items")
public class ItemController {
private final ItemService itemService;
@GetMapping
public Page<ItemResponseDTO> listItems(@RequestParam(value = "page", defaultValue = "0") int page) {
Page<Item> items = itemService.getList(page);
return ItemResponseDTO.toDTOPage(items);
}
}
참고
Interface Pageable
Class AbstractPageRequest
Class PageRequest
HandlerMethodArgumentResolvers for Pageable and Sort