μμ, μλ°±λ§κ°μ λ°μ΄ν°λ₯Ό νλ²μ λ°ννλ€λ©΄..?
APIλ₯Ό κ°λ°νλ€ λ³΄λ©΄ λ°μ΄ν° 리μ€νΈλ₯Ό λ°ννλ μν©μ΄ 무쑰건 λ°μνλ€. κ·Έλ°λ° λ§μ½μ μλ¬΄λ° μ‘°μΉ μμ΄ λ°μ΄ν° 리μ€νΈλ₯Ό λ°ννλ€κ³ μκ°ν΄λ³΄μ. λͺμ, λͺλ°±κ°μ λ°μ΄ν°λ₯Ό μ²λ¦¬νλλ°λ ν° μκ΄μ΄ μμ§λ§ λͺμλ§, λͺ λ°±λ§κ°μ λ°μ΄ν°λ₯Ό λ°ννκ² λλ©΄ λ¬Έμ κ° λ°μν μ λ°μ μλ€. μ΄λ¬ν μν©μ λ°©μ§νκΈ° μν΄ μ°λ¦¬λ API μ€κ³μμ νμ΄μ§ λ‘μ§μ νμμ μΌλ‘ μ μ©μμΌμΌ νλ€.
νμ΄μ§μ μ μ©ν API ꡬν μμ
λ€μμ λλ§μ μ·μ₯ μλΉμ€μμ νμ΄μ§μ μ μ©ν μ· λ¦¬μ€νΈλ₯Ό λ°ννλ API ꡬν μμμ΄λ€.
@Setter
@Getter
public class ResponseForClothes extends PaginatedResponse {
private List<ContentForCloth> contents;
}
μ· λ¦¬μ€νΈλ₯Ό λ°ννκΈ° μν DTO μ΄λ€. contents νλμ ContentForCloth κ°μ²΄λ€μ΄ λ΄κΈ°κ² λλ€. ContentForClothλ Cloth μ λ³΄κ° λ΄κΈ°λ κ°μ²΄μ΄κ³ ResponseForClothesκ° μμλ°λ PaginatedResponseλ νμ΄μ§ μ²λ¦¬κ° νμν λͺ¨λ DTOκ° μμλ°λ κ°μ²΄μ΄λ€.
@Getter
@Setter
public class PaginatedResponse {
private Integer _code;
private String _message;
private Integer totalPages; // μ΄ νμ΄μ§ μ
private Integer pageNumber; // νμ¬ νμ΄μ§
private Integer numberOfElements; // νμ¬ νμ΄μ§μ μμ΄ν
κ°μ
private Integer size; // ν νμ΄μ§μ μ΅λ μμ΄ν
μ
private Long totalElements; // μ΄ μμ΄ν
μ
private Boolean isLast; // λ§μ§λ§ νμ΄μ§ μ¬λΆ
private Boolean isFirst; // 첫 νμ΄μ§ μ¬λΆ
public void setPageNumber(Integer pageNumber) {
this.pageNumber = pageNumber + 1;
}
}
PaginatedResponseλ Pageμ κ΄λ ¨λ μ 보λ₯Ό κ°μ§κ³ μλ€. νμ΄μ§ μ²λ¦¬λ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό μ λ¬νλ λ§νΌ κ·Έμ λ°λ₯Έ νμ΄μ§ μ 보λ₯Ό ν¨κ» λ°νν΄μΌ νλ€. (κ·ΈλμΌ ν΄λΌμ΄μΈνΈμμ λ°μ΄ν° μ²λ¦¬κ° κ°λ₯νλ€) μ, μ΄μ DTOμ λ°μ΄ν°λ₯Ό λ΄μ λ°ννκΈ°λ§ νλ©΄ νμ΄μ§ μ²λ¦¬κ° μμ±μ΄ λλ€. κ·Έλ λ€λ©΄ νμ΄μ§ λ‘μ§μ μ΄λ€μμΌλ‘ ꡬνν΄μΌ ν κΉ?
/** WardrobeService **/
@Transactional
public ResponseEntity<ResponseForWardrobes> findAll(int pageNumber, int pageSize) {
PageRequest pageRequest = PageRequest.of(pageNumber-1, pageSize);
Page<Wardrobe> paginationedWardrobes = wardrobeRepository.findAll(pageRequest);
return paginationService.convertToPaginatedWardrobes(paginationedWardrobes);
}
/** PaginationService **/
protected ResponseEntity<ResponseForWardrobes> convertToPaginatedWardrobes(Page<Wardrobe> paginatedWardrobes) {
List<ContentForWardrobe> wardrobes = new ArrayList<>();
ResponseForWardrobes responseForWardrobes = new ResponseForWardrobes();
for(Wardrobe wardrobe : paginatedWardrobes.getContent()) {
wardrobes.add(new ContentForWardrobe(
wardrobe.getId(),
wardrobe.getName(),
wardrobe.getClothes().size(),
wardrobe.getLikeCnt(),
wardrobe.getMember().getName())
);
}
responseForWardrobes.set_code(200);
responseForWardrobes.set_message("OK");
responseForWardrobes.setContents(wardrobes);
responseForWardrobes.setTotalPages(paginatedWardrobes.getTotalPages());
responseForWardrobes.setPageNumber(paginatedWardrobes.getNumber());
responseForWardrobes.setSize(paginatedWardrobes.getSize());
responseForWardrobes.setNumberOfElements(wardrobes.size());
responseForWardrobes.setTotalElements(paginatedWardrobes.getTotalElements());
responseForWardrobes.setIsLast(paginatedWardrobes.isLast());
responseForWardrobes.setIsFirst(paginatedWardrobes.isFirst());
return new ResponseEntity<>(responseForWardrobes, HttpStatus.OK);
}
λ€ννλ Hibernateλ νμ΄μ§ μ²λ¦¬λ₯Ό μ§μ μ 곡νλ€. PageRequestλ₯Ό ν΅ν΄ νμ΄μ§ λ²νΈμ νμ΄μ§ λΉ μ΅λ λ°μ΄ν° μλ₯Ό μ§μ ν΄μ£Όκ³ Repositoryμκ² λ겨주면 νμ΄μ§μ΄ λ 리μ€νΈκ° λ°ν λλ€. μ΄λ μ΄ λ°μ΄ν°λ Page ννλ₯Ό κ°μ§κ³ μλλ° νμ΄μ§κ³Ό κ΄λ ¨λ μ λ°μ μΈ μ 보λ ν¨κ» ν¬ν¨νκ³ μλ€. νΉλ³ν λ‘μ§ κ΅¬ν μμ΄ λ°νν΄μ€ νμ΄μ§ μ 보μ λ°μ΄ν°λ€μ DTOμ μλ§κ² 맀νμμΌ λ°νλ§ μμΌμ£Όλ©΄ μ΄λ¦¬ κ°λ¨νκ² νμ΄μ§ λ‘μ§μ APIμ μ μ©μν¬ μ μλ€.