Blog 게시판 만들기 (7) - 페이징 (2) : PagingView 연산 처리

bethe·2022년 9월 11일
0

Springboot

목록 보기
38/46
post-custom-banner

📝 PagingView 연산 처리

1. DB 쿼리문

PagingView에서 받아야 할 값들을 DB에서 연산처리 해보자.

1) 쿼리문 세팅

select count(*) totalCount, 0 totalPage, 0 currentPage, 0 first, 0 last
FROM boards;

2) totalPage

select count(*) totalCount, ceil(count(*)/10) totalPage, 0 currentPage, 0 first, 0 last
FROM boards;

3) 코드가 복잡해지므로 inline View로 정리

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
);

  • totalPage에 -1을 한 이유는 currentPage가 0부터 시작하기 때문이다.

2. Mapper

	<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라는 변수로 받는다.


3. PagingView 파라매터 맞춰주기

🤔 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;
}

4. DAO

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인 메서드 생성


5. Controller

	@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";
	}

6. Test(main.jsp)

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>

  • DB에서 1을 return 받으면 Java에서 true로 받을 수 있음 또한 확인 가능
profile
코딩을 배우고 기록합니다. 읽는 사람이 이해하기 쉽게 쓰려고 합니다.
post-custom-banner

0개의 댓글