TIL - 20250731

juni·2025년 7월 31일

TIL

목록 보기
80/317

0731 QueryDSL 기준 데이터 조회 모델 학습, SQL 계층형 질의


◼ QueryDSL 구성 기능

  • JPAQueryFactory는 QueryDSL의 해석과 구성의 해당 것으로, 다양한 SQL 조회를 Java 패턴으로 구성가능
  • EntityManager를 가지고 QueryDSL에서 실수할 수 있는 것과 같이 Bean으로 등록

◼ Entity 설정

Idol Entity

  • @ManyToOne을 통해 Group과 가장 관련
  • 구도가 약해서 Lazy 방식의 Fetch 설정 사용

Group Entity

  • @OneToMany를 통해 Idol 목록을 가지고 있음
  • orphanRemoval 또한 값 사용 및 유지에 대한 포함 사각 가능
  • addIdol, removeIdol 같은 편의 메서드 제공

◼ 조회 방법

1. JPQL 사용

String jpql = "SELECT i FROM Idol i WHERE i.idolName = ?1";
  • EntityManager가 JPQL 정의에 따라 조회 수행

2. Native SQL

String sql = "SELECT * FROM tbl_idol WHERE idol_name = ?1";
  • SQL을 구조하고 EntityManager가 직접 DB에서 조회

3. JDBC Template

String sql = "SELECT * FROM tbl_idol WHERE idol_name = ?";
  • Spring의 JDBC 조회 기능 사용

4. QueryDSL

factory.selectFrom(idol)
       .where(idol.idolName.eq("사쿠라"))
       .fetchOne();
  • selectFrom, where, fetchOne() 를 통해 할일적으로 조회 구성

◼ 다양한 QueryDSL 조회 예제

AND 객체

idol.idolName.eq("리즈").and(idol.age.eq(20))

BETWEEN / IN / NOT IN / LIKE / CONTAINS / STARTSWITH / ENDSWITH

  • idol.age.between(10,30)
  • idol.age.in(10, 20)
  • idol.idolName.contains("김")

조회 결과 반환

  • fetch(): 모든 결과 (단일/다중)
  • fetchOne(): 단일 결과
  • fetchFirst(): 첫 번째 결과

Optional 사용

Optional<Idol> fetchOne = Optional.ofNullable(
    factory.selectFrom(idol)
           .where(idol.idolName.eq("김체원"))
           .fetchOne()
);

◼ 다양한 검색 방식 실기 테스트

  • 그룹과 개인의 관계성 조회 (Join)
  • 개인의 나이, 이름 등에 따른 조회
  • 조건 발생시 지역을 많이 활용 (도시, 전공에 따른 검색)
  • 거래를 통한 페이직, 정렬을 통한 조회 가능

◼ 계층 패턴 조회 (START WITH / CONNECT BY)

  • 계층 패턴 조회는 계층 구조를 가진 데이터를 SQL에서 재귀적으로 조회할 때 사용하는 Oracle DB의 구문이다.
  • 조직도, 댓글, 카테고리 트리와 같이 부모-자식 관계를 갖는 데이터 조회에 유용하다.

🔹 START WITH

  • 트리 구조의 최상위 부모(루트) 노드를 정의할 때 사용
  • 예시: START WITH id = 1 → id가 1인 노드부터 시작

🔹 CONNECT BY

  • 부모 자식 간의 관계를 정의
  • 예시: CONNECT BY PRIOR id = parent_id → 현재 행의 parent_id가 이전 행의 id와 같을 때 연결됨

🔹 예시 쿼리

SELECT id, name, parent_id
FROM category
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id;

🔹 결과

  • parent_id가 NULL인 루트부터 시작해
  • 자식 노드를 재귀적으로 연결하며 조회함

👉 해당 방식은 Oracle에서 주로 사용되고, 다른 DB에서는 CTE(Common Table Expression)를 활용해 유사한 계층 조회 구현 가능


✅ 요약 정리

  • QueryDSL은 JPQL을 Java 문법으로 표현하는 방식으로 타입 안정성, 가독성 향상
  • Entity 간의 연관관계를 통한 Join 조회, where 조건 구문 활용 가능
  • fetch 메서드들로 다양한 조회 결과 반환 가능 (리스트, 단일값, Optional 등)
  • 계층형 쿼리로 조직도/댓글과 같은 구조적 데이터도 표현 가능

0개의 댓글