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 {
}
'코딩기록 저장소 🐕 > 스스로 프로젝트와 연습' 카테고리의 다른 글
Query Dsl 적용해보기② (0) | 2024.06.03 |
---|---|
프로젝트(SpringBoot)에 JPA적용해보기6 삭제와 @Transactional (0) | 2024.05.21 |
프로젝트(SpringBoot)에 JPA적용해보기5 🤤 (0) | 2024.05.20 |
프로젝트(SpringBoot)에 JPA적용해보기4 🫡 (0) | 2024.05.18 |
프로젝트(SpringBoot)에 JPA적용해보기3 ☺️ (0) | 2024.05.17 |