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 |
---|