[java] Java Querydsl의 사용 방법

소개

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의 fromwhere 절을 사용하여 이름에 해당하는 사용자를 조회하고 반환합니다.

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의 selectFromwhere 절을 사용하여 이름에 해당하는 사용자를 조회하고 반환합니다.

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을 활용해보세요.

참고 자료