Spring boot

Springboot [페이징 처리] (limit 쿼리를 이용)

z00h 2022. 9. 13. 18:40

springboot로 검색기능을 추가하는것으로 3가지 방법을 사용해 보았다.

 

 

 

1. mybatis (criteria 클래스 생성 및 limit쿼리를 이용)

2. mybatis (criteria클래스 생성 및 rownum쿼리 이용)

3. jpa (pagable)

 

 

 

 

 

 

기능을 만들면서 알게 된 사실은 oracle에는 rownum이라는 문법을 사용할 수 있지만 mysql에서는 사용할 수가 없어서 알아보니 mariadb(mysql)문법을 사용하고 있었는데 oracle문법을 mapper에서 사용하면 오류가 발생한다는 것을 새롭게 알게 되었다. 하지만 2번에서 rownum을 사용하였다고 했는데 oracle에서와는 다르게 써서 쿼리를 생성하였다.

 

 

 

우선 1번의 mybatis로 limit 쿼리를 이용하여 페이징 처리를 해보겠다.

 

limit을 사용하면 장점은 mapper의 쿼리가 매우 간단해진다.

 

select * 

from car

limit 숫자

 

위의 예처럼 사용을 할 수 있는데 

예를 들어 limit 10은 10개의 컬럼을 가지고 오겠다는 의미이고 1부터 10까지의 조건에 맞도록 컬럼을 가지고 오게 된다.

 

limit (0,10)으로 사용하면 limit 10과 같은 의미로 사용이 되는데 해석을 해보면 0을 건너띄고 10개를 가지고온다는 것이기 때문에 1부터 10까지의 컬럼을 가지고 오겠다는 의미가 된다.

 

응용해서 limit (10,10)은 10을 건너띄고 11부터 그 뒤의 10개 컬럼을가지고 오게된다. 따라서 11부터 10개가 출력이 된다.

 

 

 

 

limit (skip, size)를 mapper에서 쓰면 skip 이라는 변수는 몇개를 건너띄울지를 계산해 주는 수식

(pageNum -1) * size를 통해 현재 페이지 번호와 사이즈를 받아오면 앞의 수식의  계산을 통해 skip을 구하고, size변수는 페이지에 보여지는 글의 수를 나타내기 때문에 사용자가 임의로 설정해 주는 변수가 된다. (pageNum또한 마찬가지)

이것들을 criteria클래스를 생성하고 담아주면 된다.

 

 

 

 

Criteria.java

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Criteria {
	
	private int pageNum;	//페이지 번호
	
	private int size;	//한 페이지당 출력 DATA 개수
	
	public Criteria(){
		this(1,10);
	}
	
	public Criteria(int pageNum,int size) {
		this.pageNum=pageNum;
		this.size=size;
	}
	
	public int getSkip() {
		return this.pageNum = (pageNum-1) * size;
	}
    
    //getSkip메소드로  mapper에서 ${skip}을 쓸 수 있음
}

 

 

 

 

 

 

 

클래스 생성후 Criteria를 매개변수로하여 Controller에서 받아와 서비스, mapper로 넘겨 주도록 하면 된다.

 

 

 

CarMapper.java

select * from Car limit ${skip},${size}