[java] Querydsl을 사용하여 데이터베이스 레플리카 분리하기

데이터베이스 레플리카는 원본 데이터베이스와 실시간으로 동기화된 복제본으로, 장애 복구 및 로드 밸런싱 등의 목적으로 사용됩니다. Querydsl은 SQL 쿼리를 생성해주는 자바 라이브러리로, 데이터베이스 레플리카 분리를 간편하게 구현할 수 있습니다.

이 예시에서는 Java와 Querydsl을 사용하여 데이터베이스 레플리카 분리를 구현하는 방법을 알아보겠습니다.

1. Querydsl 의존성 추가하기

먼저 프로젝트에 Querydsl 의존성을 추가해야합니다. Maven 프로젝트의 경우, pom.xml 파일에 다음 코드를 추가합니다:

<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-core</artifactId>
    <version>4.4.0</version>
</dependency>

Gradle 프로젝트의 경우, build.gradle 파일에 다음 코드를 추가합니다:

implementation 'com.querydsl:querydsl-core:4.4.0'

의존성을 추가한 후, 프로젝트를 새로고침하여 변경 사항을 적용합니다.

2. Querydsl 사용하기

2.1. Querydsl 설정하기

먼저, Querydsl을 사용하기 위해 Querydsl 소스 파일을 생성해야 합니다. com.example.querydsl 패키지 아래에 QUser라는 클래스를 생성합니다. 이 클래스는 User 엔티티의 필드와 관련된 메소드들을 포함하게 됩니다.

다음은 QUser 클래스의 예시입니다:

package com.example.querydsl;

import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.EntityPathBase;
import com.querydsl.core.types.dsl.PathBuilder;
import com.querydsl.jpa.impl.JPAQueryFactory;

import javax.persistence.EntityManager;
import java.util.Optional;

public class QUser extends EntityPathBase<User> {
    public static final QUser user = new QUser("user");

    public final NumberPath<Long> id;
    public final StringPath name;
    public final StringPath email;
    
    public QUser(String variable) {
        super(User.class, variable);
        id = createNumber("id", Long.class);
        name = createString("name");
        email = createString("email");
    }
 }

2.2. Querydsl 쿼리 작성하기

이제 Querydsl을 사용하여 데이터베이스 레플리카를 분리하기 위한 쿼리를 작성해보겠습니다. 예를 들어, User 엔티티에서 특정 이메일 주소를 가진 사용자를 조회하는 쿼리는 다음과 같이 작성할 수 있습니다:

import com.example.querydsl.QUser;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import java.util.Optional;

@Repository
public class UserRepository {

    @Autowired
    private EntityManager entityManager;

    public Optional<User> findByEmail(String email) {
        JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
        QUser qUser = QUser.user;

        return Optional.ofNullable(queryFactory.selectFrom(qUser)
                .where(qUser.email.eq(email))
                .fetchOne());
    }
}

위의 코드에서 JPAQueryFactory는 EntityManager를 사용하여 Querydsl 쿼리를 실행하기 위한 도구입니다. QUser 클래스를 사용하여 쿼리에 필요한 필드와 제약조건을 추가하고, fetchOne() 메소드를 사용하여 결과를 반환합니다.

3. 레플리카 쿼리 실행하기

위에서 작성한 UserRepository 클래스의 findByEmail() 메소드를 호출하여 레플리카 데이터베이스에서 사용자를 조회할 수 있습니다. 다음은 이를 수행하는 예시 코드입니다:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/users/{email}")
    public User getUserByEmail(@PathVariable String email) {
        return userRepository.findByEmail(email)
                .orElseThrow(() -> new RuntimeException("User not found"));
    }
}

위의 코드에서 /users/{email} API는 사용자의 이메일 주소를 입력받아 해당 이메일 주소를 가진 사용자를 조회합니다. 조회 결과가 없는 경우, 예외를 발생시킵니다.

결론

Querydsl을 사용하여 데이터베이스 레플리카를 분리하는 방법을 알아보았습니다. Querydsl은 SQL 쿼리를 자바 코드로 표현할 수 있게 해주어 개발자에게 편리함을 제공합니다. 데이터베이스 레플리카 분리는 애플리케이션의 가용성과 성능에 중요한 영향을 미치므로, 이러한 기능을 구현하는데 있어 Querydsl은 강력한 도구로 사용될 수 있습니다.

참고 자료: