querydsl 5

[TIL] 코틀린 gradle querydsl 설정

문제 Querydsl에서 참조로하는 Q객체를 만들려고했는데 에러가 떴다. 해결방법 build.gradle.kts 파일에 가서 다음처럼 설정한다. plugins { id("org.springframework.boot") version "3.1.0" id("io.spring.dependency-management") version "1.1.0" kotlin("jvm") version "1.8.21" kotlin("plugin.spring") version "1.8.21" kotlin("kapt") version "1.7.10" } kapt: 스프링부트에서 롬복(lombok)을 사용하면 특정 어노테이션이 달린 클래스들을 롬복이 해석하여 소스 코드를 자동으로 생성해주듯이 코틀린에서 롬복처럼 사용하는 Annota..

[Querydsl]2. 기본 문법

기본문법은 대부분 익숙한 내용이라, 몰랐던 부분이나 중요한 부분만 위주로 개조식으로 작성한다. Q객체 생성하기 Maven으로 Build를 하면 Q 객체를 생성해줬었는데, Gradle은 Build를 해도 Q객체를 생성하지 않는다. 이전 글에서 배운 것처럼 compileQuerydsl을 직접해줘서 Q객체를 생성해줘야 한다. 기본 문법 static import를 안해서 어색할 수 있다. Q객체의 alias를 "m"과 같이 설정하고, 해당 객체를 querydsl 문법으로 넘기는 방식을 적용함을 자각하고 있자. 이 alias는 querydsl이 JPQL을 작성할 때 sql문의 alias로 사용한다. 같은 Q객체를 동시에 조회해야할 때, Q 객체의 alias를 지정해서 사용해주면 된다! 똑같은 엔티티에서 다른 내용..

[Querydsl]1. 프로젝트 생성 및 예제 작성해보기

Querydsl 왜 쓸까? 1. 문법이 sql문과 거의 유사하기 때문에 배우기 쉽고 간결하다. 자바처럼 프로퍼티 탐색('.' 찍기)으로 문법 검색이 가능하다. 2. JPQL의 String으로 작성하는 sql문에 비해서, querydsl의 문법은 자바의 문법을 차용하기 때문에 Compile 시점에 미리 에러를 잡아준다. (전체 파일이 실행되기 전에 문제가 있으면 바로 알려준다.) 3. 검색 조건 등 복잡하고 동적인 쿼리를 가능하게 해준다. 물론 한계가 있어서 통계성 쿼리 등은 natvie 쿼리 등으로 해결해야한다. 1. 프로젝트 생성 및 환경 설정 스타터에 querydsl은 없다. 그림상에 있는 dependencies들만 추가하여 프로젝트를 생성한다. springBoot가 querydsl의 버전을 관리해주..

[TIL] Querydsl cannot find symbol 에러

Querydsl을 사용하다보면 Repository에서 Q객체들을 생성할 수 없다고 하면서, querydsl cannot find symbol.. 에러가 발생한다. 구글링해보면 annotation processor 설정 문제라던가, Graven에서 querydsl의 참조 경로를 다시 지정해줘야 한다는 해결책들이 나와있다. 한가지 더 추가하자면, maven으로 프로젝트를 하는 경우 repository가 아니라 다른 클래스 파일에서 문제가 발생해서, 해당 오류 부분 때문에 Q객체를 생성하지 못하는 경우가 많았다. 생각해보면 멀쩡하게 잘 되던 build가 안되는 이유는, 내가 무언가를 바꾸었기 때문일 확률이 높다. 다른 사례들에서 보여주는 원인과 해결책은 설정이나 환경 문제인데 프로그래밍을 하면서 이런 설정들을..

[TIL][에러] 스프링 Projections constructor, No constructor found for class

상황 QueryDsl을 이용해서 Entity 에서 전체 필드를 호출하는 것이 아니라, 특정 필드들만 호출하거나, 연관된 다른 Entity의 필드를 동시에 호출하고 싶다면 아래와 같이 Projections.constructor를 사용한다. Repository쪽 코드 1 2 3 4 5 6 7 8 9 10 jpaQueryFactory .select(Projections.constructor(XxxDto.class , Xxx1Entity.id.as("id") , Xxx1Entity.name.as("siteName") , Xxx2Entity.visitor ) ) .from(...) ... Colored by Color Scripter cs XxxDto쪽 코드 1 2 3 4 5 6 7 8 9 @Data @Build..