Querydsl V1

Shaun·2022년 11월 20일
1

querydsl

목록 보기
1/4
post-thumbnail

사실 JPA 를 사용하면서 JPQL까지 사용 했던나는 실무에 투입되면서 JOOQ라는 라이브러리를 사용하게 되었다.

dsl은 처음이라 애를 먹었지만 프로젝트가 끝나고 왜 dsl을 사용해야 되는지 알게 되었다. 자연스럽게 JOOQ 사용법을 익히면서 querydsl 과 아주 흡사한 방법으로 쿼리를 짠다는것을 알게 되었다. 그래서 querydsl은 JOOQ와 무슨 차이점이 있을까 궁금해서 querydsl 공부를 시작하게 됐다.

그래서 이 글에서는 쿼리짜는법 보다는 jooQ와 querydsl의 차이점을 중점으로 작성할 계획이다.

Querydsl

querydsl 적용

  • gradle 설정

  • jooQ와 다르게 querydsl은 Q파일을 생성함.

  • 이 q파일로 쿼리 사용

querydsl 테스트

  • JPQL을 사용해 쿼리를 짜는거와 조금은 다르지만 jooQ를 먼저 써보고 querydsl 을 배우는거라 쿼리짜는데 어려움은 없었다.

  • jooQ와의 차이점은 querydsl은 q파일이라는것을 사용한다는 점

  • jooQ는 DSLContext로 querydsl 은 JPAQueryFactory로 쿼리를 만든다.

JPA + Querydsl

도메인

  • 다대일 양방향 관계

  • toString은 내부필드만, 왜냐하면 연관관계 호출시 서로 무한호출

yml

  • show_sql : sysout에 하이버네이트 실행 sql남김
  • org.hibernate.SQL : logger을통해 하이버네이트 실행 sql남김

-> 모든 로그 출력은 가급적 로거를 통해 남겨야함

  • 로그를 통해 나오는 쿼리파라미터는 ? 로 나옴, 적으면 상관없는데 많아지면 보기가 힘들다. 그래서 외부라이브러리 p6 spy사용, but 시스템 자원 사용함으로 개발단계에서만 사용!

Querydsl 기본문법

  • 테스트 실행마다 기본세팅

Q파일 사용 방법

  • 두가지 방법이 있지만 jooQ처럼 맨위에 static으로 선언하는 방법 권장

조회

  • querydsl 은 JPQL빌더 그이상 그이하도 아님
  • JPQL은 런타임 오류지만 querdysl은 컴파일러가 오류를 잡아줌, 가장 큰 장점

  • jooQ를 배우고 난뒤 querydsl을 배우는 입장이라 쿼리짜는데 큰 어려움은 없었다. 약간 다른점은 fetch의 사용이 좀 다른것 같다. querydsl에 없는게 jooQ에 있는것도 있고 나중에 배울 DTO에 바로 주입하는 방법도 약간 다른것 같다.

동시성 문제

  • JPAQueryFactory를 생성할때 필요한 EntityManager에 달려 있음. 스프링부트는 쓰레드들이 동시에 Em에 접근해도 트랜잭션마다 별도의 영속성 컨텍스틀 제공하기 때문에 걱정 x

검색

  • where문 and안쓰고 합쳐서 가능 ->이 경우 null값은 무시

결과조회

  • fetch : 리스트조회. 데이터 없으면 빈 리스트 반환
  • fetchOne() : 단건조회, 결과없으면 null반환.
  • fetchFirst() : limit(1),fetchOne()
  • fetchResult() : 페이징 정보 포함, but 지금은 deprecate됨,
  • fetchCount () : count수 조회, but 지금은 deprecate

-> fetchCount () => fetch().size()로 대체
-> fetchResult() => fetch() 결과 -> new pageImpl 사용

-> 조회하는 경우에는 join을 해야하지만 count 쿼리는 join 필요없음. but count는 자동화... 그래서 성능 개선이 필요한경우 count쿼리 따로 작성해줘야함

정렬

  • 그리 어렵지 않다

집합

  • JPQL에서 제공하는 집합 함수 사용 가능

  • group by 제공

조인

  • join(조인대상, 별칭으로 사용할 Q타입)
  • inner Join : join(),innerJoin()
  • outer Jouin : leftJoin(), rightJoin()

세타조인

  • from 절에서 여러 엔티티 가능

on 사용

  • select 가 2개 이상이라 결과값은 tuple

  • on 절 사용시 내부조인을 사용하면 where 절에서 필터링 하는 것과 기능이 동일

-> 내부조인이면 where을, 외부조인이면 on절 사용

페치조인

  • 페치조인 : 지연로딩 한방쿼리로 다 불러옴

서브쿼리

  • jooQ와 다르게 querydsl 은 서브쿼리 사용시 JPAExpressions 를 사용, 이것 또한 static으로 선언 가능

  • from절 (인라인뷰) 는 불가

Case문

  • 사용법은 어렵지 않다

상수

  • Expressions.constant() 사용

문자 더하기

  • concat() 사용
profile
호주쉐프에서 개발자까지..

0개의 댓글