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

메이븐업데이트

target/generated-sources/annotations에 Q-class가 자동 생성되면
성공
Spring Data JPA는 @Query나 메소드 이름을 기반으로 자동 쿼리 생성하는 방식을 지원합니다.
findByTitleContaining(String title) → 자동으로 title LIKE 검색 쿼리 생성<if>, <choose> 등의 태그로 동적 쿼리를 구성<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>
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();
의존성 추가 (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>
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>
Q클래스 생성 (Alt+F5 또는 Maven > Update Project)
Q파일은 Board 엔티티를 기준으로 QBoard라는 이름으로 생성됩니다.
| 방식 | 동적 쿼리 지원 | 장점 | 단점 |
|---|---|---|---|
| 메소드 쿼리 | ❌ | 간단, 빠른 개발 | 조건 고정 |
| @Query | ❌ | 직접 JPQL 작성 가능 | 조건 고정, 복잡도 증가 |
| MyBatis | ✅ | 동적 조건 분기, SQL 직접 사용 | XML 복잡도, 타입 안전성 낮음 |
| QueryDSL | ✅ | 타입 안전, 유지보수 용이 | 설정 복잡, 러닝커브 있음 |