사이드프로젝트의 기존기능(RestTemplate 비동기처리)을 마치고, 게시판 기능으로 넘어왔다.
이번에는 DB에 있는 데이터를 가져와 활용을 해야되는 것이기 때문에 JPA를 사용해서 만들어보고 있는데,
가장먼저 맞닿드린 것은 "검색 기능"
!
그냥 간단한 조회 기능의 경우, 조건 하나만 가지고 불러오면 쉽게 구현할 수 있지만,
대부분, 조회에는 필터
를 걸 수 있고 나또한, 필터 기능이 있는 조회를 하고자 한다.
하지만, 필터
의 조건이 4개만 되어도
하나만 고른 경우 4가지
두개의 필터를 고른 경우 6가지
세개의 필터를 고른 경우 4가지
전부 다 1가지
= 15가지의 경우의 수가 나온다.
사실 이정도만 해도 직접 하나하나 구현할만 하다.
하지만, 나의 경우는 필터
의 조건이 더 많아 JPA Repository에 인자만 다른 메소드를 반복해서 만드는 모습을 보며 이게 맞나? 라는 생각이 들었다.
String jpql = "SELECT m FROM Member m WHERE m.age > 18";
List<Member> members = entityManager.createQuery(jpql, Member.class).getResultList();
이렇게 결국 JPQL은 기본 문자열로 작성되기 때문에, 컴파일시 에러가 발생되지 않는다.
그리고 문자열이기때문에, 상황에따라 수정이 가능한데, 이것을 활용하여 동적으로 변경할 수 있다.
결국, 조회한다는 것은 DB에 쿼리로 필요한 데이터를 가져온다는 것!
그 가져오는 쿼리를 조건에 맞춰 쓸수 있게 할 수 있는데, 이것이 동적쿼리이다!
당연히,Spring JPA에도 동적쿼리를 생성하기 위해 여러가지 기능을 제공한다는 것을 알게되었다.
기본적으로 조건에 따라 JPQL의 문자열을 수정하여 만든다.
Criteria API
사용하여 동적쿼리를 만든다.라이브러리 의존성을 추가해줘야한다.
q파일을 생성할 디렉토리 설정도 해줘야한다.
이제 생성된 q객체를 가지고, 쿼리를 짜면된다.
QOrder order = QOrder.order;
QMember member = QMemeber.member;
JPAQueryFactory query = new JPAQueryFactory(em);
//조건
query
.select(order)
.from(order)
.join(order.member, member)
.where(statusEq(orderSearch.getOrderStatus()), nameLike(...))
.limit(1000)
.fetch();
private BooleanExpression statusEq(){
if(statusCond == null){
return null
}
return QOrder.order.status.eq(statusCond);
}
=> jpql로 바뀌어서 실행된다.
(일단 queryDSL의 맛만 봐본것이며, 계속해서 공부하다가 한번더 사용방법에 대해 올려보고자 한다.)
(다소 내용이 부실할 수 있는데, 이것 말고도 GCP서버작업도 해보느라.. 정리의 시간이 필요해, 먼저 끄적여봤다. )