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 결과를 얻어낼 수 있습니다.
'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 |
댓글