QueryDSL 적용해보기 (이클립스+Maven)
스프링 목록
- Spring(1) - 백엔드 초기설정
- Spring(2) -스프링 Client 파일 업로드(1)
- Spring(3) -스프링 Client 파일 업로드(2)
- Spring(4) - 백엔드 RESTFULL 로 바꾸기
- Spring(5) - 게시판 페이징 기능 추가하기
- Spring(6) - 검색 기능 추가
- Spring(7) - 프론트 ContextPath 동적 설정
스프링 부트 목록
- Spring Boot(1) - 스프링 부트 초기설정
- Spring Boot(2) - JPA 사용해 보기
- Spring Boot(3) - JPA 방향설정, 관계설정
- Spring Boot(4) - JPA 심화
- Spring Boot(5) - JPA 일대일 실습
QueryDSL 쓰는 이유
- SQL, JPQL의 문제 : 문자이기 때문에
실행 시점
이 되야 문제 발견 가능
- 반면 쿼리DSL은
컴파일
시점에서오류 검출
가능
추가로, IDE가 해당 로직에오류,오타
가 있는지 알려줌
따라서, 쿼리의 문법의 오타로 스트레스 받지 않고 쾌적한 개발환경에서 개발 가능
참고 : [T아카데미-JPA 프로그래밍] 18분 부분
이클립스 + Maven 사용 이유
팀 프로젝트됨 이미 Maven으로 만들었었고, intelliJ는 유료이기 때문에..
gradle
예제와intelliJ
예제는 참고 할게 많이 있지만,
maven과 eclipse 를 사용한 예제는 생각보다 적었기 때문에 글로 남겨둠
1. pom.xml 수정
A. <dependencies></dependencies> 에 해당 내용 추가
${querydsl.version} 사용시 자동으로 버전 맞춰줌
<!-- 쿼리dsl -->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
B. <plugins></plugins> 에 해당 내용 추가
<plugins>는 <build> 태그 속에 있음
<!-- 쿼리dsl 플러그인 -->
<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>
- <outputDirectory>는 Q파일들(쿼리DSL에서 사용)이 저장되는 장소
- JPA 엔터티들을 Q파일로 바꿔주는 거기 때문에 미리 준비되어 있어야함
C. Maven Install 하기
프로젝트 우클릭 -> Run as.. -> Maven install 클릭
제대로 진행되면 실제 폴더 생성+ QClass 생성 됨
나중에 QClass에 문제 생기면 위 행동 다시 반복
D. Q Class 폴더 BuildPath 등록
- 프로젝트 우클릭 -> Properties -> Java Build Path
- 탭(Source) 클릭 -> Add Folder.. 클릭
- target/generated-sources/
java
에서 java 폴더 만체크
->apply
2. 테스트 코드
@Autowired로 EntityManager 주입받아야함
@SpringBootTest
public class ProjectTest {
@Autowired
EntityManager em;
//쿼리DSL에서 사용하는 Q클래스
//<outputDirectory>경로에 실제 Q클래스들 있음
QCategory c = QCategory.category;
@Test
public void queryDSLTest(){
JPAQueryFactory query = new JPAQueryFactory(em);
//1.번
//query.slect(c)
// .from(c)
// .where(c.categoryNo.gt(5))
// .fetch();
//2.번 (둘다 테스트 )
query.selectFrom(c)
//cate(2) 사용시 다른 조건
.where(cate(1))
.fetch();
}
//동적 쿼리 사용시
//BooleanExpression사용해서 가독성 높이기
public BooleanExpression cate(int a) {
if (a==1) {
return c.categoryNo.gt(5);
}else if(a==2) {
return c.categoryNo.gt(10);
}
return null;
}
참고 : [우아콘2020 QUERYDSL 사용하기] 3분 부분
Test 코드 제대로 작동되는지 확인
- 해당 category Entity가 없다면 직접 만든걸로 테스트