QueryDSL을 이용한 동적 쿼리 하기 전 설정하는법

Yeeun·2025년 4월 24일
0

SpringBoot

목록 보기
18/46

쿼리어노테이션, 메소드는 쿼리문의 고정이라는 단점이 있으니 런타임에 쿼리문을 만드는 동적쿼리 방식이 있음 하나의 방법은 MYBatis(쿼리스트링 메소드명을 붙이듯 아이디에 이름을 붙이고 , 매서?라는 기능이 매핑을해줌. xml형태로 쿼리문을 빼놓고 id를 호출하는 시점에 파라미터로 들어오는 데이터를 보고 서치컨디션에 따라 분기가 되는 쿼리문, 실행시점에서 컨디션에 따라 쿼리문을 바꿀수있음. 다만 조건 스무개가 넘고 그러면 복잡해지기에 or 잘 안넣고 and만넣음 xml 만들고 맵퍼클래스 하나 만들면됨.) query DSL(jpql빌더 로 작성. 보안이슈때문에 안됏는데 "io.github.openfeign.querydsl 얘는됨.) pom.xml에 디펜더시와 빌드 안에 기존에 롬복들어있는거 밑에 패스 하나 추가. , 예전엔 그냥 디펜던시 두개만 넣으면됐으나 이건 다름 . QueryDSL 설정을 마친 뒤, [Maven]-[Update Project…] 를 실행 프로젝트 우클릭해서 해도 되고 alt+f5해도 되고.

유일하게 되는 ..DSL

메이븐업데이트

target/generated-sources/annotations에 Q-class가 자동 생성되면
성공


📌 고정 쿼리의 한계와 동적 쿼리의 필요성

✅ 1. @Query, 메소드 쿼리 방식

Spring Data JPA는 @Query메소드 이름을 기반으로 자동 쿼리 생성하는 방식을 지원합니다.

  • 예: findByTitleContaining(String title) → 자동으로 title LIKE 검색 쿼리 생성
  • 장점: 매우 간단하고 코드 양이 적음
  • 단점:
    • 조건이 고정됨 → 복잡한 조건을 조합할 수 없음
    • if/else 로 조건 분기 불가
    • 동적인 WHERE 절 작성 불가능

🧩 2. 동적 쿼리 방법 두 가지

✅ MyBatis 기반 방식

  • XML에 SQL을 명시하고, 조건에 따라 <if>, <choose> 등의 태그로 동적 쿼리를 구성
  • Mapper 인터페이스 + XML 매퍼 파일 필요
  • SQL이 명확히 보여 가독성이 좋음
<select id="searchBoard" resultType="Board">
  SELECT * FROM board
  <where>
    <if test="title != null">
      title LIKE CONCAT('%', #{title}, '%')
    </if>
    <if test="writer != null">
      AND writer = #{writer}
    </if>
  </where>
</select>
  • 실행 시점에서 조건을 체크하여 실제 SQL을 동적으로 생성
  • 복잡한 조건 분기는 가능하지만, 조건이 20개 이상이 되면 XML이 복잡해지고 관리가 어려워짐
  • 실무에서는 보통 AND 위주로 쓰고, OR 조건은 가급적 피함

✅ QueryDSL (JPA 기반의 동적 쿼리 빌더)

  • JPQL을 코드로 빌드할 수 있도록 도와주는 자바 코드 기반의 SQL 빌더
  • 타입 안전성(Type-Safe) → 컴파일 타임에 오류를 잡을 수 있음
  • 런타임이 아닌 코드 작성 시점에서 쿼리 검증이 가능
QBoard qBoard = QBoard.board;

BooleanBuilder builder = new BooleanBuilder();
if (searchKeyword != null) {
    builder.and(qBoard.title.contains(searchKeyword));
}
if (writer != null) {
    builder.and(qBoard.writer.eq(writer));
}

List<Board> result = jpaQueryFactory.selectFrom(qBoard)
                                     .where(builder)
                                     .fetch();

QueryDSL 설정 시 주의 사항

  1. 의존성 추가 (pom.xml)
    QueryDSL의 경우, 단순한 의존성만 넣는 것이 아니라 Q클래스 생성을 위한 설정이 필요합니다.

    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>5.0.0</version> <!-- 버전 확인 필요 -->
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>5.0.0</version>
        <scope>provided</scope>
    </dependency>
  2. build > plugins 설정 (롬복 밑에 추가)

    <plugin>
        <groupId>com.mysema.maven</groupId>
        <artifactId>apt-maven-plugin</artifactId>
        <version>1.1.3</version>
        <executions>
            <execution>
                <goals>
                    <goal>process</goal>
                </goals>
                <configuration>
                    <outputDirectory>target/generated-sources/java</outputDirectory>
                    <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                </configuration>
            </execution>
        </executions>
    </plugin>
  3. Q클래스 생성 (Alt+F5 또는 Maven > Update Project)
    Q파일은 Board 엔티티를 기준으로 QBoard라는 이름으로 생성됩니다.


✨ 정리

방식동적 쿼리 지원장점단점
메소드 쿼리간단, 빠른 개발조건 고정
@Query직접 JPQL 작성 가능조건 고정, 복잡도 증가
MyBatis동적 조건 분기, SQL 직접 사용XML 복잡도, 타입 안전성 낮음
QueryDSL타입 안전, 유지보수 용이설정 복잡, 러닝커브 있음

0개의 댓글