⚡ 개요
기본적으로 QueryDsl을 사용할때 QClass가 생성이 된다. 초기에 QueryDSL을 사용하면서 궁금했던 내용은 그냥 Entity를 사용해도 될거같은데 굳이 QClass를 만들어서 사용을 할까? 어떻게 만드는거지? 라는 기본적인 궁금증에서 래퍼런스 문서 부터 많은 블로그의 내용을 찾아봤으며 해당 내용을 정리 해보려고 한다.
JPA_APT(JPAAnnotationProcessorTool)가 @Enttiy 와 같은 특정 어노테이션을 찾고 해당 클래스를 분석해서 QClass를 만들어 준다. 빌드 도구를 통해서 만드는 방법은 다른곳을 찾아봐도 나오니 생략한다.
(Gradle의 경우, 버전별로 설정을 하는 방식이 다르기 때문에 버전에 맞게 잘 찾아서 사용 해야 한다.)
✋ APT 란 ?
Annotation 이 있는 기존코드를 바탕으로 새로운 코드와 새로운 파일들을 만들 수 있고, 이들을 이용한 클래스에서 compile 하는 기능도 지원해준다.
쉬운 예시로는 Lombok의 @Getter, @Setter가 있다. 해당 어노테이션을 사용하는 경우 apt가 컴파일 시점에 해당 어노테이션을 기준으로 getter 와 setter를 만들어 주기 때문에 코드를 작성하지 않고 사용이 가능해진다.
✋ QClass 란?
엔티티 클래스의 메타 정보를 담고 있는 클래스로, Querydsl은 이를 이용하여 타입 안정성(Type safe)을 보장하면서 쿼리를 작성할 수 있게 된다.
QClass는 엔티티 클래스와 대응되며 엔티티의 속성을 나타내고 있다. 이러한 QClass를 사용하여 쿼리를 작성하면 엔티티 속성을 직접 참조하고 조합하여 쿼리를 구성할 수 있다. QClass를 사용하면 컴파일 시점에 오류를 확인할 수 있고, IDE의 자동완성 기능을 활용하여 쿼리 작성을 보다 편리하게 할 수 있다.
그렇다면 굳이 엔티티 클래스 대신 Q클래스를 만들어서 사용하는 이유에 대해서 정리 하려고 한다.
QClass와 엔티티 클래스는 많은 장점을 공유하고 있지만 그럼에 QClass를 사용하는 이유는 다음과 같다.
- QClass는 엔티티 속성을 정적인 방식으로 표현하므로 IDE의 자동 완성 기능을 활용할 수 있고, 속성 이름을 직접 기억하거나 확인하지 않아도 된다는 장점을 가지고 있다.
- QClass는 엔티티 속성의 타입을 정확하게 표현하므로, 타입에 맞지 않는 연산이나 비교를 시도하면 컴파일러가 오류를 감지할 수 있다.
내가 생각하는 QClass를 사용하는 이유라고 생각한다.
QClass는 엔티티 클래스의 확장으로 생각할 수 있다. 엔티티 클래스는 데이터베이스 테이블의 매핑을 담당하고, QClass는 쿼리 작성을 위한 편의성과 안전성을 제공을 해주면서 유지보수의 편의성 및 실수 방지를 하지 않도록 해준다고 생각한다.
⚡ 생각
기본적인 개념 및 사용 이유에 대해서 내용을 정리해보았다. 기본적인 개념은 깊게 들어가지 않았기 때문에 깊게 공부를 하려면 공식 문서 및 블로그를 더 참조 하는게 좋을거 같다.
사용 이유의 경우는 공식 래퍼런스 기준으로는 type safe 이다.
QueryDSL을 사용하는 이유중 가장 큰 장점이라고 생각하는 부분이 컴파일 단계에서 에러를 잡을수 있다는 것이다. JPQL을 사용 했을때는 문자열에 오타 혹은 문법적인 오류가 존재하는 경우 런타임 시점에 에러가 확인이 가능하다. 이러한 문제점들을 가지고 있었기 때문에 QueryDSL이 나왔고 이러한 이유 때문에라도 안정성에 많은 노력을 한것이 아닌가 생각한다.
'Spring' 카테고리의 다른 글
[JPA] Spring Boot 에서 QueryDsl 사용 방법 정리 (0) | 2023.06.24 |
---|---|
[Linux] JAVA에서 SFTP 접속 관련 이슈 사항 내용 정리 (0) | 2023.06.10 |
[Spring Boot] spring boot + mybatis 사용 방법 정리 (0) | 2023.04.15 |
[Spring Boot] application.yml 설정 파일 우선순위에 대한 내용 정리 (1) | 2023.03.07 |
[Spring Boot] 콘솔에 출력된 배너 변경하기 (0) | 2023.02.12 |