daadaadaah / my-jpa

JPA를 내꺼로 만들기 위한 repository

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

QueryDSL : 엔티티를 직접 사용하지 않고 Q 타입을 만들어서 사용 하는 이유는 무엇일까?

daadaadaah opened this issue · comments

계기

  • Q 타입 만들때 가끔 안 만들어지는 문제가 있어서, 왜 Q 타입을 만들어서 사용하지? 라는 궁금증에 공부해봄

Q 타입을 사용하는 이유

chatGPT 답변

  • 요약하면, Q타입을 사용하면 QueryDSL을 더욱 효과적으로 활용할 수 있으며, 코드의 가독성과 타입 안정성을 높이고, 엔티티 클래스와 쿼리 코드를 분리하여 유지 보수성을 향상시킬 수 있습니다.
  1. 타입 안정성(Type Safety): QueryDSL은 컴파일 타임에 타입 안정성을 제공합니다. 즉, 쿼리를 작성할 때 엔티티의 속성명을 오타로 인한 버그를 사전에 방지할 수 있습니다. Q타입을 사용하면 엔티티의 속성명을 문자열로 작성하는 것이 아니라, 자바 코드에서 직접 참조할 수 있기 때문에 오타로 인한 오류가 줄어듭니다.

  2. 리팩토링과 유지 보수: 엔티티 클래스는 데이터베이스 스키마를 나타내는 역할을 하지만, Q타입은 쿼리 작성을 위한 프로젝션과 필터링을 수행하는 데 사용됩니다. 엔티티 클래스와 Q타입을 분리하면, 엔티티 클래스의 변경이 쿼리 코드에 영향을 주지 않아 리팩토링과 유지 보수가 더 쉬워집니다.

  3. 프로젝션과 필터링: QueryDSL을 사용하면 엔티티를 다양한 방식으로 프로젝션하고 필터링할 수 있습니다. Q타입은 엔티티의 필드나 연관 관계를 활용하여 원하는 데이터를 추출하고 변환하는 데 사용됩니다.

  4. 자동 생성 및 확장성: Q타입은 QueryDSL에 의해 자동으로 생성됩니다. 이는 엔티티 클래스가 변경되면 쿼리 코드를 다시 생성할 필요가 없다는 장점을 가지며, 새로운 엔티티나 DTO가 추가될 때도 간편하게 확장할 수 있습니다.

  5. 테스트 용이성: Q타입을 사용하면 단위 테스트와 통합 테스트를 더 쉽게 작성할 수 있습니다. 모의 객체(Mock)를 사용하여 Q타입을 생성하고 조작할 수 있어서 테스트가 더 효과적으로 수행됩니다.

공식 레퍼런스에 있는 내용을 바탕으로 유추해보면

생성한 엔티티와 도메인 타입을 리플랙션 해서 생성된 query 타입(Q타입)을 구분지어 사용하기 위함이지 않을까 싶습니다.

1.2. Principles
Type safety is the core principle of Querydsl. Queries are constructed based on generated query types that reflect the properties of your domain types. Also function/method invocations are constructed in a fully type-safe manner.

http://querydsl.com/static/querydsl/4.1.3/reference/html_single/#d0e87

Reference