본문 바로가기
personal project/pcmoa

querydsl을 사용해서 조인

by choi-dev 2024. 3. 7.

querydsl 의존성을 알게된 건 이전 회사에서 사용했었기에 알고 있었다. JPA만을 가지고 쿼리를 조회하는 것은 쉽지 않기에 쿼리 질의문에 많은 복잡성이 생긴다면 한계가 분명 있다. querydsl 말고도 jpql 등 여러 방식이 많지만 나는 querydsl을 사용하기로 했다.

 

https://choidevvv.tistory.com/49

 

1:N 관계를 매핑해주기

관리자 페이지에서 상품 저장 로직을 구성하는 도중에 상품 - 상품 이미지에 대한 연관 관계를 나는 1:N으로 하였다. 말로 풀어서 정리하자면 상품을 저장하는데 해당 상품에 대한 이미지는 N개

choidevvv.tistory.com

바로 전 게시물에서 상품 - 상품 이미지 테이블을 1:N 관계로 OneToMany 연관관계를 형성했다. 이제 내가 원하는 것은 메인 페이지에 상품 리스트들이 보이는데 상품과 상품 이미지 테이블을 조인한 상태로 객체를 클라이언트 단에 넘겨주어야 한다. 기존에는 JPA를 사용해 findAll을 하고 몇 조건을 where절을 통해 추가했다. 이 코드는 이제 삭제하고 querydsl을 활용해서 넘겨주자.

 

// querydsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

def querydslDir = "$buildDir/generated/querydsl"

querydsl {
	jpa = true
	querydslSourcesDir = querydslDir
}
sourceSets {
	main.java.srcDir querydslDir
}
compileQuerydsl{
	options.annotationProcessorPath = configurations.querydsl
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
	querydsl.extendsFrom compileClasspath
}

gradle 의존성에 다음과 같이 추가한다.

 

complieJava 또는 comileQuerydsl을 실행시켜보자.

 

만약 Q클래스 중복이 생긴다하는 이슈로 인한 에러가 발생한다면 위의 이미지의 clean shell을 실행시키거나 ./gradlew clean build 명령을 실행시킨다.

 

@Repository
@RequiredArgsConstructor
public class DslProductRepository {

    private final JPAQueryFactory jpaQueryFactory;

    public List<Products> findAllProductsWithImages() {
        return jpaQueryFactory
                .selectFrom(products)
                .innerJoin(productImages).on(products.id.eq(productImages.products.id))
                .where(products.productStatus.eq(ProductStatus.SELL)
                        .and(products.stock.ne(BigDecimal.ZERO)))
                .fetchJoin()
                .fetch();
    }
}

이제 질의문을 만들어보자. 위와 같이 입력하고 현재는 상품의 모든 컬럼과 상품 이미지 테이블의 모든 컬럼을 불러오도록 하기 위해 selectFrom을 사용했다. 여기에는 기록해두진 않겠지만 부분으로 가져올 땐 가져올 엔티티 클래스에서 생성자 부분에 @QueryProjection을 사용하고 selectFrom 대신 select를 사용하여 new 해당 엔티티 Q클래스를 하면 된다. 참고로 생성자 부분에서 초기화할 때 사용할 클래스의 멤버변수만 가져와서 생성자를 만들어주면 된다.

 

 

그리고 똑같이 view 쪽으로 리턴해주면 값을 보내줄 수 있다. 

 

나중에 배포할 때

아마 내 생각에 로컬에서는 잘 굴러간다고 볼 수 있겠지만 클라우드에 배포하는 과정에서는 Q클래스 생성 중복때문에 오류가 발생할 수도 있다. 아마 CI/CD 파이프 라인에서 Q클래스 엔티티가 생성되는 위치인 genereated 디렉토리를 clean 시켜주는 gradle 명령어를 넣어주어야 할 것 같다. 이는 차후에 배포 시 만났을 때 다시 정리하도록 한다.

'personal project > pcmoa' 카테고리의 다른 글

1:N 관계를 매핑해주기  (0) 2024.03.07
PCMOA - 로그인  (0) 2024.03.03
PCMOA - 회원가입  (0) 2024.03.03
PCMOA 초안  (0) 2024.02.29
AWS 인스턴스에 연결  (0) 2024.02.28