본문 바로가기

신세계 국비과정/신세계 - Spring 공부

15주차 배운점 - Spring mybatis Todo 프로그램 (테이블 페이징)

728x90
반응형

 

 

select * from tbl_todo order by tno desc limit 20, 10;

 

 

30 건너뛰는 데이터 수
10 가져오는 데이터 수
-> 뒤에서 30개 스킵해서 10개 가져와라

 

dto 디렉토리에

 


PageRequestDTO

 

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageRequestDTO {
    @Builder.Default
    @Min(value = 1)
    @Positive
    private int page = 1;

    @Builder.Default
    @Min(value = 10)
    @Max(value = 100)
    @Positive
    private int size = 10;

    public int getSkip(){
        return (page-1)*10; //limit 에서 사용하는 건너뛰기 (skip) 수를 위해 
    }
}

 

 

Todomapper interface

 

List<TodoVO> selectList(PageRequestDTO pageRequestDTO);

 

 

Todomapper.xml

 

  <select id="selectList" resultType="com.ssg.todo.domain.TodoVO">
        select * from tbl_todo order by tno desc limit #{skip}, #{size};
    </select>

 

 

MyBatis는 #{변수명} 형식을 만나면 다음과 같은 과정을 통해 값을 바인딩합니다:


객체의 Getter 메소드 호출: #{변수명}을 통해 참조된 변수에 해당하는 Getter 메소드를 호출합니다. 예를 들어, #{skip}는 getSkip() 메소드의 반환값을 사용합니다. 이는 JavaBean 규칙에 따라 변수명에 해당하는 get변수명() 메소드를 찾아 호출하는 방식입니다.


반환된 값 사용: Getter 메소드에서 반환된 값은 쿼리의 해당 위치에 바인딩되어 SQL 문에 사용됩니다

 

 

test

 

@Test
    public void testSelectList(){
        PageRequestDTO pageRequestDTO = PageRequestDTO.builder()
                .page(1)
                .size(10)
                .build();

        List<TodoVO> voList = todoMapper.selectList(pageRequestDTO);

        voList.forEach(vo->log.info(vo));
    }

 

 

 

 

페이지 개수 구하기


Todomapper interface

 

  int getCount(PageRequestDTO pageRequestDTO);

 

 

Todomapper.xml

 

<select id="getCount" resultType="int">
        select count(tno) from tbl_todo
    </select>

 

 

목록 데이터를 위한 DTO/서비스 계층

 

목록 화면에서 필요한 데이터를 하나의 DTO객체로 만들어서 사용하면 나중에 재사용이 가능
TodoDTO의 목록
전체 데이터의 수
페이지 번호의 처리를 위한 데이터들
(시작 페이지 번호/ 끝 페이지 번호)

 

현재 페이지 번호(page)를 기준으로
화면에 10개씩 번호 출력

 

page 1 : start 1 end 10
page 10 : start 1 end 10
page 11 : start 11 end 20

 

this.end = (Math.ceil(this.page / 10.0))*10
올림
1/10 => 0.1 => 10
11/10 => 1.1 => 2 => 20
10/10 => 1.0 => 1 => 10

 

this.start = this.end - 9;

 

total => 75개

 

페이지수는 8개

 

int last = (int)(Math.ceil(total/((double)size)));

 

this.end = end > last? last: end;

 

 

 

PageResponseDTO

 

 

@Getter
@ToString
public class PageResponseDTO<E> {
    private int page;
    private int size;
    private int total;
    //시작 페이지 번호
    private int start;
    //끝 페이지 번호
    private int end;
    //이전 페이지의 존재 여부
    private boolean prev;
    //다음 페이지의 존재 여부
    private boolean next;
    private List<E> dtoList;

    @Builder(builderMethodName = "All")
    public PageResponseDTO(PageRequestDTO pageRequestDTO, List<E> dtoList, int total){
        this.page = pageRequestDTO.getPage();
        this.size = pageRequestDTO.getSize();
        this.total = total;
        this.dtoList = dtoList;

        this.end =(int) (Math.ceil(this.page/10.0))*10;
        this.start = this.end - 9;
        int last = (int)(Math.ceil((total/(double)size)));
        this.end = end > last ?last :end;

        this.prev = this.start>1;
        this.next = total > this.end * this.size;
    }
}

 

 

PageRequestDTO

 

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageRequestDTO {
    @Builder.Default
    @Min(value = 1)
    @Positive
    private int page = 1;

    @Builder.Default
    @Min(value = 10)
    @Max(value = 100)
    @Positive
    private int size = 10;

    public int getSkip(){
        return (page-1)*10; //limit 에서 사용하는 건너뛰기 (skip) 수를 위해
    }
}

 

todoService

 

  PageResponseDTO getList(PageRequestDTO pageRequestDTO);

 

 

todoServiceimple

 

@Override
    public PageResponseDTO<TodoDTO> getList(PageRequestDTO pageRequestDTO){
        List<TodoVO> vos = todoMapper.selectList(pageRequestDTO);
        List<TodoDTO> dtos = vos.stream()
                .map(vo -> modelMapper.map(vo,TodoDTO.class))
                .toList();

        int total = todoMapper.getCount(pageRequestDTO);

        PageResponseDTO<TodoDTO> pageResponseDTO = PageResponseDTO.<TodoDTO>All()
                .dtoList(dtos)
                .total(total)
                .pageRequestDTO(pageRequestDTO)
                .build();

        return pageResponseDTO;
    }

 

 

test

반응형