BackEND/Java

JPA와 QueryDSL 소개 및 비교

mingmingIT 2025. 4. 1. 10:12

1. JPA란?

JPA(Java Persistence API)는 자바 애플리케이션에서 데이터베이스와 상호 작용하는 ORM(Object-Relational Mapping) 표준입니다. JPA를 사용하면 SQL을 직접 작성하지 않고도 객체지향적으로 데이터베이스를 다룰 수 있습니다.

JPA의 주요 특징

  • 객체와 관계형 데이터베이스 매핑(O/R Mapping) 지원
  • JPQL(Java Persistence Query Language) 제공
  • 자동 트랜잭션 관리
  • 캐싱 및 성능 최적화 기능 제공

JPA의 한계

  • 복잡한 동적 쿼리 작성이 어렵다.
  • 기본적으로 제공하는 JPQL은 정적 쿼리 작성에 적합하지만, 동적 쿼리는 번거롭다.
  • 네이티브 쿼리 사용 시 유지보수성이 떨어진다.

2. QueryDSL이란?

QueryDSL은 타입 세이프한 동적 쿼리를 쉽게 작성할 수 있도록 지원하는 프레임워크입니다. JPA와 함께 사용할 수 있으며, SQL과 유사한 형태로 쿼리를 작성할 수 있습니다.

QueryDSL의 주요 특징

  • 타입 세이프한 쿼리 제공: 런타임이 아닌 컴파일 타임에 오류를 잡을 수 있음
  • 가독성이 뛰어난 코드: SQL과 유사한 방식으로 작성 가능
  • 동적 쿼리 작성이 간편함: BooleanBuilder, Where절 조합을 통해 복잡한 조건 처리 가능

3. JPA vs QueryDSL 비교

항목 JPA (JPQL) QueryDSL
쿼리 작성 방식 문자열 기반 코드 기반 (타입 세이프)
동적 쿼리 번거로움 간편함 (BooleanBuilder 활용)
컴파일 타임 검증 불가능 가능
가독성 및 유지보수 낮음 높음
복잡한 쿼리 지원 한계가 있음 강력한 기능 제공

4. QueryDSL 적용 방법

QueryDSL을 사용하려면 프로젝트에 설정이 필요합니다. Spring Boot 프로젝트에서 QueryDSL을 적용하는 방법을 소개합니다.

1) QueryDSL 의존성 추가 (Gradle 기준)

implementation 'com.querydsl:querydsl-jpa:5.0.0'
annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jpa'

2) Q클래스 생성

QueryDSL은 엔티티에 대한 Q클래스를 자동으로 생성합니다. 예를 들어, Member 엔티티가 있다면 QMember 클래스가 생성됩니다.

@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private int age;
}

QueryDSL을 사용하면 아래와 같이 쿼리를 작성할 수 있습니다.

QMember member = QMember.member;
List<Member> members = queryFactory
    .selectFrom(member)
    .where(member.age.gt(20))
    .fetch();

5. 결론

JPA는 기본적인 CRUD 및 정적 쿼리 작성에는 적합하지만, 동적 쿼리 작성이 어렵다는 단점이 있습니다. 반면 QueryDSL은 코드 기반의 타입 세이프한 방식으로 가독성이 높고 유지보수하기 쉬운 동적 쿼리를 작성할 수 있습니다. 따라서 복잡한 데이터 조회가 필요한 경우 QueryDSL을 적극 활용하는 것이 좋습니다.