Mecodata 2025. 7. 12. 12:01

정의

- QueryDSL이 Entity 클래스를 기반으로 자동 생성하는 클래스로 Entity 클래스의 메타 데이터를 가지고 있는 클래스

 

특징

- Q+[엔티티명] 형식으로 자동 생성됨 (generated 폴더)

- 엔티티의 각 필드는 Q클래스에서 QueryDSL 타입 필드로 변환

- 컴파일 단계에서 생성 → 런타임 시점에 에러를 발견하는 보통의 경우와 다르게 컴파일 단계에서 에러 발견 가능

- 필드명(컬럼명)을 직접 기억하지 않고 쿼리 작성을 보다 편리하게 할 수 있음

- 엔티티를 직접 사용하는 것이 아니라 QueryDSL이 엔티티 클래스 정보 활용을 위해 QClass를 만들어 사용

타입 안전한 쿼리작성 가능 (타입 안정성 보장)

※ 일반적으로 .gitignore로 관리 제외

 

예시

엔티티

@Entity
public class Member {
    @Id
    private Long id;
    private String username;
    private int age;
}

Q클래스

public class QMember extends EntityPathBase<Member> {

    public static final QMember member = new QMember("member");

    public final NumberPath<Long> id = createNumber("id", Long.class);
    public final StringPath username = createString("username");
    public final NumberPath<Integer> age = createNumber("age", Integer.class);

}

조회 메소드 예시

import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@RequiredArgsConstructor
public class MemberRepositoryCustom {

    private final JPAQueryFactory queryFactory;

    public List<Member> findByUsername(String username) {
        QMember m = QMember.member;

        return queryFactory
                .selectFrom(m)
                .where(m.username.eq(username))
                .fetch(); // List<Member> 반환
    }
}

// List<Member> users = memberRepositoryCustom.findByUsername("홍길동");
// SELECT * FROM member WHERE username = '홍길동'