inblog logo
|
Gyeongwon's blog
    Springboot

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

    도경원's avatar
    도경원
    Aug 23, 2025
    [스프링부트 #13] JPQL 핵심 개념
    Contents
    1. 대상은 “테이블”이 아닌 “엔티티”2. 기본 문법3. 자주 쓰는 예제들4. 파라미터 사용 방식5. 주의점
    엔티티 객체를 기준으로 하는 쿼리 언어이며, 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
    Contents
    1. 대상은 “테이블”이 아닌 “엔티티”2. 기본 문법3. 자주 쓰는 예제들4. 파라미터 사용 방식5. 주의점

    Gyeongwon's blog

    RSS·Powered by Inblog