![[스프링부트 #13] JPQL 핵심 개념](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%255B%25EC%258A%25A4%25ED%2594%2584%25EB%25A7%2581%25EB%25B6%2580%25ED%258A%25B8%2B%252313%255D%2BJPQL%2B%25ED%2595%25B5%25EC%258B%25AC%2B%25EA%25B0%259C%25EB%2585%2590%26tag%3DTemplate%2B1%26description%3D%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%252323ec86%26bgEndColor%3D%252323ec86%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3D%26blogTitle%3DGyeongwon%2527s%2Bblog&w=2048&q=75)
엔티티 객체를 기준으로 하는 쿼리 언어이며, 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