Predicate는 쉽게 말해 '이 조건이 맞다'고 판단하는 근거를 함수로 제공하는 것이다.

함수형 패러다임을 가진 언어들에서 자주 사용되는데, Java 8 버전에도 포함되어 있다.

 

Repository에서 Predicate를 파라미터로 전달하기 위해서는 QueryDslPredicateExcutor<T> 인터페이스를 Repository에 추가해 주어야만 한다.

 

메서드 설명
long count(Predicate) 데이터의 전체 개수
boolean exists(Predicate) 데이터의 전제 여부
Rerable<T> findAll(Predicate) 조건에 맞는 모든 데이터
Page<T> findAll(Predicate) 조건에 맞는 모든 데이터
Iterable<T> findAll(Predicate, Sort) 조건에 맞는 모든 데이터와 정렬
T findOne(Predicate) 조건에 맞는 하나의 데이터

Repository 변경

Repository 인터페이스는 QueryDslPredicateEXecutor<T> 인터페이스를 상속하도록 추가해 주어야 한다.

org.zerock.persistence.BoardRepository.java
public interface BoardRepository extends CrudRepository<Board, Long>, QuerydslPredicateExecutor<Board>{

Predicate 생성 및 테스트

Predicate는 단어적 의미로 단언하다, 확신하다의 의미로, 프로그램적 으로 boolean으로 리턴되는 결과 데이터를 만들어야 한다. 주로 BooleanBuilder를 이용해 생성하는데 사용방법은 테스트 코드를 통해 알아본다.

org.zerock.BootApplicationTests.java
...
import com.querydsl.core.BooleanBuilder;

@RunWith(SpringRunner.class)
@SpringBootTest
class Boot03ApplicationTests {

	...
	
	@Test
	public void testPredicate() {
		String type = "t";
		String keyword = "17";
		
		BooleanBuilder builder = new BooleanBuilder();
		QBoard board = QBoard.board;
		
		if(type.equals("t")) builder.and(board.title.like("%" + keyword + "%"));
		
		// bno > 0
		builder.and(board.bno.gt(0L));
		
		Pageable pageable = PageRequest.of(0, 10);
		Page<Board> result = repo.findAll(builder, pageable);
		
		System.out.println("PAGE SIZE: " + result.getSize());
		System.out.println("TOTAL PAGES: " + result.getTotalPages());
		System.out.println("TOTAL COUNT: " + result.getTotalElements());
		System.out.println("NEXT: " + result.nextPageable());
		
		List<Board> list = result.getContent();
		list.forEach(b -> System.out.println(b));
	}
}
결과
Hibernate: ...
	board0_ where (board0_.title like ? escape '!') and board0_.bno? limit ?
    
Hibernate: ...
	where(board0_.title like ? escape '!') and board0_.bno>?
    
PAGE SIZE: 10
TOTAL PAGES: 4
TOTAL COUNT: 36
NEXT: Page request [number: 1, size 10, sort: UNSORTED]
... 테이블 결과 내용 ...

리턴 타입을 Page<T>로 설정했기 때문에 데이터를 추출하는 SQL과 개수를 파악하는 SQL이 실행되고, 이때 필요한 조건들이 지정되는 것을 볼 수 있다.

'Starter SpringBoot 2.x 보충 내용' 카테고리의 다른 글

JPA Paging(페이지 나누기)  (0) 2021.08.30

+ Recent posts