처음 회사에서 들어 왔을때 개발 환경 세팅을 하는데 몇가지 문제가 발생했었는데 그중에서 가장 기억에 남았던 부분이 바로 q 파일 설치 관련해서 기억에 남았습니다. 

 

Q 클래스(q 파일)은?

QueryDSL에서 Q-파일은 특정 엔티티에 대한 메타모델을 자동으로 생성된 자바 클래스로 제공합니다. 이러한 파일들은 QueryDSL이 제공하는 타입-세이프한 쿼리 구성을 가능하게 하는 중요한 부분입니다. 이 Q-클래스들을 사용함으로써 개발자는 컴파일 시간에 타입 체크를 받을 수 있으며, IDE의 자동완성 기능을 활용하여 더욱 빠르고 정확하게 쿼리를 작성할 수 있습니다

 

Q-클래스 또는 Q-파일의 역할

  • 메타모델 생성: Q-클래스는 각 엔티티의 속성에 대한 메타데이터를 제공하며, 이를 통해 쿼리를 작성할 때 컴파일 시간에 타입 체크가 가능합니다.
  • 타입-세이프 쿼리 작성: 이 클래스들은 쿼리를 작성할 때 변수명이나 타입 오류를 컴파일 단계에서 잡아내어 런타임 에러의 가능성을 줄여줍니다.
  • 코드 자동 완성 지원: IDE에서 Q-클래스의 속성을 사용할 때 자동 완성 기능을 제공받을 수 있어 쿼리 작성이 더 빠르고 정확해집니다.

Q-클래스의 생성

QueryDSL은 APT(Annotation Processing Tool)를 사용하여 엔티티 클래스를 기반으로 Q-클래스를 자동 생성합니다. 이 과정은 Maven이나 Gradle과 같은 빌드 도구의 설정을 통해 자동화할 수 있습니다.

 

ex)

@Entity
public class Book {
    @Id
    private Long id;
    private String title;
    private String author;
}
public class QBook extends EntityPathBase<Book> {
    public static final QBook book = new QBook("book");

    public final NumberPath<Long> id = createNumber("id", Long.class);
    public final StringPath title = createString("title");
    public final StringPath author = createString("author");

    public QBook(String variable) {
        super(Book.class, forVariable(variable));
    }
}
QBook qBook = QBook.book;
JPAQuery<?> query = new JPAQuery<>(entityManager);
List<Book> books = query.select(qBook)
                        .from(qBook)
                        .where(qBook.author.eq("J.K. Rowling"))
                        .fetch();

 

여기서 문제가 되었던게 서버가 4개로 나눠져있어서 

( A ) <-> ( B ) <-> (C ) <-> (D )    너무 많아.. ㅠ Q 파일이 가끔 제대로 설치가 안될떄가 있었는데 .. 아직 정확한 원인을 봐야할것같은데 원인을 모르겠다.... ㅠㅠ 

 

에러코드

java: cannot find symbol
  symbol:   class QWorkFlowInfoEntity

일단 clean 후 install 해서 해결은 했는데 ... 이게 맞는건가 싶다.. 정확한 queryDsl과 q파일에 대해서 더 정확하게 알아야할것같다.

' > QueryDSL' 카테고리의 다른 글

Query DSL 이란?  (0) 2024.04.20

일단 회사에서 기본적으로 Spring JPA, Query DSL, 등 여러가지 기술들이 쓰기 때문에.. 주말이라도 공부를 안하면 못따라가겠다라고 느낄정도이다. 전 회사에선 ibatis를 기반으로 회사업무를 했다보니.. 이번이직회사에선 상당히 많은걸 알게 된다. 구조가 복잡한 대신 정말 자유도가 넓은 구조라고 느껴졌다. (난 이렇게 못짤것같다고 느낄 정도 였다 경외감이 느껴진다. ㅎㄷㄷ )
 
Query DSL 이란?
QueryDSL은 타입-세이프한 쿼리를 Java 언어로 작성할 수 있게 해주는 프레임워크입니다. SQL, JPA, JDO, 그리고 컬렉션 등 다양한 데이터 소스에 대한 쿼리를 자바 코드로 구현할 수 있게 해주며, 쿼리를 직접 문자열로 작성하는 것보다 오류를 줄이고, 개발 효율성을 높일 수 있습니다.
 

주요 기능

  • 타입-세이프 쿼리: 컴파일 시간에 타입 체크가 가능합니다.
  • 다양한 백엔드 지원: SQL, JPA, MongoDB, Lucene, Hibernate Search, JDO, JDBC 등 다양한 데이터 소스를 지원합니다.
  • 동적 쿼리: 조건에 따라 유연하게 쿼리를 구성할 수 있습니다.

Spring Boot에 QueryDSL 설정하기

maven

 <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>5.0.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>5.0.0</version>
    </dependency

gradle

implementation 'com.querydsl:querydsl-jpa'
implementation 'com.querydsl:querydsl-apt'

엔티티 및 리포지토리 작성

예를 들어, 간단한 Book 엔티티를 생성하고, QueryDSL을 사용하는 리포지토리를 작성

@Entity
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String author;

    // getters and setters
}

QueryDSL을 활용하는 리포지토리 인터페이스를 작성합니다.

public interface BookRepository extends JpaRepository<Book, Long>, QuerydslPredicateExecutor<Book> {
}

쿼리 사용 예

BookRepository를 사용하여 QueryDSL 쿼리를 실행하는 예입니다.

@Autowired
private BookRepository bookRepository;

public List<Book> findBooksByAuthor(String author) {
    QBook qBook = QBook.book;
    Predicate predicate = qBook.author.eq(author);
    return (List<Book>) bookRepository.findAll(predicate);
}

' > QueryDSL' 카테고리의 다른 글

q 클래스 !  (1) 2024.04.20

+ Recent posts