드디어 숱한 개념정리 끝에 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://velog.io/@tmdgh0221/Querydsl-%EC%A0%95%EB%A6%AC
더 공부할 것
인터페이스 상속관계가 조금 엉킨느낌. 깔끔하게 구성하는 법
SQL문 복습
'Back-End > Spring' 카테고리의 다른 글
연관관계를 설정하기 위해 필요한 id값을 알고 있다면 객체를 굳이 select할 필요가 있나? (쿼리 줄이기, getReferenceById) (0) | 2023.10.24 |
---|---|
TIL 230801 : QueryDSL 쓰려고 정리하는 배경지식들 (Predicate) (0) | 2023.08.02 |
TIL 230731 : QueryDSL 어렵진 않은데 너무 복잡해 (1. ORM 발전 흐름) (0) | 2023.08.01 |
WIL 230730 : JPA 왕초보단계를 아주 살짝 벗어나기 (0) | 2023.07.30 |
TIL 230728 : pageable 기능 활용 하기. (+sortBy) (0) | 2023.07.28 |