/ SPRING BOOT, JPA, QUERYDSL

QueryDSL 적용해보기 (이클립스+Maven)

스프링 목록

스프링 부트 목록

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 등록
  1. 프로젝트 우클릭 -> Properties -> Java Build Path

  2. 탭(Source) 클릭 -> Add Folder.. 클릭
  3. 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가 없다면 직접 만든걸로 테스트