코딩기록 저장소 🐕/스스로 프로젝트와 연습

Query Dsl 적용해보기①🥲

kimkongmom 2024. 5. 31. 15:53

 

 

 

QueryDsl을 스스로 공부하려다보니 적용하는데 쉽지않았습니다😭

 

 

 

 

⭐Build.gradle

구글링을 많이 해봤지만 계속적인 오류가 났습니다.

layout.buildDirectory.dir("generated/querydsl").get().asFile

이부분을 def querydslDir = "$buildDir/generated/querydsl" 

이렇게 많이 사용하셨지만 저는 오류가 나서 아래처럼 바꾸니 정상적으로 실행이됐습니다!

Gradle 5.0 이후, Gradle은 빌드 디렉토리와 관련된 파일 경로를 처리하는 방식이 변경되었다고합니다. 

 

plugins {
    id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}
configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
	querydsl {
		extendsFrom compileClasspath
	}
}
dependencies {
        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"
	annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
}
def querydslDir = layout.buildDirectory.dir("generated/querydsl").get().asFile

querydsl {
	jpa = true
	querydslSourcesDir = querydslDir
}

sourceSets {
	main {
		java {
			srcDirs += querydslDir
		}
	}
}
tasks.named('compileQuerydsl', JavaCompile) {
	options.annotationProcessorPath = configurations.querydsl
}

 

 

 

설정을 하고 코끼리새로고침을 한번해줍니다. 그후 오른쪽 코끼리를 누르고 other -> compileQuerydsl을 누르면

콘솔창에 BUILD SUCCESSFUL이라고 나옵니다!

 

 

아까 gradle에서 지정해놓은 파일경로로 QClass가 만들어져있습니다!

 

QMember 생긴것을 확인!

 

 

만들어져있을때 compileQuerydsl을 또 실행하면 

 

Attempt to recreate a file for type start.jpa.entity.QMember 오류가 뜹니다.

이미 만들어져있기때문에 중복이 된다는것입니다. 다시 실행을 하려면 

build에서 clean을 누르면 지워져서 다시 생성가능합니다!  

 

 

이제 한번 조회쿼리로 querydsl을 사용해서 해보려고합니다.

 

우선

 

⭐ ① QuerydslConfig 파일 설정하기

 

@PersistenceContext
EntityManager 를 빈으로 주입할 때 사용하는 어노테이션
빈으로 주입받을 때 EntityManager 의 경우 @Autowired 가 아니라 해당 어노테이션으로 주입
JPAQueryFactory 를 Bean 으로 등록해서 프로젝트 전역에서 사용할 수 있도록 합니다.

@Configuration
@EnableJpaRepositories("start.jpa.repository")
public class JpaQueryDslConfig {

  @PersistenceContext
  private EntityManager entityManager;

  @Bean
  public JPAQueryFactory jpaQueryFactory() {
    return new JPAQueryFactory(entityManager);
  }
}

 

 

② QueryDSL 사용 Repository 구조 잡기

 

 

1. Spring Data JPA Custom Repository 사용

Spring 에서 QueryDSL 과 JPARepository 를 함께 사용하려면 각 역할 별 파일을 두 개 만들어주거나, 하나의 파일이 두 개의 의존성을 가져야 합니다. 이러한 경우 Spring Data JPA 에서 제공하는 ✨Spring Data Custom Repository✨ 를 사용하면 됩니다.

해당 방식을 통해서 CustomRepository 를 JpaRepository 상속 클래스에서 함께 상속 받아서 사용할 수 있습니다.

 

JpaRepository 와 Custom interface 를 상속한 파일
사용자는 해당 파일을 DI 받아서 사용한다

package start.jpa.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import start.jpa.entity.Item;

public interface ItemRepository1 extends JpaRepository<Item, Long>, ItemCustomerRepository {
}

 

 

그러기 위해서 2개의 File이 더 필요합니다.

 

ItemCustomerRepository(interface)

public interface ItemCustomerRepository {
}

 

 

ItemRepositoryImpl

 

근데, RepositoryImpl은 Repository를 직접적으로 구현하지 않는데 어떻게 Repository에서 사용가능할까요 ?
:💡 사용자 정의 구현 클래스인 경우 JPA 가 파일명이 repository interface 이름 + Impl 인 클래스를 찾아서 interface 에 JpaRepository를 Injection 할 때에 Impl 객체를 삽입해주기 때문에 사용할 수 있습니다.
→ 그렇기 때문에 반드시 구현체 파일명이 interface 명 + impl 이여야 합니다.

public class ItemRepositoryImpl implements ItemCustomerRepository {
}