-- SQL 예시
SELECT * FROM member WHERE name = '홍길동';
-- JPQL 예시
SELECT m FROM Member m WHERE m.name = '홍길동';
SELECT m FROM Member m WHERE m.age > 20
Member는 엔티티 클래스, m은 별칭(alias)이다.SELECT o FROM Order o JOIN o.member m WHERE m.name = '홍길동'
Order가 Member와 연관되어 있다면 SQL처럼 외래 키가 아니라 필드명을 사용한다.SELECT m FROM Member m WHERE m.name LIKE '%길동%'
SELECT m FROM Member m WHERE m.age IN (20, 30, 40)
SELECT m FROM Member m ORDER BY m.age DESC
| 항목 | JPQL | SQL |
|---|---|---|
| 기준 | 자바 객체(Entity) | DB 테이블, 컬럼 |
| 추상화 수준 | 객체 지향적 | 데이터베이스 지향적 |
| 실행 대상 | 엔티티 매핑 정보 기반 | 데이터베이스 |
| 사용 목적 | 비즈니스 로직에서 객체 탐색 | DB 직접 탐색 |
@Query와 함께 사용하면 복잡한 쿼리도 쉽게 처리@Query("SELECT m FROM Member m WHERE m.email = :email")
Member findByEmail(@Param("email") String email);
fetch join을 사용하지 않으면 지연 로딩(Lazy Loading)으로 인해 N+1 문제가 발생할 수 있음JPQL은 SQL과 비슷해 익숙하면서도 객체 지향적으로 설계되어 JPA의 핵심 철학에 잘 맞는다.
특히 Spring Data JPA에서 @Query와 함께 활용하면 복잡한 조회 로직을 명확하고 간결하게 작성할 수 있다는 점이 매우 강력하다.
연관관계를 잘 파악하고 사용하지 않으면 성능 문제가 생길 수 있기 때문에 쿼리 최적화와 fetch join 사용 여부 등을 항상 고민해야겠다고 느꼈다.