본문 바로가기
Back-End/JAVA

페이징

by 호강하는 지해 2023. 12. 10.
728x90

프로젝트를 진행하며 페이징 기능을 구현해보았는데 이를 토대로 설명을 적어보겠다.

 

// 클라이언트 추천 게시판 목록
	@RequestMapping("/recommendList")
	public String recommendList(String page, Model model, HttpSession session) {

		// 페이지 값이 없을 땐 무조건 페이지 값을 1로 설정
		if (page == null || page.equals("")) {
			page = "1";
		}
		int currentPage = Integer.parseInt(page);
		// 일단 데이터(글)가 한 페이지에 몇 개를 띄워줄 건지 정해야함
		int rowPerPage = 5;
		// startRow와 endRow는 rowPerPage에 종속될 수 밖에 없다. 그래서 식에 꼭rowPerPage가 들어갈 수 밖에 없다.
		int startRow = (currentPage - 1) * rowPerPage + 1; // 1, 6, 11...
		int endRow = startRow + rowPerPage - 1; // 5, 10, 15...

		// total(db에 있는 전체 데이터 갯수)를 구해야 페이징할 때 페이지를 나눌 수 있으니까
		int total = recService.getTotal();

		PagingPgm pp = new PagingPgm(total, rowPerPage, currentPage);

		// recommend 테이블에는 startRow와 endRow가 없다. 이렇게 직접 recommend 객체에 추가로 설정해주기
		Recommend recommend = new Recommend();
		recommend.setStartRow(startRow);
		recommend.setEndRow(endRow);

		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

		list = recService.getList(recommend);

//		for(int i=0; i<list.size(); i++) {
//			System.out.println("이름값 : " +list.get(i).get("REC_NAME"));
//		}

		model.addAttribute("list", list);
		model.addAttribute("page", pp);

		return "recommend/recommendList";
	}

 

페이징 할 때 필요한 속성(필드)

currentPage : 현재 페이지

rowPerPage : 한 페이지에 띄울 데이터(글) 갯수

startRow : 한 페이지에서 띄울 글의 시작 번호

endRow : 페이지에서 띄울 글의 마지막 번호

total : DB에 저장되어 있는 전체 데이터(글) 갯수

 

== PagingPgm이라는 클래스에 따로 설계해놓은 부분 ==

pagePerBlk : 한 페이지에 나타낼 버튼 갯수

startPage : 한 페이지에 띄울 페이징 시작 번호

endPage : 페이지에 띄울 페이징 마지막 번호

 

<!-- 게시판 목록 (page번호를 전달받아서 startRow와 endRow를 구함) -->
	<select id="getList" parameterType="recommend" resultType="java.util.Map">
		select * from(select a.*, rowNum rn from(
		select * from recommend
		order by rec_no desc)a)
		where rn between #{startRow} and #{endRow}
	</select>

 

 참고로 recService.getList(recommend) 부분의 myBatis 쿼리문은 이러하다.

 

사실 테이블을 조인하지 않아서 Map 형식은 필요하지 않다. (이전글 참고 !!)

 

list 형식으로 컨트롤러 파일에서 view 파일로 데이터를 보내줬다면  forEach문 형식으로 출력하는 게 일반적인 방법인데

이때 List<Map> 형식으로 데이터를 저장해서 view 파일로 보내줬다면, view 파일에서는 ${list['REC_NAME']} 이렇게 [‘ ’] 안에 대문자로 받아와야하고  view 페이지에서 값을 받는 것이기 때문에 ${} 를 꼭 써줘야 한다.

 

 

 <ul class="list-group">

        <c:forEach var="list" items="${list}">

            <li class="list-group-item">

                <a href="recommend_detail"><h3 style="text-align: left;">${list['REC_NAME']}</h3></a>

            </li>

        </c:forEach>

var=“list”로 설정해놓은 별칭명으로 뽑아낼 때 ${list['REC_NAME']} 앞에 이렇게 써서 뽑아내는 것 !!

items forEach문에서 배열의 길이만큼 돌리고 싶을 , 컨트롤러에서 보내준 list 써주면 된다.

 

 

 

또한 내가 페이징 기능을 구현하며 겪었던 오류도 적어놓겠다.

== 자꾸 오류가 떴던 이유 ==

  • resultType 을 recommend로 적었었는데 우리는 Map으로 받아오니까 바꿔주어야 했음 
  • 여기서 질문 ! list arraylist 아닌 map 타입인가요?                                                                                        생각해보면 우리가 list 받아와도 안에 객체로 있으면 resultType 객체로 적었었음. list 안에 map타입으로 담겨 있으니 반환타입은 map이다. List<> 에서 <> 타입을 적어주니까!

설명 더 추가 예정

728x90

'Back-End > JAVA' 카테고리의 다른 글

[Java] record가 뭐야?  (0) 2025.03.25
ajax - 댓글 삭제  (0) 2023.12.13
List & Map  (1) 2023.12.08