🧩 Spring Boot Querydsl이란

정의

Spring Boot Querydsl은 JPQL을 타입 안전하게 작성할 수 있도록 Querydsl을 Spring Boot 프로젝트에 적용하는 방식이다. 복잡한 조회 조건, 동적 쿼리, 유지보수성 높은 Repository 구현에 자주 사용한다.

  • JPQL 문자열을 직접 쓰지 않아도 된다.
  • 컴파일 타임에 잘못된 경로를 확인할 수 있다.
  • 동적 쿼리를 깔끔하게 작성하기 좋다.

⚙️ 환경 설정

Gradle 설정

Querydsl을 사용하기 위해 Gradle 설정을 추가한다.

plugins {  
    id 'org.springframework.boot' version '2.5.4'  
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'  
    id 'java'  
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" // Querydsl 플러그인 추가  
}

dependencies {  
    implementation "com.querydsl:querydsl-jpa:4.4.0"  
    implementation "com.querydsl:querydsl-apt:4.4.0"  
    compileOnly 'org.projectlombok:lombok:1.18.34'
    annotationProcessor 'javax.persistence:javax.persistence-api:2.2'
    annotationProcessor 'org.projectlombok:lombok:1.18.34'
}

// Querydsl에서 사용할 경로 설정  
def querydslDir = "$buildDir/generated/querydsl"  

// Querydsl 설정  
querydsl {  
    jpa = true  
    querydslSourcesDir = querydslDir  
}  

// build 시 Querydsl 소스 포함 설정  
sourceSets {  
    main.java.srcDir querydslDir  
}  

// Querydsl 컴파일 설정  
compileQuerydsl {  
    options.annotationProcessorPath = configurations.querydsl  
}  

// Querydsl이 compileClassPath를 상속하도록 설정  
configurations {  
    compileOnly {  
       extendsFrom annotationProcessor  
    }  
    querydsl.extendsFrom compileClasspath  
}

설정 포인트

이 문서는 기존 프로젝트에서 사용한 플러그인 기반 설정을 유지한다. Querydsl 버전과 JPA 버전은 프로젝트의 Spring Boot 버전에 맞춰 맞추는 것이 중요하다.

JPA 설정 (JPAConfig 클래스 추가)

@Configuration  
@EnableJpaAuditing  
public class JPAConfig {  
   
    @PersistenceContext  
    private EntityManager em;  

    @Bean  
    public JPAQueryFactory jpaQueryFactory() {  
        return new JPAQueryFactory(em);  
    }  
}

🛠 실습 예제

Querydsl을 적용할 테이블 (TB_USR)

create table TB_USR  
(  
    USR_SEQ bigint(38) auto_increment comment '고객 순번'  
    primary key,  
    USR_NM varchar(50) default '' not null comment '고객 명',  
    USR_RN varchar(13) default '' not null comment '고객 주민등록 번호'  
)  
comment '고객정보';

Entity 정의 (User 클래스)

@Entity  
@Table(name = "TB_USR")  
@Getter @Setter  
@NoArgsConstructor  
public class User {  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    @Column(name = "USR_SEQ")  
    private Long id;  

    @Column(name = "USR_NM", nullable = false, columnDefinition = "VARCHAR(50) DEFAULT ''")  
    private String name;  

    @Column(name = "USR_RN", nullable = false, columnDefinition = "VARCHAR(13) DEFAULT ''")  
    private String registrationNumber;  
}

Repository 설정

public interface UserRepository extends JpaRepository<User, Long>, CustomUserRepository {  
}
public interface CustomUserRepository {  
}
public class UserRepositoryImpl extends RepositoryBase implements CustomUserRepository {  
    public UserRepositoryImpl(JPAQueryFactory queryFactory) {  
        super(queryFactory);  
    }  
}

단위 테스트

@SpringBootTest  
class UserRepositoryTest {  
    @Autowired  
    private UserRepository userRepository;  

    @Test  
    public void testSaveAndFindById() {  
        User user = new User("홍길동", "010-1111-1111");  
        User savedUser = userRepository.save(user);  

        User foundUser = userRepository.findById(savedUser.getId()).orElse(null);  
        assertThat(foundUser).isNotNull();  
        assertThat(foundUser.getName()).isEqualTo("홍길동");  
    }  
}

🧠 주요 개념

항목 설명
JPAQueryFactory Querydsl 쿼리를 생성하는 핵심 객체
Q 클래스 Entity를 기반으로 생성되는 Querydsl 전용 타입
CustomRepository 복잡한 쿼리를 직접 구현할 때 사용하는 확장 인터페이스
RepositoryImpl 커스텀 Repository 구현 클래스

⚠️ 주의사항

  • Querydsl Q 클래스가 생성되지 않으면 Gradle 설정과 annotationProcessor를 먼저 확인해야 한다.
  • Repository 구현 클래스 이름은 Spring이 찾을 수 있도록 규칙에 맞춰야 한다.
  • Querydsl 버전과 JPA 버전이 맞지 않으면 빌드 오류가 날 수 있다.
  • 테스트에서는 실제로 Q 클래스가 생성되는지 먼저 확인하는 것이 좋다.

📌 정리

  • Spring Boot Querydsl은 타입 안전한 동적 쿼리 작성에 유용하다.
  • JPAQueryFactory, Q 클래스, Custom Repository 구성이 핵심이다.
  • 설정이 맞지 않으면 Q 클래스 생성부터 막히기 때문에 Gradle 구성이 중요하다.

연결문서

댓글남기기