느림보 개발

7. SpringMVC - 페이징 처리 본문

코드 정리/Spring Framework

7. SpringMVC - 페이징 처리

@르르 2023. 1. 24. 19:52

 

Controller

 

- 찜목록에 대한 요청을 처리하기 위한 컨트롤러를 매핑한다. 

- session에 있는 사용자 아이디를 String user_id로 저장하여, 사용자의 찜목록의 개수를 세는 로직을 실행하여 likeListCnt에 저장한다. 

- PageMakerVO 객체 생성하여 setVo에 PageVO에 기본 값을 세팅하고, setTotalCnt에 DB에서 얻어온 값을 세팅한다. 

- 참조변수 pm을 model객체에 담아 view로 보낸다. 

- pm와 user_id를 가지고 likeList 찜목록들을 얻어오는 로직을 실행하여 model 객체에 담아 view로 보낸다. 

@RequestMapping(value="/likeListAll", method=RequestMethod.GET)
	public void listLikeAllGET(Model model, PageVO vo,HttpSession session) throws Exception {
		String user_id = (String)session.getAttribute("user_id");
		Integer likeListCnt = service.likeListCnt(vo,user_id);
	
		
		//페이징 처리 하단부 정보 저장
		PageMakerVO pm = new PageMakerVO();
		pm.setVo(vo);
		pm.setTotalCnt(likeListCnt);
		
		log.info("pmVO :"+pm);
		log.info("pageVO :"+vo);
		
		//페이징 처리 객체를 어트리뷰트에 담아 view로 보냄
		model.addAttribute("pm", pm);

		model.addAttribute("likeList",service.likeList(pm, user_id));
		
	}

 

 

 

Service, Impl 

 

//찜 목록 리스트 
public List<LikeListVO> likeList(PageMakerVO pm, String user_id) throws Exception;
			
// 찜 목록 페이징에 필요한 찜목록 글개수
public Integer likeListCnt(PageVO vo, String user_id) throws Exception;

 

//찜목록
@Override
public List<LikeListVO> likeList(PageMakerVO pm, String user_id) throws Exception {

	return dao.likeList(pm,user_id);	
		
}
	
// 찜 목록 페이징에 필요한 찜목록 글개수
@Override
public Integer likeListCnt(PageVO vo, String user_id) throws Exception {
		
		
	return dao.likeListCnt(vo,user_id);
}

 

 

 

 

DAO, Impl 

 

 

//찜 목록
public List<LikeListVO> likeList(PageMakerVO pm, String user_id) throws Exception;

//찜 목록 글갯수
public Integer likeListCnt(PageVO vo, String user_id) throws Exception;

 

//찜목록
	@Override
	public List<LikeListVO> likeList(PageMakerVO pm, String user_id) throws Exception {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("pm", pm);
		map.put("user_id", user_id);
		
		return sqlSession.selectList(NAMESPACE+".likeList",map);
	}

	//찜목록 개수
	@Override
	public Integer likeListCnt(PageVO vo, String user_id) throws Exception {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("vo", vo);
		map.put("user_id", user_id);
	
		return sqlSession.selectOne(NAMESPACE+".likeListCnt",map);

	}

 

 

 

 

mapper

 

 

<!-- 찜 내역 띄우기 -->
	<select id="likeList" resultType="LikeListVO" >
	select p.seller_id, p.prod_name, p.price, l.`check`,p.prod_num
	from mfg_products p join mfg_like l 
	on p.prod_num = l.prod_num
	join mfg_member m 
	on l.buyer_id = m.user_id
	where m.user_id=#{user_id}
	limit #{pm.startRow},#{pm.vo.perPageNum}
	</select>
	
<!-- 찜한 상품 개수 띄우기 -->
	<select id="likeListCnt" resultType="Integer">
		select count(*)
		from mfg_like
		where buyer_id=#{user_id}
	</select>

 

 

 

 

PageVO

 

 

- 페이징 처리에 필요한 정보를 관리하는 객체

 

public class PageVO {
	private int page;		// 페이지
	private int perPageNum; // 페이지 크기
	
	public PageVO() {
	// 페이징 처리의 정보가 없을 때(기본값)
		this.page = 1;
		this.perPageNum = 6;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		// 0보다 작은 페이지 정보 호출
		if(page <= 0) {
			this.page = 1;
			return;
		}
		this.page = page;
	}

	public int getPerPageNum() {
		return perPageNum;
	}

	public void setPerPageNum(int perPageNum) {
		// 한번에 보여줄 글의 수
		if(perPageNum < 6 || perPageNum > 100) {
			this.perPageNum = 6;
			return;
		}
		this.perPageNum = perPageNum;
	}
	
