반응형
❤ 김춘장이의 위키백과 - 나만의 공부 기록 Tistory ❤
포스팅 전
동거인이 오도방구 사고를 당했다😿
큰 사고는 아니었지만, 프로젝트를 곧 시작해야 해서 준비해야 하는 기간에
나는 병간호를 해야 했고, 주말 내내 정신없이 보냈다
그렇게 새해를 맞이하게 되었고, 이대로 손 놓고 있으면 안 될 것 같아
다시 정신 차리고 병간호 중 다시 노트북을 켜기 시작했다
페이징처리
타 웹사이트 여러 곳의 게시판을 보면 게시판만에 '고유’ 패턴이 있다
꼭 있어야 하는 기능들이다.
- 최신 글부터 상단부터 시작해 순차 정렬한다
- 한 페이지에 모든 글을 다 출력하지 않고 페이지를 나눠서 출력한다
- 페이지당 10개의 게시글을 보여준다면 페이지 목록 하단에 숫자를 표기하여 페이지를 이동한다
선생님은 한 코드를 보내주셨고 분석하는 법과 적용하는 법을 고려해 보라고 하셨다
나의 해결방법
- 페이지당 몇 개의 게시글을 보여줄 것 인지 정한다
- rownum을 사용하여 번호를 정해준다
- 가장 최근 게시물이 1번째에 나오도록 order by 옵션 필요
- 1번째 페이지엔 1~10번째 글
2번째 페이지엔 11~20번째 글
3번째 페이지엔 21~30번째 글… 반복되도록 하며 횟수는 모든 게시글이 표현될 때까지 이다 - 총게시물을 가져와야 한다
- 총 게시물 개수를 가지고 페이지당 게시글을 보여주는 것을 계산한 뒤 rownum을 기준으로 출력하도록 한다
- 최대한 jsp파일은 변경이 되지 않도록 한다
페이징처리 소스코드
// 컨트롤러단
// 모든 게시글 보기
@RequestMapping(value = "ContactUS", method = RequestMethod.GET)
public String contactView(Model model, @ModelAttribute PageVO pageVO){
if(pageVO.getPage()==null){pageVO.setPage(1);}
pageVO.setTotalCount(contactService.totalPostCont());
pageVO.prt();
model.addAttribute("list", contactService.selectAll(pageVO));
model.addAttribute("pagevo", pageVO);
return "ContactUsView";
}
@Service
// 글 모두 가져오기
@Override
public List<ContactDTO> selectAll(PageVO pageVO) {
return contactDAO.selectAll(pageVO);
}
...
// 게시글 total 가져오기
public int totalPostCont(){
return contactDAO.totalPostCnt();
}
DTO객체 생성
public class PageVO {
private int startNo;
private int endNo;
private int perPageNum=10;
private Integer page; // Integer 웹에서 받은 페이지 정보(String)가 없으면 null인데 int는 null을 저장할 수 없다. 오류방지
private int totalCount;
private int endPage;
private int startPage;
private boolean prev;
private boolean next;
// 검색용 변수 2개 추가
private String searchType;
private String searchKeyword;
public void prt() {
System.out.println("StartNo : "+startNo);
System.out.println("endNo : "+endNo);
System.out.println("startPage : "+startPage);
System.out.println("endPage : "+endPage);
}
...
private void calcPage() {
// DB쿼리에서 사용... 시작데이터번호 = (jsp클릭한 페이지번호-1)*페이지당 보여지는 개수
startNo = (this.page - 1) * perPageNum +1; // 6페이지 일 경우 시작글번호가 50부터..
// page변수는 현재 jsp에서 클릭한 페이지번호
int tempEnd = (int) (Math.ceil(page / (double) this.perPageNum) * this.perPageNum);
// 6/10=0.6 > 1 10
// 11/10=1.1 > 2 20
// ceil함수는 천장 함수로 1.1 = 2, 2.1 = 3 으로 출력된다.
// 반대되는 바닥함수로 floor(), 반올림 함수로 round()가 있다.
// jsp에서 클릭한 페이지번호를 기준으로 끝 페이지를 계산한다.
this.startPage = (tempEnd - this.perPageNum) + 1;
// 6 10 - 10 + 1 >> 1
// 11 20 - 10 + 1 >> 11
// 시작 페이지 계산 클릭한page번호 10일때 까지 시작페이지는 1
if (tempEnd * this.perPageNum > this.totalCount) {
// 클릭한 page번호로 계산된 게시물수가 실제게시물개수 totalCount 클때
this.endPage = (int) Math.ceil(this.totalCount / (double) this.perPageNum);
//this.endNo = startNo + this.perPageNum - 1;
if(endPage!=page) {
this.endNo = startNo + this.perPageNum - 1;
}else {
this.endNo = startNo + this.totalCount % 10 - 1;
}
} else {
// 클릭한 page번호로 계산된 게시물수가 실제게시물개수 totalCount 작을때
this.endPage = tempEnd;
this.endNo = startNo + this.perPageNum - 1;
//this.endNo = startNo + this.totalCount % 10 - 1;
}
this.prev = this.startPage != 1;// 시작페이지 1보다 크면 무조건 이전 페이지가 있음. true
this.next = this.endPage * this.perPageNum < this.totalCount;
// 클릭한 page번호로 계산된 게시물수가 실제 게시물 개수보다 작다면 다음페이지가 있음. true
}
...
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
calcPage();// totalCount 전제게시물개수가 있어야지 페이지계산을 할 수 있기 때문에
}
...
}
DAO
// 게시글 총 개수 정보 받아오기
public int totalPostCnt(){
return sqlSession.selectOne(mapperQuery+".selectCont");
}
// 모든 게시글 조회
public List<ContactDTO> selectAll(PageVO pageVO){
return sqlSession.selectList(mapperQuery+".selectAll", pageVO);
}
반응형
'🌱 𝐅𝐫𝐚𝐦𝐞𝐰𝐨𝐫𝐤 > ⠀⠀⠀⠀ Sᴘʀɪɴɢ' 카테고리의 다른 글
20240102🌱 마지막 프로젝트를 위해 (0) | 2024.01.03 |
---|---|
20231228🌱 게시판 만들기 (0) | 2024.01.01 |
20231227🌱 즐겨봐요 봄날의 스프링 (0) | 2023.12.28 |
20231226🌱 다시 한번 시작해요 스프링 (0) | 2023.12.27 |
20231222🌱 Bean, Container, DI, Mapper, Mybatis (1) | 2023.12.27 |