오늘은 페이지를 눌럿을때 데이터가 여러개 있을 경우 10개씩 잘라서 1페이지에 1~10의 데이터 2 페이지에 11~20의 데이터 이런식으로 나오도록 할 것이다. 물론 코드를 일일히 다 뜯어보고 맛보진 못하였지만, 오늘과 같이 개인 프로젝트를 준비하면서 하나씩 비교해보고 분석해볼 생각이다. 자 그럼 시작해보자.


Member.java

따로 추가 해줄 내용이 없다.

MemberVo.java

 

//	paging
	private int thisPage = 1;				// 현재 페이지
	private int rowNumToShow = 10;			// 화면에 보여줄 데이터 줄 갯수
	private int pageNumToShow = 5;			// 화면에 보여줄 페이징 번호 갯수

	private int totalRows;					// 전체 데이터 갯수
	private int totalPages;				//전체 페이지 번호
	private int startPage;					// 시작 페이지 번호
	private int endPage;					// 마지막 페이지 번호
	
	private int startRnumForOracle = 1;		// 쿼리 시작 row
	private int endRnumForOracle;			// 쿼리 끝 row
	private Integer RNUM;
	
	private int startRnumForMysql = 0;		// 쿼리 시작 row

페이징의 데이터에대한 소스를 가져오긴 코드를 MemberVo.java에 삽입한다.

 

 

Generate Getter, Setter 야무지게 실행시켜준다. 

 

그럼 이런식으로 get,set 이 생성이 된다.

MemberDao.java
public int selectOneCount(MemberVo vo) {return sqlSession.selectOne(namespace + ".selectOneCount", vo);}

MemberDao.java에 다음 코드를 삽입해준다.

저런 오류가 발생하면 Ctrl + Shift + O  눌러주면 자동으로

Import가 된다.

다음과 같은 import가 등장, import 자동으로 호환할수 있도록 도와주는 도구 같은것으로 생각하면 된다.

MemberService.java
	public int selectOneCount(MemberVo vo) throws Exception;

 

MemberService.java 다음 코드 한줄을 생성시켜준다.

vo가 뭔지 모르는사람이 간혹있는데 vo는 데이터를 꺼내는것을 말하며

보통 조건과 함께 많이 쓰인다.

MemberServiceImple.java

MemberServiceImpl.java에 이런 오류가 발생하는데 마우스를 대고 F2를 가뿐하게 눌러주고,

 

첫번째 솔루션을 클릭해준다.

이렇게 오버라이드가 생기게되는데,

MemberService.java에 있는 객체를 끌고오기위해 dao.selectOneCount(vo)를 작성해준다.

MemberController.java
	@RequestMapping(value = "/member/memberList")
	public String memberList(@ModelAttribute("vo") MemberVo vo, Model model) throws Exception {

		int count = service.selectOneCount(vo);
		
		vo.setParamsPaging(count);
		
		if(count != 0) {
			List<Member> list = service.selecList(vo);
			model.addAttribute("list", list);
		} else {
		}
		return "member/memberList";
	}

이런식으로 오류가 뜨는건 정상이다. 이제 하나씩 채워주면서 오류를 없앨것이다.

@ModelAttribute("vo") 오류는 ctrl + shift + o 해주면 자동import로 해결된다

vo.setParamsPaging(count);는  memberVo.java에 생성자를 만들도 코드를 넣어주게되면

자동으로 없어질것이다. 

MemberVo.java
		public void setParamsPaging(int totalRowsParam) {
			
			totalRows = totalRowsParam;

			totalPages = totalRows / rowNumToShow;

			if (totalRows % rowNumToShow > 0) {
				totalPages = totalPages+ 1;
			}

			if (totalPages < thisPage) {
				thisPage = totalPages;
			}
			
			startPage = (((thisPage - 1) / pageNumToShow) * pageNumToShow + 1);

			endPage = (startPage + pageNumToShow - 1);

			if (endPage > totalPages) {
				endPage = (totalPages);
			}
			
			endRnumForOracle = ((rowNumToShow * thisPage));
			startRnumForOracle = ((endRnumForOracle - rowNumToShow) + 1);
			if (startRnumForOracle < 1) startRnumForOracle = 1;
			
			
			if (thisPage == 1) {
				startRnumForMysql = 0;
			} else {
				startRnumForMysql = ((rowNumToShow * (thisPage-1)));
			}
			
			System.out.println("getThisPage():" + thisPage);
			System.out.println("getTotalRows():" + totalRows);
			System.out.println("getRowNumToShow():" + rowNumToShow);
			System.out.println("getTotalPages():" + totalPages);
			System.out.println("getStartPage():" + startPage);
			System.out.println("getEndPage():" + endPage);		
			System.out.println("getStartRnumForOracle():" + startRnumForOracle);
			System.out.println("getEndRnumForOracle():" + endRnumForOracle);
			System.out.println("getStartRnumForMysql(): " + startRnumForMysql);
			
		
	}