	// mapper의 #{pageStart} 요소를 위한 메서드
	public int getPageStart() {
		return (this.page - 1) * perPageNum;
	}
	

	@Override
	public String toString() {
		return "PageVO [page=" + page + ", perPageNum=" + perPageNum + ", session=" + session + ", seller_id="
				+ seller_id + "]";
	}


	
	
	
	
	
}

 

 

 

 

PageMakerVO 

 

 

- 페이징 처리에 관한 모든 동작 관리( 개수 출력 + 하단 페이징 블럭)

 

public class PageMakerVO {
	
	private static final Logger log = LoggerFactory.getLogger(PageMakerVO.class);
	
	
	
	private int totalCnt;	// 총 글의 수
	private int startPage;  // 페이지 블럭 시작페이지
	private int endPage;	// 페이지 블럭 끝 페이지
	private boolean prev;		// 이전
	private boolean next;		// 다음
	
//	private int page;
//	private int perPageNum;
	private PageVO vo;		// 페이지 번호, 페이지의 크기
	
	private int displayPageNum = 5;   // 페이지 블럭의 크기 
	
    
    public int getStartRow() {
		
	  return (vo.getPage()-1)*vo.getPerPageNum(); 
	}
    
	public void setVo(PageVO vo) { // 이미생성된 객체 사용
		this.vo = vo;
		System.out.println(vo);
	}
	public void setTotalCnt(int totalCnt) {
		this.totalCnt = totalCnt; // DB에서 계산된 값으로 초기화
		calcData();
	}
	
	public void calcData() {
		log.info("페이징 처리 필요값 계산하기");
		
		endPage = (int)Math.ceil(vo.getPage()/(double)displayPageNum) * displayPageNum;
		
		startPage = endPage - displayPageNum + 1;
		

		log.info("endPage:"+endPage);
		log.info("startPage:"+startPage);
		
		// 모든 글개수 / 페이지 사이즈 => 총 필요한 페이지 수
		int tmpEndPage = (int)Math.ceil(totalCnt / (double)vo.getPerPageNum());
		
		if(endPage > tmpEndPage) {
			endPage = tmpEndPage;
		}
		
		// 이전
		prev = (startPage == 1)?false:true;
		
		// 다음
		next = ((endPage * vo.getPerPageNum()) >= totalCnt)?false:true;
		
		log.info("페이징 처리 필요값 계산하기 완료");
	}
	
	public int getTotalCnt() {
		return totalCnt;
	}
	public int getStartPage() {
		return startPage;
	}

	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}

	public int getEndPage() {
		return endPage;
	}

	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}

	public boolean isPrev() {
		return prev;
	}

	public void setPrev(boolean prev) {
		this.prev = prev;
	}

	public boolean isNext() {
		return next;
	}

	public void setNext(boolean next) {
		this.next = next;
	}

	public PageVO getVo() {
		return vo;
	}

	public int getDisplayPageNum() {
		return displayPageNum;
	}
	public void setDisplayPageNum(int displayPageNum) {
		this.displayPageNum = displayPageNum;
	}
	
	@Override
	public String toString() {
		return "PageMakerVO [totalCnt=" + totalCnt + ", startPage=" + startPage + ", endPage=" + endPage + ", prev="
				+ prev + ", next=" + next + ", vo=" + vo + ", displayPageNum=" + displayPageNum + "]" + getStartRow();
	}

	
}

 

 

 

LikeListVO

 

- 페이지 정보와 사용자 정보를 통해 찜목록을 가져올때 저장하기 위한 객체 생성

 

public class LikeListVO {
	
	
	private String seller_id;
	private String user_id;
	private String prod_name;
	private int price;
	private int check;
	private int prod_num;
	
	
	
	public String getSeller_id() {
		return seller_id;
	}
	public void setSeller_id(String seller_id) {
		this.seller_id = seller_id;
	}
	public String getUser_id() {
		return user_id;
	}
	public void setUser_id(String user_id) {
		this.user_id = user_id;
	}
	public String getProd_name() {
		return prod_name;
	}
	public void setProd_name(String prod_name) {
		this.prod_name = prod_name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public int getCheck() {
		return check;
	}
	public void setCheck(int check) {
		this.check = check;
	}
	
	public int getProd_num() {
		return prod_num;
	}
	public void setProd_num(int prod_num) {
		this.prod_num = prod_num;
	}
	@Override
	public String toString() {
		return "LikeListVO [user_id=" + user_id + ", prod_name=" + prod_name + ", price=" + price + ", check=" + check
				+ ", prod_num=" + prod_num + "]";
	}
	
	
	
}

 

 

 

 

 

 

 

 

Comments