Spring Boot 시작하기 #12

ims·2020년 9월 3일

Spring Boot 시작하기 !

목록 보기
12/14

truncate

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.

https://wookmania.tistory.com/113

Paging 처리

@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의 구성을 알 수 있다.

Pagable setting

@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를 지정할 수 있다.

UserController

@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);
    }
}

UserApiService.search

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해주어야 한다.

reponseForPagable

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의 값)만큼 출력이 된다.

Pagination

현재 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을 하면 구할 수 있다.

Pageable getContent()

날짜
20-12-23

https://stackoverflow.com/questions/38809580/how-to-get-list-from-page-in-spring-data-rest

page에서 list 빼오는 방법

실수

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

profile
티스토리로 이사했습니다! https://imsfromseoul.tistory.com/ + https://camel-man-ims.tistory.com/

0개의 댓글