다음 코드를 MemberVo.java 맨 아랫단에 넣어준다.

이게 페이징을 계산하고 갯수별로 나눠서 뿌리겠다는 알고리즘이다.

 

 

MemberMpp.xml
<sql id="selectCommon">  // 이건 중간에 삽입해줄 코드를 말한다. FROM 부터 작성.
		FROM 
		infrMember a
		LEFT JOIN
				infrMemberPhone b ON a.ifmmSeq = b.ifmmSeq
		LEFT JOIN 
				infrmemberEmail c ON a.ifmmSeq = c.ifmmSeq
		WHERE 1=1
			<choose>
			<when test="shOption == 1">AND a.ifmmName LIKE concat('%',#{shValue}, '%')</when>
			<when test="shOption == 2">AND a.ifmmId LIKE concat('%',#{shValue}, '%')</when>
			<when test="shOption == 3">AND b.ifmpNumber LIKE concat('%',#{shValue}, '%')</when>
			<when test="shOption == 4">AND c.ifmeEmailFull LIKE concat('%',#{shValue}, '%')</when>
			</choose>
		
	</sql>

	<select id="selectOneCount" resultType="Integer">
		SELECT
			count(*)
		<include refid="selectCommon" /> // 위에 적은  코드가 여기에 대입해주겠다는 의미

	</select>

	 <select id="selectList" resultMap="resultMapObj">
		
		SELECT		
		a.ifmmSeq
		,a.ifmmName
		,a.ifmmId
		,a.ifmmDelNy
		,b.ifmpNumber
		,c.ifmeEmailFull
		,a.regDateTime
			<include refid="selectCommon"/>  // 다음과 만찬가지이다. 맨위에 적은 코드를 여기에 적는다.
			limit #{startRnumForMysql}, #{rowNumToShow} // 페이지의 limit 값을 정해준다. 첫번째 행의 숫자, 두번째는 몇개씩 보여주냐는의미
	</select>

이코드를 resultMap 아랫단에 넣어준다.

MemberList.jsp
<form id="" name="" method="get" action="/member/memberList">
	<nav aria-label="Page navigation example">
		  <div class="ddd">
		  <ul class="pagination pagination-sm ">
			    <c:if test="${vo.startPage gt vo.pageNumToShow}">
			    	<!-- <li class="page-item"><a class="page-link" href="#"><<</a></li> -->
				    <li class="page-item"><a class="page-link" href="/member/memberList?thisPage=${vo.startPage - 1}">Previous</a></li>
			    </c:if>
		    	<c:forEach begin="${vo.startPage}" end="${vo.endPage}" varStatus="i">
					<c:choose>
			    		<c:when test="${i.index eq vo.thisPage}">
				    			<li class="page-item active"><a class="page-link" href="/member/memberList?thisPage=${i.index}">${i.index}</a></li>
						</c:when>
					<c:otherwise>     
					   			 <li class="page-item"><a class="page-link" href="/member/memberList?thisPage=${i.index}">${i.index}</a></li>
					</c:otherwise>
	    		</c:choose>
    		</c:forEach>
    		<c:if test="${vo.endPage ne vo.totalPages}">        
					    <li class="page-item"><a class="page-link" href="/member/memberList?thisPage=${vo.endPage + 1}">Next</a></li>
		    </c:if>
		  </ul>
		  </div>
		</nav>
     </form>

 

 

본인이 부트스트랩에서 또는 직접만든 페이징을 가져와서 다음과같이 값을 입혀준다.

 

 

페이징 구현 결과

 

 


 

 

 

To be continue..

 

복사했습니다!