IT

querydsl 사용이유

프로개발러 2023. 7. 13. 09:52
반응형

querydsl 사용이유


1.문자가 아닌 코드로 쿼리를 작성할 수 있어 컴파일 시점에 문법 오류를 확인할 수 있다.
2.인텔리제이와 같은 IDE의 자동 완성 기능의 도움을 받을 수 있다.
3.복잡한 쿼리나 동적 쿼리 작성이 편리하다.
4.쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다.
5.JPQL 문법과 유사한 형태로 작성할 수 있어 쉽게 적응할 수 있다.

일반적으로 검색하면 나오는 문장들...
근데 하나하나 뜯어보면 이상한 문장천지...

1.문자가 아닌 코드로 쿼리를 작성할 수 있어 컴파일 시점에 문법 오류를 확인할 수 있다.
->아니 컴파일 시점에 문법 오류를 확인하는게 왜 장점이지?

이유는

타입 안정성 보장
- entity 어노테이션 선언된 클래스를 q파일로 만들어서 사용하기 때문에(형태가 고정됨)
  특정 시점의 오타나 컬럼명 오류를 찾을 수 있음.
 ->왜 q파일을 만드는지 이해가 잘 안됐는데... 사실 비효율적임.
   계속 변화되는 컬럼이 존재한다면? 컴파일시점에서만 확인가능.
   실시간으로 확인이 불가능...
   근데 실시간으로도 쿼리맵핑이 되는 프레임워크를 충분히 생성할 수 있을것 같은데...?

   현실적으로 그럴수는 없으니 특정 시점에 스냅샷을 찍고 쿼리 실행을 하기전 컴파일 단계에서
   오류 검출 가능
  
  참고로 이방식은  jooq 에서 지원하지만, mybatis 에서는 지원 안함


참고 : https://bsssss.tistory.com/1051



3.복잡한 쿼리나 동적 쿼리 작성이 편리하다.
-> JPA ORM 에서 복잡한 쿼리방식을 보완한 것이 QUERY DSL
->SQL쿼리작성이 아닌 객체 관계 맵핑 방식


참고 : https://theworldaswillandidea.tistory.com/132


참고로 아래는 querydsl 레퍼런스 해석.
http://querydsl.com/static/querydsl/5.0.0/reference/html_single/#preface

Querydsl은 정적으로 유형이 지정된 SQL과 유사한 쿼리를 생성할 수 있는 프레임워크입니다. 
쿼리를 인라인 문자열로 작성하거나 XML 파일로 외부화하는 대신 Querydsl과 같은 유창한 API를 통해 구성할 수 있습니다.

간단한 문자열과 비교하여 유창한 API를 사용하는 이점은 예를 들면 다음과 같습니다.

1.IDE에서 코드 완성
2.구문적으로 잘못된 쿼리가 거의 없음
3.도메인 유형 및 속성을 안전하게 참조할 수 있습니다.
4.도메인 유형의 변경 사항을 리팩터링하는 데 더 적합합니다.


그리고 마지막 부분에 꿀팁이 하나 있다.


4.2. Multithreaded initialization of Querydsl Q-types
When Querydsl Q-types are initialized from multiple threads, deadlocks can occur, if the Q-types have circular dependencies.

An easy to use solution is to initialize the classes in a single thread before they are used in different threads.

The com.querydsl.codegen.ClassPathUtils class can be used for that like this:

    ClassPathUtils.scanPackage(Thread.currentThread().getContextClassLoader(), packageToLoad);
Replace packageToLoad with the package of the classes you want to initialize.



4.2. Querydsl Q 유형의 다중 스레드 초기화
Querydsl Q 유형이 여러 스레드에서 초기화될 때 Q 유형에 순환 종속성이 있는 경우 교착 상태가 발생할 수 있습니다.

사용하기 쉬운 솔루션은 클래스가 다른 스레드에서 사용되기 전에 단일 스레드에서 클래스를 초기화하는 것입니다.

com.querydsl.codegen.ClassPathUtils 클래스는 다음과 같이 사용할 수 있습니다.

    ClassPathUtils.scanPackage(Thread.currentThread().getContextClassLoader(), packageToLoad);
packageToLoad를 초기화하려는 클래스의 패키지로 바꿉니다.


반응형