쿼리 메소드, JPQL, Querydsl 요약

심규환·2022년 1월 9일
0

Querydsl

목록 보기
2/2
post-thumbnail

1. Query Method

사용하려는 Repository에 JpaRepository만 상속해주면 스프링의 AOP 기능을 사용하여 구현까지 자동으로 해준다. 간단한 문법으로 객체의 CRUD가 가능하다.

기본적으로 find + "객체" + By + "변수" 로 사용하는데. 중간에 객체는 생략 가능하다.

<사용 예시>
List<Item> findByItemNm(String itemNm) 
-> itemNm 변수명을 사용해서 해당하는 모든 객체를 가져온다.

List<Item> findByPriceLessThan(Integer price)
-> price 변수보다 높은 객체들을 모두 가져온다.

<쿼리 메소드>

출처: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.sorting !

Query Method를 통해서 간단하게 필요한 객체를 조회할 수 있지만. 조금 더 복잡한 조건을 사용하려면 메소드의 길이가 증가하게 된다는 단점이 있다.
이에 대한 해결로는 JPQL(Java Persistence Query Language)가 있다.

2. JPQL(Java Persistence Query Language)

복잡한 조건을 메소드로 표현하기 어려울 수 있기 떄문에 JPQL을 사용하여 직접 쿼리문을 작성하여 객체를 조회할 수 있다.
객체를 대상으로 하는 쿼리문이며 SQL을 추상화해서 사용하기 때문에 어떤 DB를 사용하더라도 문제없이 사용할 수 있다.
@Query(" query 문 ") 으로 사용한다.

<사용 예시>

@Query("select i from Item i where i.itemNm like %:itemNm% order by i.price desc")
List<Item> findByItemNm(@Param("itemNm") String itemNm);
-> itemNm 명으로 조회하는데, price를 기준으로 내림차순으로 조회한다.
-> :"itemNm"는 @Param('itemNm')을 사용해서 넣어줄 수 있다.

JPQL은 직접 쿼리문을 문자열로 작성하기 때문에 오타로 인한 컴파일 에러를 통해 확인이 불가능하다.

3. Querydsl

Querydsl은 쿼리문을 소스코드를 사용해서 작성한다. 소스코드를 사용하기 떄문에 다음과 같은 이점이 있다.

	• IDE를 통한 자동완성 기능
	• 컴파일 에러가 발생
	• 조건문을 사용한 동적 쿼리문 작성이 간편
	• 코드의 재사용성 증가

단점이 있다면 설정하기가 조금 까다롭다는 것이다.

사용 예시>

	1) query문을 작성하려면 JpaQuery 인스턴스가 필요합니다. 이를 위해 JpaQueryFactory를 통해 인스턴스를 생성해야 합니다. 
	먼저 JpaQueryFactory를 영속성 컨텍스트를 파라미터로 넘겨서 생성합니다.
	(Querydsl은 JPA API를 사용하며 JPA를 지원하는 모듈입니다.)
	
	JpaQueryFactory queryFactory = new JpaQueryFactory(em);

	2) 사용하려는 QEntity를 생성합니다.
	QItem qItem = QItem.item;  -> QItem은 정적 메소드로 만들어져 있는 인스턴스를 가져옵니다.
	 
	3) 쿼리문 작성
	JpaQuery<Item> query = queryFacotory.selectFrom(qItem)......where....조건문;
	

	4) 쿼리 결과 반환
	List<Item> items = query.fetch();

4. QueryDslPredicateExcutor 인터페이스

predicate는 '조건에 맞다' 라는 뜻으로 조건문만을 사용해서 원하는 객체를 조회하기 위해 사용합니다. 사용하려는 Repository에 인터페이스 상속을 하여 사용하면 되는데.

메소드 목록>

사용 예시>

	1) BooleanBuiler 생성, BooleanBuilder는 조건문을 넣어둘 수 있는 빌더라고 생각하면 됩니다.
	BooleanBuilder booleanBuilder = new BooleanBuilder();

	2) 빌더에는 QEntity를 사용한 조건문을 넣어줘야 합니다. 
	QItem qItem = QItem.item;
	
	3) 조건 변수 생성(선택)
	int price = 10003;

	4) BooleanBuilder에 조건 추가
	booleanBuilder.and(qItem.price.gt(price));  // price 보다 높은 Item 객체 조회

	5) repository를 바로 사용하여 조회
	itemRepository.findAll(booleanBuilder);
profile
장생농씬가?

0개의 댓글