MySQL 방법으로 

select bno, title, writer, regdate, updatedate
from vam_board order by bno desc
limit 5, 5;

limit 5, 5;  = limit skip, count (앞에 5개를 건너띄고 5개를 select)

ex) 게시글이 6개일땐 앞에 5개를 skip 후 1개밖에 없으니 1개만 보여짐. 

 

 

* pageNum : 현재페이지

* amount : 해당페이지의 게시글 수

 

limit skip, count   limit pageNum-1 * amount , amount

 

 

보여지는 게시글이 10개라면 

limit pageNum-1 * amount , amount 

1 페이지 => 0,10

2 페이지 => 10,10

3 페이지 => 20,10

 

 

Criteria 클래스를 생성해서 pageNum, amount 데이터 적기.

*skip 계산도 적기

public class Criteria {
	
    /* 현재 페이지 */
    private int pageNum;
    
    /* 한 페이지 당 보여질 게시물 갯수 */
    private int amount;

    /* 스킵할 게시물 수 ( pageNum-1 * amount )*/
    private int skip;
    
    /* 기본 생성자 -> 기본세팅 pageNum=1, amount=10 */
    public Criteria() {
    	this(1,10); // 전체 생성자를 통해 (1,10)을 입력되어 객체 생성
    }

    /* 생성자 -> 원하는pageNum, amount */
    public Criteria(int pageNum, int amount) {
	    this.pageNum = pageNum;
	    this.amount = amount;
	    this.skip = pageNum-1 * amount;
	}

}

 

겟터 셋터도 설정한다 (set에 스킵 계산 추가적기 )

public int getPageNum() {
    return pageNum;
}

//새로 페이지 숫자를 설정 했을때 -> 스킵도 계산
public void setPageNum(int pageNum) {
    this.pageNum = pageNum;
    this.skip = pageNum-1 * this.amount;
}

public int getAmount() {
    return amount;
}

//페이지당 갯수를 바꿀경우에도 스킵을 다시 계산
public void setAmount(int amount) {
    this.amount = amount;
    this.skip = (this.pageNum-1) * amount;
}

public int getSkip() {
    return skip;
}

public void setSkip(int skip) {
    this.skip = skip;
}

*this. 잘붙이기

 

 

마지막 toString() 메서드까지

@Override
public String toString() {
    return "Criteria [pageNum=" + pageNum + ", amount=" + amount + ", skip=" + skip + "]";
}

 

 

페이지 적용은 RecipeMapper

/* 게시판 목록 (페이지 적용): pageNum, amount를 입력받고 객체criteria 생성 없으면 기본(1,10)*/

public List<RecipeVO> getListPaging(Criteria criteria);

 

RecipeMapper.xml

<!-- MySQL-->
<!-- 게시물 목록(페이징) -->
<select id="getListPaging" resultType="RecipeVO">
    
   select * from (
         select id, title, writer, regdate, updatedate  
         from recipe
         order by id desc) as T1   -> 내림차순 

    limit #{skip}, #{amount}
   
</select>

#{skip}, #{amount} 는 getListPaging(Criteria criteria); 의 criteria객체에서 받아옴.

* as T1 안적으면 오류남.

 

 

SQL에 데이터 초기화 하고 100개 입력하는 데이터 만들기 (# 한글 적으면 실행안됨)

TRUNCATE TABLE recipe; 

DELIMITER $$
DROP PROCEDURE IF EXISTS procedureName$$
 
CREATE PROCEDURE procedureName()
BEGIN
    DECLARE i INT DEFAULT 1;
        
    WHILE i <= 100 DO
        INSERT INTO recipe(title , content, writer, ingredient, registerdate, updateDate)
          VALUES( concat('제목',i), '테스트 데이터 에요', '작가', '재료', now(),  now());
        SET i = i + 1;
    END WHILE;
END$$
DELIMITER $$

CALL procedureName; 

*TRUCATE TABLE하면 데이터 날아감.

 

 


 

Mapper 테스트 하기

Criteria criteria = new Criteria(); //기본생성자 (1,10)
                      
List<RecipeVO> list = recipeMapper.getListPaging(criteria);
     
list.forEach(board -> log.info("" + board));

 

 

오류

llimit ?,? 이 뜨는데

기본생성자에 skip 기본 설정해줘야함.

 public Criteria() {
     this(1,10); // 전체 생성자를 통해 (1,10)을 입력되어 객체 생성
     this.skip = 0;
  }

 

 

현재 1페이지 10개 게시글 

 

 

criteria.setPageNum(2); 추가하면 2페이지부터 10개까지 

Criteria criteria = new Criteria(); //기본생성자 (1,10)
criteria.setPageNum(2);          
List<RecipeVO> list = recipeMapper.getListPaging(criteria);
     
list.forEach(board → log.info("" + board));

++

criteria.setPageNum(2);
criteria.setAmount(4)

를 추가하면 2페이지~ 4개 게시글

 

 


RecipeService = RecipeMapper 

public List<RecipeVO> getListPaging(Criteria criteria);

 

RecipeServiceImpl 

@Override
public List<RecipeVO> getListPaging(Criteria criteria) {
   return recipeMapper.getListPaging(criteria);
}

controller 

기존의 게시글 get매핑 지우고 페이징되는 걸로 다시 수정

@GetMapping("/list")
public String recipeListGet(Model model, Criteria criteria) {
   //boardList에 페이징 된 게시글을 전달
   model.addAttribute("boardList", recipeService.getListPaging(criteria));
   return "recipe_list";
}

* @RequestParam를 적으면 무조건 받아야하지만 (int i) 만 적으면 파라미터로 받지만 없어도 상관없다

 

 

= pageNum, amount 두개가 필요하지만 안적어도 기본생성자(1,10) 값이 들어가고

   원하는 페이지와 게시글 수를 얻고싶다면 pageNum, amount를 파라미터로 적는다.

 

 

파라미터로 직접 http://localhost:8080/recipe/board/list?pageNum=2&amount=5 쓰면

 2페이지부터 5개 게시글만 나온다.

 

반응형
LIST

+ Recent posts