집돌이 공대남 IT

JPA 프로그래밍 마스터하기: 초급부터 전문가까지 실습을 통한 학습(13) 본문

IT/웹개발

JPA 프로그래밍 마스터하기: 초급부터 전문가까지 실습을 통한 학습(13)

집공이 2023. 8. 26. 12:00

실전! Entity Graph와 QueryDSL을 활용한 서비스 개선

안녕하세요, 여러분.집돌이 공대남입니다.

지난 시간에는 Entity Graph와 QueryDSL의 개념과 이들을 활용하는 방법에 대해 알아봤습니다.

이번에는 이러한 기능을 활용하여 실제 서비스를 어떻게 개선할 수 있는지에 대해 알아보겠습니다.

실습 환경 설정

이번 실습에서는 Spring Boot와 JPA, QueryDSL을 사용합니다. 개발 환경은 IntelliJ IDEA를 사용하며, 데이터베이스는 H2를 사용합니다. 프로젝트 구조는 Spring Initializr를 통해 생성하였습니다.

Entity Graph 활용하기

우선, '사용자(User)'와 '주문(Order)'가 있고, 특정 사용자와 그의 모든 주문을 한 번의 쿼리로 가져오는 기능을 구현해보겠습니다.

  1. 먼저, UserOrder 엔티티를 정의합니다.
@Entity
public class User {
    @Id @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = "user")
    private List<Order> orders = new ArrayList<>();
    //...
}

@Entity
public class Order {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    private User user;
    //...
}
  1. 다음으로, UserRepository를 정의합니다. 이 때, JPA의 Entity Graph 기능을 사용하여 사용자와 함께 주문 정보도 함께 조회하는 메소드를 추가합니다.
public interface UserRepository extends JpaRepository<User, Long> {
    @EntityGraph(attributePaths = "orders")
    Optional<User> findByIdWithOrders(Long userId);
}

이제 이 메소드를 사용하여 사용자와 그의 모든 주문을 한 번의 쿼리로 가져올 수 있습니다.

 

QueryDSL 활용하기

이제, 20세 이상 30세 이하의 사용자를 이름 순으로 조회하는 기능을 구현해보겠습니다.

  1. 먼저, QueryDSL 설정을 위해 build.gradle에 아래의 내용을 추가합니다.
plugins {
    id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}

def querydslSrcDir = 'src/main/generated'

querydsl {
    jpa = true
    querydslSourcesDir = querydslSrcDir
}

sourceSets {
    main.java.srcDir querydslSrcDir
}

configurations {
    querydsl.extendsFrom compileClasspath
}

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}
  1. 다음으로, UserRepository에 QueryDSL을 활용한 메소드를 추가합니다.
public interface UserRepository extends JpaRepository<User, Long>, UserCustomRepository {
    //...
}

public interface UserCustomRepository {
    List<User> findUsersInTheirTwenties();
}

public class UserCustomRepositoryImpl implements UserCustomRepository {
    private final JPAQueryFactory queryFactory;

    public UserCustomRepositoryImpl(EntityManager em) {
        this.queryFactory = new JPAQueryFactory(em);
    }

    @Override
    public List<User> findUsersInTheirTwenties() {
        QUser user = QUser.user;
        return queryFactory.selectFrom(user)
            .where(user.age.between(20, 30))
            .orderBy(user.name.asc())
            .fetch();
    }
}

이제 이 메소드를 사용하여 20세 이상 30세 이하의 사용자를 이름 순으로 조회할 수 있습니다.

이렇게 JPA의 Entity Graph와 QueryDSL을 적절히 활용하면 데이터 조회를 보다 효율적이고 유연하게 할 수 있습니다.

다음 시간에는 다른 고급 기능들에 대해 알아보도록 하겠습니다.

감사합니다.