[Spring Boot + JPA with Kotlin] Querydsl 설정 및 적용하기

Minji Kwak·2022년 10월 28일
1
post-thumbnail

Querydsl을 스프링부트 프로젝트에 적용해보자!

build.gradle.kts 설정

build.gradle.kts에 다음 항목들을 추가한다. dependencies에서 원하는 버전은 말그대로 원하는 querydsl 버전을 적어넣으면 된다. 특정하게 원하는 버전이 없다면 가장 최신 버전인 5.0.0을 적으면 된다.

plugins {
	...
    // 플러그인에 추가
    kotlin("kapt") version "1.7.10"
    ...
}

dependencies {
	// querydsl 추가
	implementation("com.querydsl:querydsl-jpa:{원하는 버전}")
    kapt("com.querydsl:querydsl-apt:{원하는 버전}:jpa")
    kapt("org.springframework.boot:spring-boot-configuration-processor")
}

Build하기

위 같이 설정한 후 빌드를 하게 되면 build>generated>source>kapt>main 하위에 QClass가 생기는 것을 확인할 수 있다.

QueryDslConfig

프로젝트 어디에서든 JPAQueryFactory를 주입받아 사용하기 위해 JPAQueryFactory bean으로 등록하는 과정이다.

import com.querydsl.jpa.impl.JPAQueryFactory
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import javax.persistence.EntityManager
import javax.persistence.PersistenceContext

@Configuration
class QueryDslConfig{
    @PersistenceContext 
    lateinit var entityManager: EntityManager
    
    @Bean
    fun jpaQueryFactory(): JPAQueryFactory {
        return JPAQueryFactory(entityManager)
    }
}

적용하기

UserRepository의 기능을 확장하기 위해 UserSupport라는 인터페이스를 새로 만들었다.

interface UserSupport {
	fun findUsersByName(username: String): List<UserEntity>
}

findUsersByName(username)이라는 기능을 통해 username이라는 이름을 가진 UserEntity를 찾고자 한다.

import com.querydsl.core.types.Projections
import com.querydsl.jpa.impl.JPAQueryFactory
import com.project.core.user.database.QUserEntity.userEntity
import org.springframework.stereotype.Component

@Component
class UserSupportImpl(
	private val queryFactory: JPAQueryFactory  //JPAQueryFactory를 주입받아 사용한다.
): UserSupport {
	override fun findUsersByName(username: String): List<UserEntity> {
    	return queryFactory
        	.selectFrom(userEntity) //.select(userEntity).from(userEntity)를 줄여서 쓸 수 있다
            .where(userEntity.name.eq(username)) //userEntity.name == username
            .fetch()
    }
}

메소드를 만든 후 아래와 같이 UserRepository에서 UserSupport를 상속 받으면 Service에서 userRepository.findUsersByName()으로 바로 사용할 수 있다.

interface UserRepository: JpaRepository<UserEntity, Long>, UserSupport {
}

참고 사이트

profile
코딩 걸음마 떼는 중

1개의 댓글

comment-user-thumbnail
2023년 7월 11일

프사 .. 제..
취저 입니당 ㅎㅎ
잘보고 가요!

답글 달기