프로젝트를 진행하며 페이징 기능을 구현해보았는데 이를 토대로 설명을 적어보겠다.
// 클라이언트 추천 게시판 목록
@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<> 에서 <>에 타입을 적어주니까!
설명 더 추가 예정
'Back-End > JAVA' 카테고리의 다른 글
[Java] record가 뭐야? (0) | 2025.03.25 |
---|---|
ajax - 댓글 삭제 (0) | 2023.12.13 |
List & Map (1) | 2023.12.08 |