PagingView에서 받아야 할 값들을 DB에서 연산처리 해보자.
select count(*) totalCount, 0 totalPage, 0 currentPage, 0 first, 0 last
FROM boards;
select count(*) totalCount, ceil(count(*)/10) totalPage, 0 currentPage, 0 first, 0 last
FROM boards;
SELECT totalCount,
totalPage,
currentPage,
decode(currentPage, 0, 1, 0) first,
decode(currentPage, totalPage-1, 1, 0) last
FROM
(
select count(*) totalCount, ceil(count(*)/10) totalPage, 0 currentPage, 0 first, 0 last
FROM boards
);
<select id="paging"
resultType="site.metacoding.red.domain.boards.mapper.PagingView">
SELECT totalCount,
totalPage,
currentPage,
decode(currentPage, 0, 1, 0) first,
decode(currentPage, totalPage-1, 1, 0) last
FROM
(
select count(*) totalCount, ceil(count(*)/10) totalPage, #{page} currentPage, 0
first, 0 last
FROM boards
)
</select>
currentPage는 getBoardList 메서드에서 page라는 변수로 받는다.
🤔 PagingView에서 isLast와 isFirst 변수명을 수정해야 하나?
💡 수정하지 않아도 된다.
STS의 Java에서는 boolean 타입 파라매터 앞에 is를 붙이게 되어 있다.
el표현식은 변수명만 적어주면 getter를 실행하여 값을 받는데, boolean 타입은 is를 생략한 파라매터값(Last, First)만 적어주면 값을 받을 수 있다.
⇒ 수정할 필요가 없다.또한 boolean 타입의 경우 getter가 생성될 때
get[변수명]
으로 메서드명이 지어지지 않고 변수명 그대로 생성된다.private boolean isLast; //getter가 만들어지면 getisLast()가 아닌 isLast() 이름으로 만들어짐 -> el표현식에서는 last로 찾아짐 private boolean ifFirst; //getter가 만들어지면 getisFirst()가 아닌isFirst() 이름으로 만들어짐 -> el표현식에서는 last로 찾아짐
package site.metacoding.red.domain.boards.mapper;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class PagingView {
private Integer startNum;
private Integer totalCount;
private Integer totalPage;
private Integer currentPage;
private boolean isLast;
private boolean isFirst;
}
package site.metacoding.red.domain.boards;
import java.util.List;
import site.metacoding.red.domain.boards.mapper.MainView;
import site.metacoding.red.domain.boards.mapper.PagingView;
public interface BoardsDao {
public PagingView paging(Integer page);
public void insert(Boards boards);
public Boards findById(Integer id);
public List<MainView> findAll(Integer startNum);
public void update(Boards boards);
public void delete(Integer id);
}
메서드 id=paging(파라매터는 page), 받을 타입은 PagingView인 메서드 생성
@GetMapping({"/","/boards"})
public String getBoardList(Model model, Integer page) { // 0->0, 1->10, 2->20 연산하여 startNum을 만들어줘야 함
if(page==null) page = 0; //if문에서 한줄은 {}안써도 됨
Integer startNum = page * 10;
List<MainView> boardsList = boardsDao.findAll(startNum);
PagingView paging = boardsDao.paging(page);
model.addAttribute("boardsList", boardsList);
model.addAttribute("paging", paging);
return "boards/main";
}
jsp파일에 임시로 PagingView값을 출력하는 영역을 만들어 값이 잘 나오는지 확인해보자.
<div style="background-color: 'grey' ;">
<h3>totalCount : ${paging.totalCount}</h3>
<h3>totalPage : ${paging.totalPage}</h3>
<h3>currentPage : ${paging.currentPage}</h3>
<h3>isLast : ${paging.last}</h3>
<h3>isFirst : ${paging.first}</h3>
</div>