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를 초기화하려는 클래스의 패키지로 바꿉니다.
'IT' 카테고리의 다른 글
파이썬3 큐 사용법 및 deque 소스코드 원형 c파일 (0) | 2023.07.20 |
---|---|
파이썬 백준 1874번 (0) | 2023.07.13 |
postman 포스트맨 입력 안될 때 (0) | 2023.07.12 |
Unused Docker containers stuck in Removal in Progress state. Device or Resource Busy 도커 내리면 자꾸 removal 상태로 빠지는 이유 (0) | 2023.07.11 |
백준 핸드폰 번호 궁합 파이썬 (0) | 2023.07.10 |