심화 Spring

정예진·3일 전

Spring

목록 보기
18/19

2026.05.07

🧠 오늘 배운 것

JPQL이란

Entity 객체를 대상으로 쿼리를 작성하는 객체 지향 SQL

SQL vs JPQL

항목SQLJPQL
대상테이블엔티티
반환컬럼 값객체 또는 객체 필드
문법데이터베이스 종속JPA 구현체에 의해 처리됨
예시SELECT * FROM usersSELECT u FROM User u

JPQL을 사용하는 이유

  • 객체 중심 개발에 자연스럽게 녹아들 수 있음
  • 데이터베이스 독립성 확보
  • 정적 타입 지원 + 자동 바인딩
  • 복잡한 쿼리도 객체 기준으로 구성 가능

JPQL vs JPA 차이점

JPQL은 JPA 안에 속해 있는 쿼리 언어!

항목JPAJPQL
역할ORM 프레임워크 (자바 객체 ↔ DB)JPA 위에서 동작하는 쿼리 언어
목적CRUD 전반 관리, 영속성 관리엔티티 기준으로 데이터 조회 (Read 중심)
예시persist(), merge(), remove() 등 API@Query("SELECT u FROM User u")
SQL 사용 여부직접 SQL 쓰지 않음SQL 유사 문법 (하지만 객체 기준)
학습 난이도낮음 (단순 CRUD만 하면)약간 있음 (문법 숙지 필요)

언제 JPQL을 쓰냐?

상황권장 여부
단순 CRUD✖️ (JPA 메서드 이름으로 충분함)
복잡한 조건 조회 (WHERE, JOIN 등)✅ JPQL or QueryDSL
Native SQL 필요 (특정 DB 문법 등)✖️ NativeQuery 사용
동적 조건 필터링, 페이징 등✅ QueryDSL or JPQL (가능하나 복잡함)

기본 문법 정리

📌 SELECT

SELECT u FROM User u; // 전체 유저 객체 조회

SELECT u.username FROM User u; // 특정 필드만 조회

📌 WHERE

SELECT u FROM User u WHERE u.age > 20;

📌 ORDER BY

SELECT u FROM User u ORDER BY u.age DESC;

📌 JOIN

SELECT * FROM orders o JOIN user u ON o.user_id = u.id WHERE u.username = "KIM";

EAGER vs LAZY

로딩 방식EAGER (즉시 로딩)LAZY (지연 로딩)⭐️
설명연관된 엔티티를 즉시 로딩실제 사용하는 시점에 로딩
SQL 실행 시점해당 엔티티 조회 시 바로 함께 조회 (즉시 Join)getter 등으로 접근할 때 쿼리 실행
실무 기본 전략❌ 잘 안 씀 (비효율적)✅ 실무 기본값 (JPA 기본 설정도 LAZY)

N+1 문제

1번 쿼리 결과로 나온 N개의 데이터를 각각 또 조회해서 총 N+1번 쿼리가 실행되는 현상!

Fetch Join

연관된 엔티티를 한 번의 쿼리로 함게 조회하기 위한 JPQL 키워드

JOIN FETCH 키워드를 사용하면, 지연 로딩 설정이 되어 있더라고 즉시 로딩됨. (연관된 엔티티들을 SQL의 JOIN으로 함께 가져오기 때문에 추가 쿼리 발생 X)

Fetch Join 주의사항

  • 컬렉션 페이징 불가 - JOIN FETCH 를 사용하면 Pageable 이 정상 동작하지 않음.
  • 여러 컬렉션 Fetch Join 금지 - JPA는 1개 이상의 컬렉션 Fetch Join을 허용하지 않음. (예 : 게시글 + 댓글 + 태그 → 불가능)
  • 중복 제거 필요 - DISTINCT 를 사용해서 중복된 엔티티 제거 필요 (JPQL에서는 객체 기준으로 중복을 제거함.)

0개의 댓글