IT 정보/JPA

Spring Data JPA 쿼리를 작성 방식

개발하는 동그리 2025. 4. 7. 23:05
728x90
반응형

 

✅ 다른 방식과의 비교 요약 (상세)

항목 JPA 기본 JPQL 네이티브 SQL Specification Querydsl
구현 복잡도 매우 낮음 낮음 보통 보통 높음
동적 조건 처리 불가 어려움 복잡 쉬움 매우 쉬움
타입 안전성 낮음 낮음 낮음 낮음 높음
가독성/유지보수 보통 보통 낮음 보통~낮음 좋음
조인/서브쿼리 불가 제한적 가능 제한적 강력
페이징/정렬 자동 지원 수동 또는 Pageable 수동 처리 필요 자동 지원 자동 지원

 


 

✅ JPA 기본 & Querydsl

요구사항 메서드 이름 기반 Querydsl
단순 조회 (id, status) ✔ 가능 -
검색어 포함 여부 (키워드) ✘ 어려움 ✔ Querydsl로 처리
날짜 범위 검색 ✘ 어려움 ✔ Querydsl로 처리
동적 조건: 특정 조건이 있을 때만 필터 적용 ✘ 불가능 ✔ Querydsl의 BooleanBuilder 사용
정렬/페이징 ✔ 가능 (Pageable) ✔ 함께 처리 가능
조인 후 조건 검색 ✘ 어려움 ✔ join().fetchJoin() 등으로 가능

 

 

1. 메서드 이름 기반 (Method Name Query)

Page<Message> findByEvaluationType(EvaluationType evaluationType, Pageable pageable);

📌 개요

  • 메서드 이름만으로 쿼리를 자동 생성
  • Spring Data JPA의 기본 제공 기능

✅ 장점

  • 매우 간단하고 직관적
  • 쿼리 작성 필요 없음
  • 자동 페이징(Pageable), 정렬 지원

❌ 단점

  • 복잡한 조건이 있을 경우 메서드 이름이 지나치게 길어짐
  • 조건이 동적일 경우 대응 어려움
  • 조인, 그룹핑 등 고급 기능 제한적

2. JPQL (@Query)

@Query("SELECT m FROM Message m WHERE m.feedbackCategory = :category")
List<Message> findByCategory(@Param("category") FeedbackCategory category);

📌 개요

  • 엔티티를 대상으로 하는 객체 중심 쿼리
  • SQL이 아닌 JPQL(Java Persistence Query Language) 사용

✅ 장점

  • SQL보다 추상적이므로 JPA의 장점을 살림
  • 복잡한 쿼리도 메서드 이름보다 유연하게 작성 가능
  • 엔티티 기반이라 DB 이식성 보장

❌ 단점

  • 문자열 기반이라 오타 발견 어려움 (컴파일 타임 검증 불가)
  • 복잡한 동적 조건은 처리하기 어려움
  • 리팩토링 시 필드명 변경 자동 추적 어려움

3. 네이티브 SQL (@Query(nativeQuery = true))

@Query(value = "SELECT * FROM message WHERE evaluation_type = 'EXCELLENT'", nativeQuery = true) 
List<Message> findExcellentMessages();
 
 

📌 개요

  • 실제 DB의 SQL 문법을 그대로 사용
  • 테이블명, 컬럼명, 함수 등을 직접 지정

✅ 장점

  • DB 최적화된 고성능 쿼리 작성 가능
  • JPQL로 불가능한 DB 특정 기능 사용 가능 (예: LIMIT, REGEXP 등)

❌ 단점

  • DB 종속적 (MySQL, Oracle 등마다 문법 다름)
  • 엔티티 기반이 아니므로 유지보수성 낮음
  • 리팩토링, 타입 안전성, 오타 검출 불가능

4. Querydsl

QMessage m = QMessage.message;

List<Message> result = queryFactory
    .selectFrom(m)
    .where(m.evaluationType.eq(EvaluationType.EXCELLENT))
    .orderBy(m.createdAt.desc())
    .fetch();

📌 개요

  • Java 코드로 쿼리를 조립하는 타입 안전한 DSL(Domain Specific Language)
  • Querydsl 전용 Q 클래스 생성 필요

✅ 장점

  • 컴파일 타임에 오타 검출 가능 (타입 안전)
  • 동적 쿼리 조합에 최적화
  • 서브쿼리, 조인, 그룹핑 등 고급 쿼리에 강력
  • 리팩토링에 매우 유리

❌ 단점

  • 설정 복잡 (빌드 시 Q 클래스 생성 필요)
  • 초기 학습 필요 (JPQL보다 진입 장벽 높음)
  • 간단한 쿼리에는 다소 과한 코드일 수 있음
728x90
반응형

'IT 정보 > JPA' 카테고리의 다른 글

[JPA] @Transactional(readOnly = true) 란?  (2) 2025.04.09