[Spring] QueryDsl Qclass 사용 이유

민지·2024년 10월 17일
0

Spring

목록 보기
25/25

jpa 가 기본적으로 제공해주는 crud 와 쿼리 메서드 기능을 사용하더라도, 원하는 조건의 데이터를 수집하기 위해서는 필연적으로 jpql 을 작성하게 된다.

간단한 로직을 작성하는데는 큰 문제가 없다. 하지만 복잡한 로직의 경우엔 쿼리 열이 상당히 길어지고 jpql 문자열에 오타 혹은 문법적인 오류가 존재하는 경우, 정적 쿼리라면 어플리케이션 로딩 시점에 이를 발견할 수 있으나 그 외는 런타임 시점에서 에러가 발생한다.

이러한 문제를 어느 정도 해소하고자 안정성에 많은 노력을 한 프레임워크가 바로 QueryDsl 이다.


QueryDsl

: 정적 타입을 이용해서 SQL 등의 쿼리를 생성해주는 프레임워크

QClass

기본적으로 QueryDsl 을 사용할때 QClass 가 생성이 된다.
엔티티 클래스의 메타 정보를 담고 있는 클래스로 Querydsl 은 이를 이용하여 타입 안정성(Type safe) 을 보장하면서 쿼리를 작성할 수 있게 된다.

Qclass 는 엔티티 클래스와 대응되며 엔티티의 속성을 나타내고 있다. 이러한 Qclass 를 사용하여 쿼리를 작성하면 엔티티 속성을 직접 참조하고 조합하여 쿼리를 구성할 수 있다. Qclass 를 사용하면 컴파일 시점에 오류를 확인할 수 있고 IDE 의 자동 완성 기능을 활용하여 쿼리 작성을 보다 편리하게 할 수 있다.

그냥 Entity 를 사용해도 되는데 굳이 QClass 를 만들어서 사용하는 이유는 뭘까? JPA_APT(JPAAnnotationProcessorTool)가 @Entity 와 같은 특정 어노테이션을 찾고 해당 클래스를 분석해서 QClass 를 만들어 준다.
엔티티 클래스는 데이터베이스 테이블의 매핑을 담당하고, QClass는 쿼리 작성을 위한 편의성과 안전성을 제공을 해주면서 유지보수의 편의성 및 실수 방지를 하지 않도록 해준다고 생각한다.

APT

Annotation 이 있는 기존코드를 바탕으로 새로운 코드와 새로운 파일들을 만들 수 있고, 이들을 이용한 클래스에서 compile 하는 기능도 지원해준다.
쉬운 예시로는 Lombok의 @Getter, @Setter가 있다. 해당 어노테이션을 사용하는 경우 apt가 컴파일 시점에 해당 어노테이션을 기준으로 getter 와 setter를 만들어 주기 때문에 코드를 작성하지 않고 사용이 가능해진다.

Qclass를 사용하는 이유

  • Qclass 는 엔티티 속성을 정적인 방식으로 표현하므로 자동 완성 기능 등 IDE의 도움을 받을 수 있고 속성 이름을 직접 기억하거나 확인하지 않아도 된다.

  • 엔티티 속성의 타입을 정확하게 표현하므로 타입에 맞지 않는 연산이나 비교를 시도하면 컴파일 단계에서 에러를 쉽게 잡을 수 있다.

  • 동적인 쿼리 작성이 편리하다.

  • 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다.

profile
개발일지

0개의 댓글