본문 바로가기
Back-End/Spring

TIL 230802 : QueryDsl 사용하기 (JPAQueryFactory)

by 우인입니다 2023. 8. 3.

드디어 숱한 개념정리 끝에 QueryDsl을 사용할 순간이 왔다.

 

정리

1. QueryDsl 은 오픈소스 라이브러리이다.

2. 쿼리를 직접 쓰는 게 아니라 코드 형태로 쿼리를 만들 수 있게 해주는 방법들 중 하나다. (근데 현업에서 잘 쓴다)

3. QueryDsl에서 Q객체를 생성해서 객체를 활용한 쿼리를 만드는 데 쓰인다.

4. Q객체로 BooleanExpression을 만들 수도 있고, 쿼리에 필요한 변수를 만들 수도 있다.

5. Predicate를 활용하여 조건문을 만들어서 사용할 수도 있지만, JPAQueryFactory를 사용할 수도 있다. (현업에서 더 자주 쓰임.)

 

오늘은 JPAQueryFactory와 Q객체를 사용해서 DB기능을 만들어본다.

 


QueryDsl로 로직 만들고 기존 구성에 추가하기

0. JPAQueryFactory 사용 준비하기

// configuration 패키지안에 추가

@Configuration
public class JPAConfiguration {

  @PersistenceContext
  private EntityManager entityManager;

  @Bean
  public JPAQueryFactory jpaQueryFactory() {
    return new JPAQueryFactory(entityManager);
  }
}

 

위와 같이 직접 빈으로 등록해줘야한다.

@Configuration 과 함께 클래스를 등록해둔다.

 

 

1. ~Query Repository를 추가로 만들어주고 구현 클래스도 만들어준다.

 

인터페이스에 구현할 메소드를 선언해준다.

 

Impl클래스에 해당 인터페이스를 임플해주고 JPAQueryFactory도 받아온다.

 

메소드를 구현한다.

 

2. 기존 Repository에 추가로 상속한다.

@RepositoryDefinition 붙여준다.

추가로 상속도 해준다.

 


JPAQueryFactory 사용법

 

위 1번에서 메소드를 구현한다 라고하고 생략한 Query만들고 결과를 받아오는 부분에 대해 정리해본다.

 

1. 쿼리 만드는 부분

1-1. 쿼리 생성 메소드

Service에서 실행될 메소드를 PostRepositoryQueryImpl에 설정해뒀다.

첫 줄에 query라는 메소드를 따로 만들어서 파라미터로 받아온 cond(검색조건)과 qPost(Post Q객체)를 넣어주면 자동으로 생성해주게 됐다.

 

저곳에 select, from, where, orderBy, groupBy 등 사용해서 쿼리를 코드형태로 작성할 수 있다.

 

1-2. 동적쿼리 생성

그런데 where절 안에 postUsernameEq(cond.getUsername())이 있다.

cond로 검색 조건을 받아올 때, 조건안에 있는 값만 where절에 추가하기 위함이다.

BooleanExpression으로 반환하는 메소드이고 해당 메소드를 뜯어보면

cond.getUsername()이 없으면 Null로 바꿔주는 메소드이다.

 

지금은 값을 username하나로 설정했지만, 여러가지 값이 있을 때 저렇게 처리하면 하나의 search메소드에서

cond만 받아서 받아온 검색조건 가지고 그에 맞는 쿼리가 작성이 가능해진다

 

아래의 링크에서 JpaQueryFactory의 다양한 메소드에 대해 정리해주셔서 참고해서 반복숙달 해보려한다.

https://dingdingmin-back-end-developer.tistory.com/entry/Spring-Data-JPA-8-Querydsl-%EC%82%AC%EC%9A%A9

https://velog.io/@tmdgh0221/Querydsl-%EC%A0%95%EB%A6%AC

 


더 공부할 것

 

인터페이스 상속관계가 조금 엉킨느낌. 깔끔하게 구성하는 법

SQL문 복습