SpringBoot Querydsl
🧩 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 구성이 중요하다.
댓글남기기