반응형
springBoot 3.0 에 JPA 를 도입하면서 몇가지 바뀐점이 있어 Querydsl 적용이 안되는 이슈가 있었다.
Jakarta EE
기존 오라클 프로젝트인 JavaEE 를 이클립스 재단으로 이관하면서
상표권 문제 때문에 JavaEE 의 패키지 네임 인 ‘javax.’ 를 JakartaEE 로 만들어 ‘jakarta.’ 로 변경하였다.
- Java Persistence API (javax.persistence) -> Jakarta Persistence (jakarta.persistence)
따라서 build.gradle 에 아래와 같이 설정해주어야 한다.
- implementation 시 마지막은
:jakarta
임에 주의한다.
...
ext {
querydslVersion = '5.0.0'
}
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// QueryDsl
implementation "com.querydsl:querydsl-jpa:${querydslVersion}:jakarta"
implementation "com.querydsl:querydsl-apt:${querydslVersion}:jakarta"
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
}
def querydslSrcDir = 'src/main/generated'
clean {
delete file(querydslSrcDir)
}
tasks.withType(JavaCompile) {
options.generatedSourceOutputDirectory = file(querydslSrcDir)
}
그 후 querydsl config 를 만들어주면 된다.
/**
* query dsl 관련 빈 설정
*/
@Configuration
public class JpaConfig {
@PersistenceContext(unitName = "gameMasterEntityManager")
private EntityManager gameMasterEntityManager;
@PersistenceContext(unitName = "gameSlaveEntityManager")
private EntityManager gameSlaveEntityManager;
@Bean
public JPAQueryFactory jpaQueryFactoryGameMaster() {
return new JPAQueryFactory(gameMasterEntityManager);
}
@Bean
public JPAQueryFactory jpaQueryFactoryGameSlave() {
return new JPAQueryFactory(gameSlaveEntityManager);
}
}
사용
1) repository interface 정의
public interface UserRepository extends JpaRepository<User, Long>, UserCustomRepository {
}
2) CustomRepository 정의
querydsl 용으로 쓸 repository 를 정의한다.
public interface UserCustomRepository {
Integer getMembershipType(Long userId);
}
3) customRepositoryImpl 구현
@RequiredArgsConstructor
@Repository
public class MembershipUserCustomRepositoryImpl implements MembershipUserCustomRepository {
private final JPAQueryFactory jpaQueryFactoryGameSlave;
@Override
public Integer getMembershipType(Long userId) {
Integer result = jpaQueryFactoryGameSlave.select(membershipUser.type.max())
.from(membershipUser)
.where(membershipUser.sno.eq(userId))
.fetchOne();
return ObjectUtils.defaultIfNull(result, 0);
}
}
- JPAQueryFactory 는 필요한 bean 이름으로 가져온다.
참고
반응형
'JPA' 카테고리의 다른 글
JPA DB 컬럼 네이밍 문제 (0) | 2023.09.05 |
---|---|
Querydsl - 3편 (0) | 2022.02.15 |
Querydsl - 2편 (0) | 2022.02.08 |
Querydsl - 1편 (0) | 2022.02.08 |
JPA 를 공부하면서 알게 된 내용 정리 4 (0) | 2022.02.05 |
댓글