본문 바로가기
JPA

SpringBoot 3.0 에서의 Querydsl 적용

by 성건희 2023. 8. 31.
반응형

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

댓글