• 티스토리 홈
  • 프로필사진
    ZaMan
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
ZaMan
  • 프로필사진
    ZaMan
    • 분류 전체보기 (11)
      • BackEnd (3)
        • DataBase (2)
        • Spring (1)
        • Kotlin (1)
      • Web (2)
      • 회고 (1)
      • 코테 (1)
      • 기타 (0)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [BackEnd] QueryDSL
        2025년 07월 21일
        • ZaMan
        • 작성자
        • 2025.07.21.:52

        JPQL이란?

        JPQL(Java Persistence Query Language)는 테이블을 대상으로 쿼리하는 것이 아닌 엔티티 객체를 대상으로 쿼리합니다.

        SQL과 비슷한 문법을 가지며 JPQL은 결국 SQL로 변환됩니다.

         

        JPA에서 제공하는 CRUD와 같은 메서드 호출만으로 섬세한 쿼리 작성이 어려운 이유로 나오게 되었습니다.

        JPQL 특징

        - 테이블이 아닌 객체를 검색하는 객체지향 쿼리

        - JPA는 JPQL을 분석하여 SQL을 생성한 뒤 DB에서 조회

        기본 문법

        - 전체 회원 조회
        > SELECT m FROM Member m
        - 조건 조회
        > SELECT m FROM Member m WHERE m.age > 17
        - 이름만 조회
        > SELECT m.name FROM Member m

        String jpql = "SELECT m FROM Member m WHERE m.name = :name";
        List<Member> members = em.createQuery(jpql, Member.class)
                                 .setParameter("name", "배재")
                                 .getResultList();

        SQL과 다른 점

        1. 대소문자 구분

        엔티티와 속성은 대소문자를 구분한다.

        엔티티 이름인 Member, 그리고 Member의 속성 name은 대소문자를 구분해줘야 한다.

        반면에 SELECT, FROM, AS 같은 JPQL 키워드는 대소문자를 구분하지 않아도 된다.

         

        2. 엔티티 이름

        JPQL에서 사용한 Member는 클래스 이름이 아닌 엔티티 이름이다. 엔티티 이름은 @Entity(name="task")로 설정 가능하다.

        name 속성을 생략하면 기본 값으로 클래스 이름을 사용한다.

         

        3. 별칭

        JPQL에서 엔티티의 별칭은 필수적으로 명시해야 한다.

        별칭을 명시하는 AS 키워드는 생략할 수 있다.

        QueryDSL이란?

        Spring Data JPA가 기본적으로 제공해주는 CRUD 메서드 및 쿼리 메서드 기능을 사용하더라도, 원하는 조건의 데이터를 수집하기 위해서는 필연적으로 JPQL을 작성하게 됩니다.

         

        간단한 로직을 작성하는데 큰 문제는 없으나, 복잡한 로직의 경우 쿼리 문자열이 상당히 길어집니다.

        JPQL 문자열에 오타 혹은 문법적인 오류가 존재하는 경우, 만약 정적 쿼리라면 어플리케이션 로딩 시점에 이를 발견할 수 있으나 그 외는 런타임 시점에서 에러가 발생합니다.

         

        이러한 문제를 어느 정도 해소하는데 기여하는 프레임워크가 바로 QueryDSL입니다. QueryDSL은 JPQL을 자바 코드로 안전하게 작성할 수 있게 해주는 라이브러리입니다.

        String jpql = "SELECT m FROM Member m WHERE m.age > 20";
        List<Member> members = em.createQuery(jpql, Member.class).getResultList();
        QMember m = QMember.member;
        
        List<Member> members = queryFactory
            .selectFrom(m)
            .where(m.age.gt(17)) // age가 없거나 타입이 다르면 컴파일 오류 발생
            .fetch();

         

        • IDE 자동 완성 됨
        • 안전하고 가독성도 좋아요

         

         

        'BackEnd' 카테고리의 다른 글

        [BackEnd] FetchType & N+1 문제  (1) 2025.08.06
        [BackEnd] 예외 처리  (0) 2025.07.15
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바