소개
Java Querydsl은 SQL과 NoSQL 데이터베이스에서 유형 안전한 쿼리 작성을 도와주는 자바 라이브러리입니다. Querydsl은 JPA, Hibernate, MongoDB, SQL, Cassandra 등 다양한 데이터베이스와 연동하여 사용할 수 있습니다. 이번 블로그 포스트에서는 Java Querydsl의 기본적인 사용 방법을 알아보겠습니다.
셋업
Maven 종속성 추가
먼저 Maven 프로젝트의 pom.xml
파일에 Querydsl에 대한 종속성을 추가합니다.
<dependencies>
<!-- Querydsl JPA -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.4.0</version>
</dependency>
<!-- Querydsl SQL -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-sql</artifactId>
<version>4.4.0</version>
</dependency>
<!-- Querydsl MongoDB -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-mongodb</artifactId>
<version>4.4.0</version>
</dependency>
</dependencies>
소스 코드 구성
각각의 데이터베이스에 맞는 Querydsl 구성 클래스를 작성해야 합니다. 아래는 JPA의 경우의 구성 클래스 예시입니다.
@Configuration
@EnableJpaRepositories(
basePackages = "com.example.repository",
repositoryFactoryBeanClass = QuerydslRepositorySupport.class
)
public class QuerydslConfiguration extends AbstractJpaQueryConfiguration {
@Override
public QuerydslPredicateExecutorFactory querydslPredicateExecutorFactory(EntityManager entityManager, CriteriaBuilder builder) {
return new QuerydslJpaPredicateExecutorFactory(entityManager, builder);
}
@Override
public MybatisQueryFactory queryFactory() {
return mybatisQueryFactory();
}
}
사용 예시
JPA 사용 예시
@Repository
public class UserRepositoryImpl extends QuerydslRepositorySupport implements UserRepository {
public UserRepositoryImpl() {
super(User.class);
}
@Override
public List<User> findByName(String name) {
QUser user = QUser.user;
return from(user)
.where(user.name.eq(name))
.fetch();
}
}
위 예시에서 UserRepositoryImpl
클래스는 QuerydslRepositorySupport
클래스를 상속받아 구현됩니다. findByName
메서드에서는 Querydsl의 from
과 where
절을 사용하여 이름에 해당하는 사용자를 조회하고 반환합니다.
SQL 사용 예시
@Configuration
public class SQLQuerydslConfig {
@Autowired
private DataSource dataSource;
@Bean
public SQLQueryFactory sqlQueryFactory() {
return new SQLQueryFactory(new Configuration(new MySQLTemplates()), dataSource);
}
}
@Repository
public class UserRepository {
private final SQLQueryFactory queryFactory;
public UserRepository(SQLQueryFactory queryFactory) {
this.queryFactory = queryFactory;
}
public List<User> findByName(String name) {
QUser user = QUser.user;
return queryFactory.selectFrom(user)
.where(user.name.eq(name))
.fetch();
}
}
위 예시에서는 SQLQueryFactory
빈을 생성하여 SQL 쿼리를 작성하는 데 사용합니다. UserRepository
클래스에서는 Querydsl의 selectFrom
와 where
절을 사용하여 이름에 해당하는 사용자를 조회하고 반환합니다.
MongoDB 사용 예시
@Configuration
@EnableMongoRepositories(
basePackages = "com.example.repository",
repositoryBaseClass = QuerydslMongoRepository.class
)
public class MongoQuerydslConfig {
}
@Repository
public class UserRepository {
private final QuerydslPredicateExecutor<User> executor;
public UserRepository(QuerydslPredicateExecutor<User> executor) {
this.executor = executor;
}
public List<User> findByName(String name) {
QUser user = QUser.user;
BooleanExpression condition = user.name.eq(name);
return (List<User>) executor.findAll(condition);
}
}
위 예시에서는 MongoQuerydslConfig
클래스에서 QuerydslMongoRepository
를 사용하여 Mongo 데이터베이스와 연동합니다. UserRepository
클래스에서는 Querydsl의 BooleanExpression
을 사용하여 이름에 해당하는 사용자를 조회하고 반환합니다.
정리
Java Querydsl을 사용하면 유형 안전한 쿼리 작성을 통해 데이터베이스와 쉽게 상호작용할 수 있습니다. 위에서 소개한 예시를 참고하여 적절하게 Querydsl을 활용해보세요.