[스프링부트 #13] JPQL 핵심 개념

도경원's avatar
Aug 23, 2025
[스프링부트 #13] JPQL 핵심 개념
엔티티 객체를 기준으로 하는 쿼리 언어이며, DB 벤더 종속성이 줄고 유지보수성이 높아진다.
SQL과 비슷하지만, “객체(Entity)를 기준으로 쿼리” 한다는 점이 근본적으로 다르다.

1. 대상은 “테이블”이 아닌 “엔티티”

  • SQL: SELECT * FROM user_tb
  • JPQL: SELECT u FROM User u
User는 자바 클래스, u는 그 클래스의 별칭(alias)
u.username처럼 자바 필드명을 사용함 (컬럼명이 아님)

2. 기본 문법

JPQL 문법
설명
예시
SELECT
조회
SELECT u FROM User u
WHERE
조건
WHERE u.age >= 20
ORDER BY
정렬
ORDER BY u.createdAt DESC
JOIN
조인
JOIN u.team t
GROUP BY
그룹핑
GROUP BY u.team
HAVING
그룹 조건
HAVING COUNT(u) > 1
UPDATE, DELETE
벌크 연산
UPDATE User u SET u.age = 0

3. 자주 쓰는 예제들

전체 조회

SELECT u From User u

조건 조회

SELECT u FROM User u WHERE u.age > 20

정렬

SELECT u FROM USER u ORDER BY u.createdAt DESC

JOIN

SELECT p FROM POST p JOIN p.user u WHERE u.username = :username
  • JOIN은 엔티티의 연관관계 필드를 기준으로 함
  • SQL처럼 ON 조건이 아니라 객체 필드로 자동 조인

Fetch Join (지연 로딩 해결)

SELECT p FROM Post p JOIN FETCH p.user
  • Post와 연관된 User를 한 번의 쿼리로 함께 가져옴
  • N+1 문제 해결 핵심 전략

IN 절

SELECT u FROM USER u WHERE u.role IN ('USER', 'ADMIN')

COUNT, AVG, MAX 등 집계

SELECT COUNT(u) FROM User u WHERE u.age > 30

4. 파라미터 사용 방식

이름 기반

@Query("SELECT u FROM USER u WHERE u.username = :username") User findByUsername(@Param("username") String username);

위치 기반

@Query("SELECT u FROM User u WHERE u.age > ?1") List<User> findOlderThan(int age);

5. 주의점

  • JPQL은 반드시 엔티티 필드명 기준 (DB 컬럼명 쓰면 오류)
  • SELECT * 안됨 → 항상 명시적으로 SELECT u 형태
  • DTO로 결과를 받으려면 new 키워드 사용
SELECT new com.example.dto.UserDTO(u.username, u.age) FROM User u
Share article

Gyeongwon's blog