vue + jpa project (8) - 게시판 Paging 처리 본문
vue + jpa project (8) - 게시판 Paging 처리
- 2023. 10. 25. 15:36
일단 BoardList.vue 파일에는 Paging 처리가 이미 되어 있고, 호출하는 부분만 약간 수정하면 된다.
일단 벡엔드 부분을 아래와 같이 추가하거나 수정하고, 이후에 vue 파일을 수정해보겠다.
1. 리턴 헤더 클래스 생성
model이라는 패키지를 추가하여 Header.java 파일을 아래와 같이 생성한다.
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@SuppressWarnings("unchecked")
public class Header<T> {
private LocalDateTime transactionTime;
private String resultCode;
private String description;
private T data;
private Pagination pagination;
//Simple OK
public static <T> Header<T> OK() {
return (Header<T>) Header.builder()
.transactionTime(LocalDateTime.now())
.resultCode("OK")
.description("OK")
.build();
}
//DATA OK
public static <T> Header<T> OK(T data) {
return (Header<T>) Header.builder()
.transactionTime(LocalDateTime.now())
.resultCode("OK")
.description("OK")
.data(data)
.build();
}
// Paging OK
public static <T> Header<T> OK(T data, Pagination pagination) {
return (Header<T>) Header.builder()
.transactionTime(LocalDateTime.now())
.resultCode("OK")
.description("OK")
.data(data)
.pagination(pagination)
.build();
}
// Error
public static <T> Header<T> ERROR(String description) {
return (Header<T>) Header.builder()
.transactionTime(LocalDateTime.now())
.resultCode("ERROR")
.description(description)
.build();
}
}
2. 페이징용 클래스 생성
이것 역시 model 패키지에 Pagination.java 파일을 아래와 같이 생성한다.
package com.example.vueJpaProject.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Pagination {
//페이지당 보여지는 게시글 최대 개수
private int pageSize;
//현재 페이지
int page;
//현재 블럭
int block;
//총 게시글 수
int totalListCnt;
//총 페이지 수
int totalPageCnt;
//총 구간 수
int totalBlockCnt;
//시작 페이지
int startPage;
//마지막 페이지
int endPage;
// 이전 구간 마지막 페이지
int prevBlock;
// 다음 구간 시작 페이지
int nextBlock;
// 인덱스
int startIndex;
public Pagination(Integer totalListCnt, Integer page, Integer pageSize, Integer blockSize) {
this.pageSize = pageSize;
//현재 페이지
this.page = page;
if(this.page < 1) this.page = 1;
//총 게시글 수
this.totalListCnt = totalListCnt;
//총 페이지 수
totalPageCnt = (int) Math.ceil(totalListCnt * 1.0 / this.pageSize);
//총 블럭 수
totalBlockCnt = (int) Math.ceil(totalPageCnt * 1.0 / blockSize);
//현재 블럭
block = (int) Math.ceil((this.page * 1.0) / blockSize);
if(block < 1) block = 1;
//블럭 시작 페이지
startPage = ((block - 1) * blockSize + 1);
//블럭 마지막 페이지
endPage = startPage + blockSize - 1;
//블럭 마지막 페이지 validation
if (endPage > totalPageCnt) endPage = totalPageCnt;
// 이전 블럭 (클릭 시, 이전 블럭 마지막 페이지)
prevBlock = (block * blockSize) - blockSize;
// 이전 블럭 validation
if (prevBlock < 1) prevBlock = 1;
//다음 블럭 (클릭 시, 다음 블럭 첫번째 페이지)
nextBlock = (block * blockSize + 1);
// 다음 블럭 validation
if (nextBlock > totalPageCnt) nextBlock = totalPageCnt;
startIndex = (this.page - 1) * this.pageSize;
}
}
3. 페이징 기본처리 Resolver 생성
패키지는 config 를 추가로 붙혀서 생성하고 WebMvcConfig.java 를 아래와 같이 생성한다.
반드시 @Configuration을 붙혀서 사전 처리를 하도록 한다.
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
SortHandlerMethodArgumentResolver sortArgResolver = new SortHandlerMethodArgumentResolver();
sortArgResolver.setSortParameter("sort");
sortArgResolver.setPropertyDelimiter("|");
PageableHandlerMethodArgumentResolver pageableArgResolver = new PageableHandlerMethodArgumentResolver(sortArgResolver);
pageableArgResolver.setOneIndexedParameters(true);
pageableArgResolver.setMaxPageSize(500);
pageableArgResolver.setFallbackPageable(PageRequest.of(0, 10));
argumentResolvers.add(pageableArgResolver);
}
}
4. 게시판 레파지토리 변경
기존 BoardRepository 파일에 Pagealbe 파라미터를 처리하는 메소드를 추가한다.
public interface BoardRepository extends JpaRepository<BoardEntity, Long> {
Page<BoardEntity> findAllByOrderByBoardNo(Pageable pageable);
}
5. 게시판 서비스 변경
기존의 메소드를 수정하거나 아니면 아래 소스를 추가한다. (저는 추가했음)
public Header<List<BoardDto>> getBoardList(Pageable pageable) {
Page<BoardEntity> boardEntities = boardRepository.findAllByOrderByBoardNo(pageable);
List<BoardDto> dtoList = new ArrayList<>();
for (BoardEntity entity : boardEntities) {
dtoList.add(entityToDto(entity));
}
Pagination pagination = new Pagination(
(int)boardEntities.getTotalElements()
, pageable.getPageNumber() + 1
, pageable.getPageSize()
, 10
);
return Header.OK(dtoList, pagination);
}
6. 게시판 컨트롤러 수정
기존의 메소드를 수정하거나 아니면 아래 소스를 추가한다.
(저는 추가했기 때문에 호출 맵핑을 구분하기 위하여 list_paging으로 하였다)
@GetMapping("/board/list_paging")
public Header<List<BoardDto>> boardList_paging(
@PageableDefault(sort = {"boardNo"}) Pageable pageable)
{
return boardService.getBoardList(pageable);
}
7. BoardList.vue 에서 axios를 통해서 가져오는 소스를 아래와 같이 바꾼다.
mounted()와 methods: 부분을 수정한 내용이다.
mounted() {
this.fnGetList()
},
methods: {
fnGetList() {
this.requestBody = { // 데이터 전송
page: this.page,
size: this.size
}
this.$axios.get(this.$serverUrl + "/board/list_paging", {
params: this.requestBody,
headers: {}
}).then((res) => {
this.list = res.data.data
this.paging = res.data.pagination
}).catch((err) => {
if (err.message.indexOf('Network Error') > -1) {
alert('네트워크가 원활하지 않습니다.\n잠시 후 다시 시도해주세요.')
}
})
},
fnPage(n) {
if(this.page !== n) {
this.page = n
}
this.fnGetList()
}
}
8. 테스트 데이터 임의 생성
Test 폴더에서 메인테스트 class 파일에 insertData 메소드를 아래와 같이 추가하고
Junit을 이용하여 실행시켜서 데이터를 임의로 생성하도록 한다. (이때 BoardEntity의 updDate 상단에 있는
@UpdateTimestamp 를 잠깐 주석처리하고 끝나면 다시 주석을 해제하자. 수정일자에 일단 날짜를 기본적으로
들어가지 않도록 함이다.)
package com.example.vueJpaProject;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class VueJpaProjectApplicationTests {
@Autowired
private BoardService boardService;
@Test
void contextLoads() {
}
@Test
void insertData() {
BoardDto dto = null;
for (int i = 1; i <= 101; i++) {
dto = new BoardDto();
dto.setTitle("게시글 제목" + i);
dto.setWriter("작성자" + i);
dto.setContent("게시글 내용" + i);
boardService.create(dto);
}
}
}
수정이 완료되면 화면에서 게시판 링크를 클릭하면 아래와 같은 화면이 조회된다.
하단에 페이징 처리가 되고 10개씩 조회가 되면 정상적으로 되는 것이다.
'프로그램 > Vue.js' 카테고리의 다른 글
vue + jpa project (10) - 게시판 검색조건 백엔드 처리 (0) | 2023.10.27 |
---|---|
vue + jpa project (9) - JPQL과 Query DSL의 비교 (0) | 2023.10.26 |
vue + jpa project (7) - 게시판 테이블 생성 및 백엔드 구성 (0) | 2023.10.25 |
vue + jpa project (6) - Vue 게시판 목록화면 생성 (0) | 2023.10.24 |
vue + jpa project (5) - Vue 레이아웃 정의 (0) | 2023.10.24 |
RECENT COMMENT