You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

SPRING-JPA에서 QueryDSL을 사용하기위해 몇가지 준비작업이 있으며

SPRING BOOT STARTER 1.5 버젼을 기준으로 작동되는 방식으로 정리하였습니다.


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지원을 위한 메타빌드로 설정했기때문에

JPA에서 Address라고 정의한 Entity가 QueryDSL에서는 QAddress 라는 도메인 객체를 자동 생성합니다. ( target/generated-sources/querydsl )

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문등을 억제할수가 있습니다.  

조건식이 복잡해질시.. 중첩 if문 처리가 더욱더 어려워지고  sql문은 typesafe하지 않기때문에

어떠한 케이스에서는 sql문 syntax 에러를 유발 하였습니다.


검색 SQL문을 생성할때, 검색조건이 없는경우(null) 다양한 SQL문을 CaseBy로 복합적으로 만들어야 했습니다.

  • Select * from address where name='민수1'
  • Select * from address
  • Select * from address where name='민수1' and addres like '%서%'


QueryDSL에서는 단지 필요한 조건만 동적으로 추가하기때문에 제어가 복잡해 지더라도

가독성및 사용성(인자값전달)이 편리해집니다.

TypeSafe하다란 말은 허용되지 않는 SQL문 수행을 빌드단계에서 걸러낼수가 있는 장점이 있습니다.





  • No labels