SPRING-JPA 에서 QueryDSL사용을 위한 단계
- Entity QDomain 메타 지원을 위한 pom.xml 수정
- 기존 Repository 인터페이스에서, QueryDslPredicateExecutor 추가 상속받음
- Builder 클래스를 통해 각종 검색옵션 조합하여 , 기존 쿼리메스드(findall()) 에 인자값으로 전달가능
Spring-Boot-Starter 에서 QueryDSL 사용을 위한 pom.xml 수정
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> ..................... <dependencies> ..................... <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-core</artifactId> <version>4.1.3</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>4.1.3</version> </dependency> ..................... </dependencies> ..................... <build> <plugins> <!-- MUST add to use generate QueryDSL --> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>1.1.3</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>process</goal> </goals> <configuration> <!-- Specifies the directory in which the query types are generated --> <outputDirectory>target/generated-sources/querydsl</outputDirectory> <!-- States that the APT code generator should look for JPA annotations --> <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>4.1.3</version> </dependency> </dependencies> </plugin> </plugins> </build> .....................
QueryDSL지원을 위한 Repository 정의
Table Entity정의는 기존과 동일합니다. 차이점이 있다면, pom.xml에서 QueryDSL지원을 위한 메타빌드로 설정했기때문에
Address라고 정의한 Entity가 QueryDSL에서는 QAddress 라는 도메인 객체를 자동 생성합니다.
package com.example.demo.data; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.querydsl.QueryDslPredicateExecutor; public interface AddressRepoDSL extends JpaRepository<Address, Long>, QueryDslPredicateExecutor<Address>{ }
QueryDSL을 활용하여 쿼리빌드하기
@Autowired private AddressRepoDSL addressRepoDSL; public void jpa_queryDslTest() { QAddress userAddress = QAddress.address1; BooleanBuilder builder = new BooleanBuilder(); builder.and(userAddress.name.eq("민수1") ) .and(userAddress.address.like("%" + "서" +"%")); Iterable<Address> addressList = addressRepoDSL.findAll(builder); addressList.forEach( item -> { String itemString = String.format("%d%s %s %s %s %s",item.getId(),item.getName(), item.getPhoneNbr(), item.getSex(),item.getAddress(),item.getAge()); System.out.println(itemString); }); }
builder.and(userAddress.name.eq("민수1") ); builder.and(userAddress.address.like("%" + "서" +"%"));
QueryDSL 의 핵심이 되는 검색조건을 만드는 방법입니다. TypeSafe하게 검색 조건을
유연하게 복합할수가 있습니다. 이것은 복합적인 검색인자값이 null 혹은 Optional 등을 포함하였을때
중첩 if문등을 억제할수가 있습니다.
예를들면, 기존 SQL개발 방식에서는 이름이 있냐? 없냐에 따라 SQL문이 분기처리가 되었고 두가지 구문을
관리하였을것입니다. 조건식이 복잡해질시.. 중첩 if문 처리가 더욱더 어려워지고 sql문은 typesafe하지 않기때문에
어떠한 케이스에서는 sql문 syntax 에러를 유발 하였습니다.
- Select * from address where name='민수1'
- Select * from address
QueryDSL에서는 단지 필요한 조건만 동적으로 추가하기때문에 제어가 복잡해 지더라도
가독성이 좋으며, TypeSafe하다란 말은 허용되지 않는 SQL문 수행을 빌드단계에서 걸러낼수가 있는 장점이 있습니다.