무소의 뿔처럼

스프링부트) 페이징.. 본문

알아두기/Spring

스프링부트) 페이징..

값을변경 2022. 8. 23. 17:26

jsp 할 때 구글링 해가면서 한번 한 적이 있음. 

이해를 못했음.. 이것이겠거니 하면서 코드 짜맞춤..

 

스프링부트 연습하면서 페이징 한번 해 보겠다고 마음먹었는데

으레 겁이나고 복잡한 생각에 집중이 잘 되지 않음..

 

각오. 구글링되어 api처럼 다니는 코드를 먹지 말고, 내가 한번 해보자~

 

생각

1. 총 게시글을 DB에서 가져옴

2. DB에서 가져온 data를 나누던 더하던 수식으로 페이지도 나누고

한 페이지당 들어가는 게시글도 선택 = 한 묶음으로 봄.

 

실행

1. 정말 복잡하고, 전체에서 들어가려니 길이 안보임.

2. '페이지 번호'와 '페이지 안 게시글 개수'를 한 개로 보는 것이 안되었다.

 

생각 수정 

전체 게시글수를 DB에서 데리고 옴

목록을 내가 원하는 게시글의 개수만큼 보이도록 쿼리를 작성.

페이지 수를 html에 보여줌  <c:forEach>

페이지 번호를 쿼리스트링으로 보냄 

이 쿼리스트링으로 한 페이지의 첫 게시글 번호와 끝 게시글 번호를 계산함.

첫 게시글 번호와 끝 게시글 번호를 쿼리에 적용. pstmt같이


1. url을 쿼리스트링으로 받아오기

 

+1을 해주는것은 반올림같이 생각해서 썼는데 

9개 게시글을 한 페이지에 4개씩 담으려면, 2개가 아니라 3개가 필요하기 때문이다.

 int totalPage = total/pageInItems+1;

 

게시글 갯수는 내가 원하는 숫자 넣었고, model에 담아 보냄.

//한 페이지에 게시글 몇개?
int pageInItems = 100;

//총 페이지는 몇장?
int total = baseInfoDao.totalCount();
int totalPage = total/pageInItems+1;
model.addAttribute("total", totalPage);

 

c태그 for문으로 페이지 개수 뿌렸다.

<c:forEach var="i" begin="1" end="${total}">
	<a href = "Form?pageNo=${i}">${i}</a>
</c:forEach>

 

컨트롤에서는 pageNo를 받을 것.

그리고 이 pageNo로 startNum과 endNum의 값을 넣어준다.

int startNum = ((pageNo-1)*pageInItems)+1;
int endNum = pageNo * pageInItems;

2. 현재 전체 목록을 불러오는 쿼리를 수정 :

select * from
(select a.*, rownum rnum from
(select * from table) a)
where rnum between #{param1} and #{param2}

param1과 param2는 각각 startNum와 endNum

rownum을 빌려 쓰는데, 예전에 수업받았을 때 기억으로는 rownum은 무조건

1이 포함되어 있어야 검색결과가 나온다~였다. 

1~10은 결과가 나오지만 2~10은 안나옴.

 

서브 쿼리를 사용하여

-1. 전체 목록 불러오기

-2.rownum을 불러오기 : column에서 볼 수 있음.

-3.where 절로 rownum을 데리고 오기 


문제가 있었다.

쿼리 스트링을 쓰니, 기본 mapping 된 url로 가면 에러 생긴다.

그때 잊지 말고 @RequestParam( defaultValue = "값") 사용하길


잠깐 정리 좀;

전체 게시글 수 => 페이지 개수를 정하는 데에 쓰임

쿼리 스트링 => 첫 게시글 번호와 끝 게시글 번호를 계산하는 데에 쓰임

Dao의 list 함수에 매개변수로 첫 게시글 번호와 끝 게시글 번호를 넣어서 조회.

(List로 가져오는 거야.. 헷갈리지 마, 똑같이 조회하는 건데 내가 원하는 rownum을 가져오는 것뿐이야.) 


몇 번 안 해봐서 인지 아직도 어지럽다.  

jsp가 익숙해서 (물론 시험에 속해있던 것만) 

스프링은 왠지 중간중간이 삭제되어 띄엄띄엄 있는 기분이다.. ㅎㅎㅎ 

머릿속에서 로직을 따라가다가 가끔 놓쳐버린다 ㅋㅋ

편하긴 엄청 편하다.. 일주일 안되게 공부하고 있는데

내가 원하는 것을 쓱 가져와주고 대신 배달해주고 하는 것 같다.

 

나중에 까먹을까 봐 적어 두었으니.. 길 잃을 때 봐라..


 

 

더보기

 

Controller.java

@RequestMapping("/admin/admininfoListForm")
	public String infoDto(Model model, @SessionAttribute("loginID") String loginID,
			@RequestParam(name = "pageNo", defaultValue = "1")int pageNo){
			
			System.out.println("어드민컨트롤_검색:"+loginID);
			if(loginID == null) {
				return "../log";
			}
		
			 //한 페이지에 게시글 몇개?
			  int pageInItems = 100;

			  //총 페이지는 몇장?
			  int total = baseInfoDao.totalCount();
			  int totalPage = total/pageInItems+1;
			  model.addAttribute("total", totalPage);
			
			  //각 페이지의 몇번째 게시글이 올것인지
			  int startItem = ((pageNo-1)*pageInItems)+1;
			  int endItem = pageNo * pageInItems;
			
				//리스트
				//List<baseInfoDto> list = baseInfoDao.baseinfoList();
			  	List<baseInfoDto> list = baseInfoDao.viewpaging(startItem, endItem);
				model.addAttribute("admininfo", list);
				System.out.println(list);
			
			System.out.println("어드민컨트롤_리스트"+list);
			
		return "admin/admininfoListForm";
	}

 

Dao.interface

public int totalCount();
public List<baseInfoDto> viewpaging(int startPage, int endPage);​

 

Mapper.xml

<select id="viewpaging" resultType="com.table.data.dto.baseInfoDto">
    select * from
    (select a.*, rownum rnum from
    (select * from company_baseinfo_tbl) a)
    where rnum between #{param1} and #{param2}
</select>

<select id="totalCount" resultType="int">
	select count(*) from company_baseinfo_tbl
</select>

 

html.jsp

//총 게시글 갯수로 for문 돌리기
<c:forEach var="i" begin="1" end="${total}">
	<a style="margin-left: 20px; font-size: 1.5em" href = "admininfoListForm?pageNo=${i}">${i}</a>
</c:forEach>


//list가져오기
<c:forEach var="admininfo" items="${admininfo }">

 

 

Comments