Spring

JSP/Spring (Mybatis - Mariadb) Paging 구현

jaewoo 2022. 8. 31. 21:52

이 글은 자바 웹개발워크북(구멍가게 코딩단) 책을 보고 공부한 내용입니다.

 

1. 먼저 요청을 받을 RequestDTO를 생성한다.

 

2. 응답을 보낼 ResponseDTO를 생성한다.

 

3. 컨트롤러에서 RequestDTO를 받아 Service 로직에 넘기는 걸 구현한다.

 

 

RequestDTO 생성하기

@Builder.Default를 통해 객체를 생성할때 지정해주지 않으면 자동 으로 page는 1 size는 10이 들어가도록 설정함 

getSkip은 

limit 뒤에 skip에 넣을 값이다. page가 1일 경우 skip값은 0이 들어가기에 아무 값도 넘기지 않고 바로 보여준다. 

 

limt 뒤에 첫번째로 오는 숫자는 넘기는 값이다. 만약 데이터가 20개가 있다고 가정하고

    select * from todo order by id desc limit 10 10;

이 문장을 실행한다면 11번째 데이터부터 20번째 데이터 값이 들어온다 첫번째 값만큼 넘어간 뒤 그 뒤에 데이터를 보여주는 것이다.

mapper 인터페이스에 seletList를 통해 sql문을 실행한다. 매개변수로 RequestDto를 받아서 위에 limit 쿼리를 실행시킬 것이다. 

 

이제 responseDTO를 만들어야한다.

 

위에 builderMethodName은

이 이름을 가진 메소드를 만들어준다. 

PageResponseDTO는 PageRequestDTO를 받아서 page와 size값을 먼저 필드에 할당한다. 그리고 데이터 개수도 할당한다.

dtoList는 데이터들인데 이 데이터들은 위에 request를 통해 selectList 메소드로 받아온 데이터들을 받을 것이다.

end start는 현재 화면에 보여지는 페이지들에 넘버이다. 그리고 last는 전체에 마지막 데이터이다.

 

만약 현재 페이지가 11페이지라고 가정하자

this.end 값에는 (int)(Math.ceil(11/10.0)) x10 일 것이다. 이 식은 (int)(Math.ceil(1.1)) x10 그리고

(int)(2.0)x10 이 되고 결국 20이란 값이 나온다. 현재 내가 11페이지를 보고 있다면 밑에 페이지 바에 나오는 마지막 페이지 넘버가 20이라는 뜻이된다. last는 총 데이터에 마지막 페이지 넘버를 의미한다.  

end를 삼항연산자로 표현한 이유는 만약 last가 화면에 보인다는 것은 이제 더 이상 뒤에 페이지가 없다는 것인데 그 뒤에 숫자까지 계산해버리면 안되기 때문에 삼항연산자를 사용했다.

 

이제 Service로직을 구현한다.

 

  • selectList를 통해 원하는 페이지에 어느정도 크기에 데이터를 가져온다.
  • 가져온 데이터를 형변환을 modelMapper로 시킨다. 
  • count() sql문으로 설정했던 결과를 total에 할당한다. 모든 데이터 개수이다.
  • 이제 이 두개에 값 ( dtoList,total)을 Builder에 넣을 것이다. 그리고 page와 size에 대한 정보를 가진 pageRequestDto도 할당한다.
  • <TodoDTO>withAll()은 위에서 보여줬던 Builder 패턴을 통해 만들때 지정한 메소드이고 이 메소드 반환 타입을 지정하기 위해 제네릭을 사용했다. 결국 보여줄 데이터 타입은 TodoDTO를 보여주게 된다.

컨트롤러이다. 컨트롤러에서 RequestDTO로 size와 page값을 받을 것이고 만약 잘못된 값이 넘어올수 있기에 @Valid설정을 함 그리고 에러가 날경우 BindingResult를 통해 에러를 확인하고 있다면 기본 객체를 넣는다. 하지만 기본 객체도 @Builder.Default를 통해 우리가 지정한 기본값 (page=1 ,size10) 이 들어간 객체를 requestDTO에 넣는다.

 

결과 확인

첫번째 페이지 10개에 데이터가 잘 나오는 것을 볼 수 있다.

'Spring' 카테고리의 다른 글

JPA - N+1  (0) 2022.09.19
JPA - @EntitiyGraph, @Transactional Database - NoSession 해결  (0) 2022.09.15
JPA - Querydsl 정의(간단한 검색기능)  (0) 2022.09.03
PRG(Post-Redirect-GET) 패턴  (0) 2022.08.22
Springboot(JPA)-Page 구현  (0) 2022.08.21