본문 바로가기
IT 이야기/CRUD

[Spring] QueryDsl 적용

by Dblog 2021. 4. 21.
728x90

JPA를 사용하면서 생각보다 query를 직접 작성해서 사용하는 경우가 많았습니다.

보통 JPA Repository에서 @Query를 활용해서 직접 쿼리를 작성하는데 아래 예시와 비슷하게 작성합니다.

public interface TesetRepo extends JpaRepository<Test, Long> {

  @Query("from Test where  test= :test")
  List<Flight> findFlights (@Param("test") String testString, );

}

 

지금까지는 @Query로 잘 사용하고 있었습니다. 그런데 잘 생각해보니 이럴거면 mybatis를 쓰는게 더 나은거 아닌가... 라는 생각과 함께 코드로 작성할 수 있는 방법이 없나 찾아보게 되었습니다.

찾아보니 querydsl이라는 방법이 있었고 적용하다보니 생각보다 잘 안되는 부분이 있어서 제가 나중에 참고하려고 글을 씁니다


 

dependency와 plugin을 설치하기위해 사전 준비를 하고 maven을 컴파일 합니다.

pom.xml
<groupId>com.example.root</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<querydsl.version>4.0.8</querydsl.version>
</properties>

....

   <!--   spring query dsl     -->
<dependency>
	<groupId>com.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
	<groupId>com.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
</dependency>

...


</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>
</plugins>

 

 

컴파일을 하고나면 target폴더에 Q... ,Q... 와 같은 앞에 Q가 붙은 class가 생기는데 이 class들은 @Entity Annotation이 선언된 class에서 가져온 class 입니다. 

 

사진 처럼 @Entity가 선언된 class의 이름을 따서 Q{ClassName}.java 파일을 만들게 됩니다.

 

그럼 그 java파일은 아래 사진처럼 생성됩니다. 이 class가 데이터베이스에서 데이터를 조회하는 query를 java 코드로 작성할 수 있게도와주는 class 입니다. 내부에 선언되있는 내용들은 아직 더 공부해봐야 알것같습니다..

 

이제 본격적으로 사용하기 위해서 service를 하나 등록하고 readonly로 transaction class를 하나 선언합니다.

Q class와 JPQLQuery 인스턴스를 선언하고 query를 작성하는데 형태는 sql과 비슷합니다. 분명 @Query를 사용할 때랑 비슷할 수 는 있지만 java 코드로 작성할때 얻을수 있는 장점들이 몇개가 있어서 저는 이 방식이 더 좋은것 같습니다.

예를 들면 runtime 이전에 syntax에러를 먼저 확인할 수 있고 디버깅도 더 쉽지 않을까요.??

query.fetch()를 사용하면 list 결과를 얻어낼 수 있습니다.

 

 

728x90

'IT 이야기 > CRUD' 카테고리의 다른 글

[Spring] Thymeleaf template적용  (0) 2021.05.16
[Springboot] JPA적용  (0) 2021.05.02
[Spring CRUD] update,  (0) 2021.04.04
[Spring CRUD] read,  (0) 2021.03.24
[Spring CRUD] create,  (0) 2020.12.27

댓글