반응형

 

 

 김춘장이의 위키백과 - 나만의 공부 기록 Tistory ❤ 

 

 


 

 

 

 

포스팅 전

동거인이 오도방구 사고를 당했다😿
큰 사고는 아니었지만, 프로젝트를 곧 시작해야 해서 준비해야 하는 기간에
나는 병간호를 해야 했고, 주말 내내 정신없이 보냈다
그렇게 새해를 맞이하게 되었고, 이대로 손 놓고 있으면 안 될 것 같아
다시 정신 차리고 병간호 중 다시 노트북을 켜기 시작했다

 

 

 

페이징처리

타 웹사이트 여러 곳의 게시판을 보면 게시판만에 '고유’ 패턴이 있다
꼭 있어야 하는 기능들이다.

  1. 최신 글부터 상단부터 시작해 순차 정렬한다
  2. 한 페이지에 모든 글을 다 출력하지 않고 페이지를 나눠서 출력한다
  3. 페이지당 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);
    }
반응형
유리쯔의일상