25.04.01 TIL JPQL

신성훈·2025년 4월 1일
0

TIL

목록 보기
159/162

1. JPQL이란?

  • JPQL은 Java Persistence API에서 제공하는 객체 지향 쿼리 언어
  • 기존 SQL이 데이터베이스의 테이블과 컬럼을 대상으로 쿼리를 작성하고
    JPQL은 엔티티(Entity)와 그 속성(필드)을 대상으로 쿼리를 작성한다.
  • SQL과 문법이 유사하지만 DB가 아닌 자바 객체(Entity)를 기반으로 동작한다는 것이 가장 큰 차이점이다.
-- SQL 예시
SELECT * FROM member WHERE name = '홍길동';

-- JPQL 예시
SELECT m FROM Member m WHERE m.name = '홍길동';

2. JPQL 기본 문법

SELECT

SELECT m FROM Member m WHERE m.age > 20
  • Member는 엔티티 클래스, m은 별칭(alias)이다.
  • 실제 쿼리는 JPA가 Member 엔티티를 조회하기 위한 SQL로 변환해 실행한다.

JOIN

SELECT o FROM Order o JOIN o.member m WHERE m.name = '홍길동'
  • 객체 간의 연관관계(association)를 이용해 JOIN을 수행한다.
  • OrderMember와 연관되어 있다면 SQL처럼 외래 키가 아니라 필드명을 사용한다.

LIKE, IN, ORDER BY 등

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

3. JPQL vs SQL

항목JPQLSQL
기준자바 객체(Entity)DB 테이블, 컬럼
추상화 수준객체 지향적데이터베이스 지향적
실행 대상엔티티 매핑 정보 기반데이터베이스
사용 목적비즈니스 로직에서 객체 탐색DB 직접 탐색

4. JPQL의 장점

  • DB 독립적 쿼리 작성 가능 (특정 DBMS에 종속되지 않음)
  • 객체 지향적으로 설계되어 엔티티 관계를 쉽게 활용
  • @Query와 함께 사용하면 복잡한 쿼리도 쉽게 처리
@Query("SELECT m FROM Member m WHERE m.email = :email")
Member findByEmail(@Param("email") String email);

5. 주의할 점

  • JPQL은 실제 SQL로 번역되어 실행되므로 성능 튜닝 시 SQL 로그 확인이 필요함
  • fetch join을 사용하지 않으면 지연 로딩(Lazy Loading)으로 인해 N+1 문제가 발생할 수 있음
  • 동적 쿼리가 많아지는 경우 QueryDSL 또는 Criteria API 등의 대안이 필요할 수 있음

6. 마무리

JPQL은 SQL과 비슷해 익숙하면서도 객체 지향적으로 설계되어 JPA의 핵심 철학에 잘 맞는다.
특히 Spring Data JPA에서 @Query와 함께 활용하면 복잡한 조회 로직을 명확하고 간결하게 작성할 수 있다는 점이 매우 강력하다.
연관관계를 잘 파악하고 사용하지 않으면 성능 문제가 생길 수 있기 때문에 쿼리 최적화와 fetch join 사용 여부 등을 항상 고민해야겠다고 느꼈다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글