MVC 게시판

[Springboot + JPA] QueryDSL 셋팅법

beejaem 2023. 12. 4. 20:46

오늘은 JPA를 이용해 sql문을 처리하다가 기존에 사용하던

public interface UserRepository extends JpaRepository<User, String> {

    @Query(value = "select * from User where id > ?1")
    public List<User> selectJPQLById1(int id);

    @Query(value = "select * from User where id > :id")
    public List<User> selectJPQLById2(@Param(value = "id") String id);
    
}

이런 방식의 쿼리문 사용으로는 동적쿼리를 사용할 수 없기에 동적쿼리를 알아보았다.

 

JPA를 사용할 때 사용할 수 있는 동적쿼리 방식은 JPQL, Criteria, Specification, Querydsl가 있었는데 가독성과 성능이 가장 좋다고 하는 QueryDSL을 사용해보았다. 문제는 사용방식은 둘째치고 세팅이였는데.. 한참을 구글링하며 세팅을 해야했다.

springboot의 버전에 따라 세팅 방법도 달랐고, 그냥 dependency만 추가하는게 아니라 QEntity를 생성되도록 세팅이 필요했다.

하필 제일 세팅이 번거로운게 내가 사용중인 3.x.x 버전들이라고 한다....

 

이런 저런 세팅들을 보고 따라하다 보니 성공적으로 빌드가 되었다.

build.gradle

 

dependencies {
	//queryDSL
	implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
	annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
	annotationProcessor "jakarta.annotation:jakarta.annotation-api"
	annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

 

※ annotationProcessor를 추가해주지않으면 javax관련 에러가 발생할 수 있으니 붙여주도록 하자.

 

하단 부에 아래 코드들을 넣어주면 gradle 설정은 끝이다.

//QueryDSL 플로그인 설정 START

//qEntity를 생성할 디렉토리
def querydslSrcDir = 'src/main/generated'

//clean 시 디렉토리 제거
clean {
   delete file(querydslSrcDir)
}

//컴파일 시 디렉토리에 qEntity 생성
tasks.withType(JavaCompile) {
   options.generatedSourceOutputDirectory = file(querydslSrcDir)
}

 

세팅이 끝나 gradle을 빌드를 해주자.

빌드가 성공적으로 끝나면 위에서 설정한 디렉토리를 확인해주자.

 

이렇게 Q로 시작하는 Entity들이 생겼다면 세팅은 끝났다.

기존 JPA를 사용하던대로 Repository를 생성하고, 아래 코드만 작성해주면 끝이다.

@Service
public class UserService {

    @Autowired
    private JPAQueryFactory queryFactory;

    public List<User> findTestData(User userData) {
        QUser user = QUser.user;
        // 조건 정의
        BooleanBuilder builder = new BooleanBuilder();

        if (userData != null) {
            builder.and(user.id.eq("abc"));
        }

        List<User> list = queryFactory
                .selectFrom(user)
                .where(builder)
                .fetch();
        System.out.println(list.size());
        // 쿼리 생성
        return list;
    }

}

 

세팅만 오래걸렸지 코드테스트는 금방이었다.

'MVC 게시판' 카테고리의 다른 글

[Spring boot] Rest API 전송 크기 설정  (0) 2023.04.12
Multipart 사용해보기  (0) 2022.09.30
view 화면을 file로 저장하기  (0) 2022.09.30
Mybatis Mapper.xml 사용하기  (0) 2022.08.11
Oauth 카카오로그인 웹  (0) 2022.01.10