SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checking.
Use study;
truncate table admin_user;
truncate table category;
truncate table item;
truncate table order_detail;
truncate table order_group;
truncate table partner;
truncate table user;
SET FOREIGN_KEY_CHECKS = 1; -- Disable foreign key checking.
sql에 있는 db를 초기화시켜준다. truncate관련 error.
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController extends CrudController<UserApiRequest,UserApiResponse, User> {
@GetMapping("/page")
public Header<List<UserApiResponse>> search(Pageable pageable){
log.info("{}",pageable);
return null;
}
}
java에는 Paging처리를 쉽게 해주기 위해 Pagable이 선언돼있다. 이 때 주의할 것은

java.awt.print가 아니라 springframework꺼를 import해야한다는 것이다. import를 잘못해서 엄청 헤맸다.


위의 Log로 pageable의 구성을 알 수 있다.
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController extends CrudController<UserApiRequest,UserApiResponse, User> {
@GetMapping("/page")
public Header<List<UserApiResponse>> search(@PageableDefault(sort="id",direction = Sort.Direction.DESC,size=10) Pageable pageable){
log.info("{}",pageable);
return null;
}
}
@PageableDefault를 이용하여 page의 size와 sort를 지정할 수 있다.
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController extends CrudController<UserApiRequest,UserApiResponse, User> {
@Autowired
UserApiLogicService userApiLogicService;
@GetMapping("/page")
public Header<List<UserApiResponse>> search(@PageableDefault(sort="id",direction = Sort.Direction.ASC,size=10) Pageable pageable){
return userApiLogicService.search(pageable);
}
}
public Header<List<UserApiResponse>> search(Pageable pageable){
Page<User> users = baseRepository.findAll(pageable);
List<UserApiResponse> userApiResponseList = users.stream().map(user->
responseForPagable(user)
).collect(Collectors.toList());
return Header.OK(userApiResponseList);
}
pagable을 넘기면 return형은 page형이다. 그래서 stream을 통해 user를 꺼내주어야 하고, return type은 List형이기 때문에 다시 List를 만들어서 return해주어야 한다.
public UserApiResponse responseForPagable(User user){
UserApiResponse userApiResponse = UserApiResponse.builder()
.id(user.getId())
.account(user.getAccount())
.password(user.getPassword())
.status(user.getStatus())
.email(user.getEmail())
.phoneNumber(user.getPhoneNumber())
.registeredAt(user.getRegisteredAt())
.build();
return userApiResponse;
}

default로 넘기게 되면 default=0이라 처음 페이지부터 size의 개수만큼 값을 return해준다. 현재 size=10을 주었으므로 10개만 return이 된다.

params로 page=1을 주면 다음 페이지가 출력이 되며 다시 10개(size의 값)만큼 출력이 된다.
현재 page에 대한 정보도 같이 담아서 준다
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Accessors(chain = true)
public class Pagination {
private Integer totalPages; // 총 페이지 수
private Long totalElements; // 총 갯수
private Integer currentPage; // 현재 페이지
private Integer currentElements; // 현재 페이지에 갖고 있는 element 갯수
}
private Pagination pagination;
Header에 같이 담아서 줄거기 때문에 pagination을 생성해준다.
public static <T> Header<T> OK(T data,Pagination pagination){
return (Header<T>) Header.builder()
.transactionTime(LocalDateTime.now())
.resultCode("OK")
.description("OK")
.pagination(pagination)
.data(data)
.build();
}
pagination을 추가해준다.
public Header<List<UserApiResponse>> search(Pageable pageable){
Page<User> users = baseRepository.findAll(pageable);
List<UserApiResponse> userApiResponseList = users.stream().map(user->
responseForPagable(user)
).collect(Collectors.toList());
Pagination pagination = Pagination.builder()
.totalPages(users.getTotalPages())
.totalElements(users.getTotalElements())
.currentPage(users.getNumber())
.currentElements(users.getNumberOfElements())
.build();
return Header.OK(userApiResponseList,pagination);
}
아주 편하게도, (Jpa respository에 pagable값을 넘기고 난 후 return한 값을 받은)Page객체는 위의 모든 값을 저장하고 있다. 그래서 그냥 get-N을 하면 구할 수 있다.
| 날짜 |
|---|
| 20-12-23 |
https://stackoverflow.com/questions/38809580/how-to-get-list-from-page-in-spring-data-rest
page에서 list 빼오는 방법

params가 아니라 body -> form-data로 보내야 한다.