JPQL (Java Persistence Query Language)

문지원(JiwonMoon)·2022년 9월 3일
0
post-thumbnail

JPQL 이란?

JPA의 일부로 정의된 플랫폼 독립적인 객체지향 쿼리 언어이다.
JPQL은 관계형 데이터베이스의 엔티티에 대한 쿼리를 만드는데 사용된다.
SQL에 크게 영향을 받아 SQL문과 유사하지만 DB의 테이블에 직접 연결되는 것이 아니라 JPA 엔티티에 대해 동작한다.
그렇기 때문에 JPQL의 쿼리에는 테이블이 아닌 엔티티에서 표현하고 있는 컬럼의 이름을 써줘야 한다.

정리하면,

  • SQL과 비슷한 문법을 가진 객체 지향 쿼리이다.
  • 테이블 검색이 아니라 객체를 검색하는 쿼리이다.
  • JPA는 JPQL을 분석해서 SQL을 자동으로 생성해서 DB에서 쿼리를 만들어준다

동작과정

  1. JPQL을 실행하면 영속성 컨텍스트로 요청을 보낸다.
  2. 영속성 컨텍스트는 1차 캐시에 엔티티 존재 여부 상관없이 DB에 질의한다.
  3. DB 질의를 통해 조회된 데이터는 영속성 컨텍스트가 다시받는다.
  4. 데이터에 전달받은 영속성 컨텍스트는 엔티티를 초기화하고 캐시에 저장한다.
  5. 캐시에 저장한 후 엔티티를 반환한다.

영속성 컨텍스트란? 엔티티를 저장하고 관리하는 저장소
앤티티 매니저를 통해 접근할 수 있다.
영속성 컨텍스트에 관리되는 엔티티의 상태를 영속 상태라고 한다.

JPQL의 형태를 보면 SQL과 비슷하지만 다른 점이 있다. 

  • 대소문자 구분
    • 엔티티 이름과 속성은 대소문자를 구분한다.
    • JPQL 키워드는 대소문자 구분 없이 사용 가능하다. (ex : SELECT == select)
  • 엔티티명
    • FROM 절 뒤에 사용하는 것은 클래스명이 아니라 엔티티명이다.
    • @Entity(name=xx) 혹은 클래스명과 동일하면 생략 가능
  • 별칭
    • SQL과 다르게 JPQL에서는 별칭이 필수적으로 명시해야 한다.
    • 생략도 가능하다.
    • from 절 뒤에 해당 엔티티 + 별칭 형태로 사용한다.
  • 파라미터 바인딩
    • 클래스에 정의된 프로퍼티 앞에  :  를 사용한다.
    • LIKE와 같은 형태를 사용할 때 주의할 점
      - JPQL에 직접 문자를 쓰면 SQL Injection을 당할 수 있다.
      - JPA에서 파라미터만 다를 뿐 같은 쿼리로 인식하므로, JPQL을 SQL로 파싱한 결과를 재사용할 수 있다.
  • 페이징 API

    • setFirstResult(int startPosition) : 조회 시작 위치
    • setMaxResults(int maxResult) : 조회할 데이터 수
  • DTO 사용

    • 데이터를 전송하기 위해서 엔티티 자체를 쓸 수 있지만 엔티티 자체를 사용하는 것은 바람직하지 않다.
    • DTO를 사용하면 약간의 불편한 점이 있다.
    • new 뒤에 해당하는 패키지명을 모두 작성해야 한다.
    • 그래서 Querydsl을 사용하면 조금 더 편하게 사용할 수 있다.
  • 조인
    -INNER JOIN : INNER은 생략 가능
    -LEFT OUTER JOIN : OUTER 생략 가능
    -FETCH JOIN
    - JPQL에서 성능 최적화를 위해 제공하는 기능
    - 연관된 엔티티나 컬렉션을 한 번에 같이 조회(JPQL은 결과를 반환할 때 연관까지 고려하지 않음)
    - SQL 호출 횟수를 줄여 성능 최적화
    - 쿼리 시점에 조회하므로 지연 로딩이 발생하지 않음
    - N + 1 문제를 해결하는 데 주로 사용되는 방법이다.

References (참고 자료)

0개의 댓글