[java] Java Querydsl을 사용하여 쿼리 로깅하기

Querydsl은 Java에서 사용할 수 있는 SQL 및 JPA 쿼리 빌더 라이브러리입니다. 이 라이브러리를 사용하면 타입 안정성을 제공하면서 동적 쿼리를 작성할 수 있습니다. 이번 블로그 포스트에서는 Querydsl을 사용하여 쿼리 로깅을 구현하는 방법을 알아보겠습니다.

1. Querydsl 로깅 설정하기

먼저, Querydsl의 로깅 기능을 활성화해야 합니다. 로깅은 개발 중에 쿼리를 실시간으로 확인하기 위해 유용한 도구입니다. Querydsl은 로깅을 위해 SLF4J API를 사용하므로, 이를 위해 SLF4J 라이브러리를 의존성에 추가해야 합니다.

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>

또한, 로깅 레벨을 설정해야 합니다. 일반적으로 개발 중에는 로깅 레벨을 DEBUG로 설정하여 모든 쿼리를 확인할 수 있습니다.

2. Querydsl 쿼리 로깅하기

Querydsl은 JPA, SQL, MongoDB 등 다양한 유형의 쿼리를 지원합니다. 각각의 유형에 따라 다른 방법으로 쿼리를 로깅할 수 있습니다.

2.1. JPA 쿼리 로깅하기

JPA를 사용하는 경우, JPAQuery 객체를 생성하여 쿼리를 실행할 수 있습니다. JPAQuery는 com.querydsl.jpa.impl.JPAQuery 클래스입니다. JPAQuery 객체를 생성한 후 해당 객체의 toString() 메서드를 호출하면 쿼리를 확인할 수 있습니다.

import com.querydsl.jpa.impl.JPAQuery;

public class UserRepository {

    private EntityManager entityManager;
    
    public List<User> getUsers() {
        JPAQuery<User> query = new JPAQuery<>(entityManager);
        QUser user = QUser.user;
        
        List<User> users = query.select(user)
                            .from(user)
                            .fetch();
        
        // 쿼리 로깅
        System.out.println(query.toString());

        return users;
    }
}

2.2. SQL 쿼리 로깅하기

SQL을 직접 작성하여 쿼리를 실행하는 경우, SQLQuery 객체를 사용하여 쿼리를 작성할 수 있습니다. SQLQuery는 com.querydsl.sql.SQLQuery 클래스입니다. SQLQuery 객체의 toString() 메서드를 호출하여 쿼리를 확인할 수 있습니다.

import com.querydsl.sql.SQLQuery;

public class EmployeeRepository {

    private SQLQuery sqlQuery;
    
    public List<Employee> getEmployees() {
        QEmployee employee = QEmployee.employee;
        
        List<Employee> employees = sqlQuery.select(employee)
                                .from(employee)
                                .fetch();
        
        // 쿼리 로깅
        System.out.println(sqlQuery.toString());

        return employees;
    }
}

3. Querydsl 로깅 결과 확인하기

위의 예제에서 쿼리를 실행하고 로깅한 결과는 다음과 같습니다.

JPA 쿼리 로깅 예시:

select user
from User user

SQL 쿼리 로깅 예시:

select employee
from Employee employee

위의 예시처럼, Querydsl을 사용하여 쿼리 로깅을 설정하고 쿼리 결과를 확인할 수 있습니다. 로깅은 개발 중에 쿼리의 작동을 이해하고 디버깅하는 데 도움이 되며, 성능 문제나 잠재적인 버그를 찾는 데에도 유용합니다.