[java] Java Querydsl을 사용하여 다중 데이터베이스 연동하기

Querydsl은 Java 기반의 동적 쿼리 생성 프레임워크로, 데이터베이스에 대한 타입 안전한 쿼리를 작성할 수 있게 해줍니다. 이번 포스트에서는 Querydsl을 사용하여 다중 데이터베이스를 연동하는 방법을 알아보겠습니다.

1. Querydsl 설정

먼저, 프로젝트의 의존성에 Querydsl 관련 라이브러리를 추가해야 합니다. Gradle을 사용하는 경우, build.gradle 파일에 다음과 같이 의존성을 추가합니다.

dependencies {
    implementation 'com.querydsl:querydsl-core:<version>'
    implementation 'com.querydsl:querydsl-jpa:<version>'
}

위의 예시에서 <version>은 사용하고 있는 Querydsl 라이브러리의 버전을 입력해야 합니다.

2. 다중 데이터베이스 연동 설정

다중 데이터베이스 연동을 위해서는 여러 데이터베이스에 대한 설정이 필요합니다. Querydsl에서는 SQLTemplates라는 클래스를 활용하여 각 데이터베이스의 방언(Dialect) 설정을 할 수 있습니다.

public class DatabaseConfig {

    @Bean
    public SQLTemplates sqlTemplates() {
        return new H2Templates(); // 예시로 H2 데이터베이스를 사용합니다.
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() {
        // EntityManagerFactory를 생성하는 코드 작성
    }

    @Bean
    public JPAQueryFactory queryFactory(EntityManager entityManager, SQLTemplates sqlTemplates) {
        JPAQueryFactory queryFactory = new JPAQueryFactory(sqlTemplates, entityManager);
        return queryFactory;
    }

}

위의 예시에서는 H2 데이터베이스를 사용하도록 SQLTemplates를 설정하였습니다. 실제로 사용중인 데이터베이스에 맞게 SQLTemplates를 설정해주면 됩니다.

3. 다중 데이터베이스 활용

다중 데이터베이스 활용을 하기 위해선 각각의 데이터베이스에 대한 EntityManager를 생성해야 합니다. 이후 Querydsl에서 각각의 데이터베이스에 접근하여 쿼리를 실행할 수 있습니다.

@Repository
public class UserRepository {

    @PersistenceContext(unitName = "primaryUnit") // primary 데이터베이스에 대한 EntityManager
    private EntityManager primaryEntityManager;

    @PersistenceContext(unitName = "secondaryUnit") // secondary 데이터베이스에 대한 EntityManager
    private EntityManager secondaryEntityManager;

    public List<User> getUsersFromPrimary() {
        JPAQueryFactory queryFactory = new JPAQueryFactory(primaryEntityManager);
        QUser user = QUser.user;

        return queryFactory.selectFrom(user)
                .where(user.active.isTrue())
                .fetch();
    }

    public List<User> getUsersFromSecondary() {
        JPAQueryFactory queryFactory = new JPAQueryFactory(secondaryEntityManager);
        QUser user = QUser.user;
  
        return queryFactory.selectFrom(user)
                .where(user.role.eq("ADMIN"))
                .fetch();
    }

}

위의 예시에서는 primary 데이터베이스와 secondary 데이터베이스에 대한 EntityManager를 주입받아, 각각의 데이터베이스에 적합한 쿼리를 작성하여 실행합니다.

마무리

이번 포스트에서는 Java Querydsl을 사용하여 다중 데이터베이스를 연동하는 방법에 대해 알아보았습니다. Querydsl의 강력한 기능을 활용하여 다양한 데이터베이스를 연동해보세요.

더 자세한 내용은 Querydsl 공식 문서를 참고하시기 바랍니다.

참고: 이 포스트에서는 Java와 Spring Framework 환경을 기준으로 작성되었습니다.