Post

[JPA #4] JPQL과 쿼리 언어들

[JPA #4] JPQL과 쿼리 언어들

주요 키워드

  • JPQL
  • QueryDSL
  • Criteria
  • 네이티브 SQL
  • SpringJdbcTemplate

객체지향 쿼리 언어(JPQL)

  • JPA는 엔티티 객체 중심 개발을 지향
  • 검색 시에도 테이블이 아닌 엔티티 객체를 기준으로 탐색
  • 결국 SQL처럼 조건을 걸 수 있는 쿼리 언어가 필요 → JPQL 사용
  • SQL과 문법 유사, ANSI 표준 SQL 문법 대부분 지원
  • 특정 DB에 종속되지 않음
  • 단점: 문자열 기반이기 때문에 동적 쿼리 작성이 어렵다

Criteria

  • 동적 쿼리 작성 가능
  • 자바 표준 API, 컴파일 시점 오류 확인 가능
  • 단점: 코드 복잡도 매우 높음 → 유지보수 어려움
  • 실무에서는 Criteria 대신 QueryDSL 사용 권장

QueryDSL

  • 자바 코드로 SQL처럼 쿼리 작성 가능
  • 문법 오류를 컴파일 타임에 잡을 수 있음
  • 동적 쿼리 작성이 매우 편리
  • 문법이 단순하고 명확 → 실무에서 가장 많이 사용

네이티브 SQL

  • JPQL로 해결 불가능한 DB 종속 쿼리를 작성할 때 사용
  • 성능 튜닝, 특정 DB 함수 등을 사용할 경우 필요

SpringJdbcTemplate

  • JDBC 커넥션을 직접 사용 가능
  • 영속성 컨텍스트 동기화를 위해 수동 플러시 고려 필요

JPQL 문법 요약

  • 엔티티 이름, 속성 이름은 대소문자 구분 (Member, age)
  • JPQL 키워드는 대소문자 구분 없음 (select, from 등)
  • 테이블명이 아닌 엔티티명 사용
  • 별칭(alias) 지정 필수 (as 생략 가능)
1
select m from Member m where m.age > 20
  • TypedQuery: 반환 타입이 명확할 때 사용
  • Query: 반환 타입이 불분명할 때 사용

결과 조회 메소드

  • getResultList()
    • 결과가 0개 이상일 때 사용
    • 결과 없음 → 빈 리스트 반환
  • getSingleResult()
    • 결과가 정확히 1개일 때 사용
    • 없음: NoResultException
    • 2개 이상: NonUniqueResultException

파라미터 바인딩

  • 이름 기준 (:username) 또는 위치 기준 (?1)
  • 이름 기준 사용 권장

프로젝션

  • select 절에서 조회할 대상을 지정
  • 조회 대상:
    • 엔티티
    • 임베디드 타입
    • 스칼라 타입 (숫자, 문자열 등 기본 타입)

페이징 API

  • setFirstResult(int startPosition)
    → 0부터 시작하는 조회 시작 위치 설정

  • setMaxResults(int maxResult)
    → 조회할 최대 개수 설정


사용자 정의 함수 호출

  • Hibernate 사용 시, 방언(dialect)에 해당 함수 등록 필요

경로 표현식

  • 연관 관계를 탐색할 때 사용
  • 묵시적 조인 발생에 주의 (성능 저하 유발 가능)
This post is licensed under CC BY 4.0 by the author.