[스프링부트JPA] 쇼핑몰 Querydsl

JEONG SUJIN·2023년 1월 24일
0

Spring Data JPA Querydsl

Querydsl은 JPQL을 코드로 작성할 수 있도록 도와주는 빌더 API이다.
소스코드로 SQL문을 문자열이 아닌 코드로 작성하기 때문에 컵파일러의 도움을 받을 수 있다.
소스 작성시 오타가 발생하면 오타가 있음을 알려준다.

@Querydsl 장점

  • 고정된 SQL문이 아닌 조건에 맞게 동적으로 쿼리를 생성
  • 비슷한 쿼리를 재사용할 수 있으며 제약조건 조립 및 가독성을 향상
  • 문자열이 아닌 자바 소스코드로 작성하기 때문에 컴파일 시점에 오류를 발견 할 수 있다.
  • IDE의 도움을 받아서 자동 완성 기능을 이용할 수 있기 때문에 생산성을 향상시킬 수 있다.

Querydsl 사용하기 위해 필요한 설정을 추가해줘야 한다.
pom.xml에 Qdomain이라는 자바코드를 생성하는 플러그인 추. 엔티티 기반으로 접두사(prefix)로 'Q'가 붙는 클래스들을 자동으로 생성해주는 플러그인

예를 들어 Item테이블의 경우 QItem.java 클래스가 자동으로 생성된다.

pom.xml

<!-- Querydsl의존성 주입 -->
		<dependency>
			<groupId>com.querydsl</groupId>
			<artifactId>querydsl-jpa</artifactId>
		</dependency>

		<dependency>
			<groupId>com.querydsl</groupId>
			<artifactId>querydsl-apt</artifactId>
		</dependency>


       <!--생략...-->
       
          <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>
            

필요한 설정을 추가 한 뒤, 메이븐 빌더로 들어가서 compile 입력해주고, run 클릭 후

target 디렉토리 안에 QItem.java 파일생성된걸 확인할 수 있다.

Querydsl을 사용하기 기본적인 셋팅은 끝!

ItemRepository.java

QuerydslPredicateExecutor 인터페이스 상속을 추가한다.

public interface ItemRepository extends JpaRepository<Item, Long>,
QuerydslPredicateExecutor<Item>{

 }

ItemRepositoryTest.java


//영속성 컨텍스트를 사용하기 위해 어노테이션을 이용해 EntityManager 빈을 주입
@PersistenceContext
EntityManager em;
  
 @Test
    @DisplayName("Querydsl 조회테스트 1")
    public void queryDlsTest() {
    	this.createItemList();
        //JPAQueryFactory를 이용하여 쿼리를 동적으로 생성  	
        JPAQueryFactory queryFactory = new JPAQueryFactory(em);
        //Querydsl을 통해 쿼리를 생성하기 위해 플러그인을 통해 자동으로 생성된 QItem 객체를 이용
        QItem qItem = QItem.item;
        //자바 소스코드지만 SQL문과 비슷하게 소스를 작성할 수 있다.  	
        JPAQuery<Item> query = queryFactory.selectFrom(qItem)
    			.where(qItem.itemStatus.eq(ItemStatus.SELL))
    			.where(qItem.itemDetail.like("%" + "테스트 상품 상세 설명" + "%"))
    			.orderBy(qItem.price.desc());
    	
    	List<Item> itemList = query.fetch();
    	for(Item item : itemList) {
    		System.out.println(item.toString());
    	}
    }

JPAQuery 데이터 반환 메서드

메서드기능
List fetch()조회 결과 리스트 반환
T fetchOne조회 대상이 1건인 경우 제네릭으로 지정한 타입 반환
T fetchFirst조회 대상 중 1건만 반환
Long fetchCount()조회 대상 개수 반환
QueryResult fetchResult()조회한 리스트와 전체 개수를 포함한 QueryResults 반환

실행된 쿼리문을 확인해보면 JPAQuery에 추가한 판매상태 코드와 상품 상세 설명이 where 조건에 추가되어 있고, 상품의 가격이 내림차순으로 정렬돼 데이터를 조회되는 쿼리문이 나와있는걸 볼 수 있다.

profile
기록하기

0개의 댓글