본문 바로가기
Study/Spring

[Spring | Gradle 7] QueryDSL 적용

by M개발자 2022. 2. 10.
반응형

✔ Java 11

✔ Gradle 7

✔ Spring boot 2.6.3

My GitHub Commit

1. gradle 추가

김영한님의 querydsl 적용 방법으로 적용했다.

ref. https://www.inflearn.com/questions/219898

 

build.gradle

// querydsl 추가부분
buildscript {
    dependencies {
        classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.10")
    }
}

plugins {
    id 'org.springframework.boot' version '2.6.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

// querydsl 추가부분
apply plugin: "com.ewerk.gradle.plugins.querydsl"

...

dependencies {
    //querydsl
    implementation 'com.querydsl:querydsl-jpa'
    implementation 'com.querydsl:querydsl-apt'

    ...
}

tasks.named('test') {
    useJUnitPlatform()
}

// querydsl 추가부분
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
    library = "com.querydsl:querydsl-apt"
    jpa = true
    querydslSourcesDir = querydslDir
}

sourceSets {
    main {
        java {
            srcDirs = ['src/main/java', querydslDir]
        }
    }
}

compileQuerydsl {
    options.annotationProcessorPath = configurations.querydsl
}

configurations {
    querydsl.extendsFrom compileClasspath
}

적용을 완료 했다면,

Gradle > build > clean
Gradle > build  or  Gradle > other > complieQuerydsl

이 두개를 순서대로 진행한다.

clean을 통하여 build 폴더를 삭제하고 다시 build를 통하여 build한다.

Gradle > other > complieQuerydsl이 추가되어 있는 걸 확인할 수 있다!

Q 파일 경로 확인

build > generated > querydsl

2. Config - QueryDslConfig 추가

JPAQueryFactory를 사용하기 위해 config를 추가한다.

 

config > QueryDslConfig.java

@Configuration
public class QueryDslConfig {
    @PersistenceContext
    private EntityManager entityManager;
    @Bean
    public JPAQueryFactory queryFactory(){
        return new JPAQueryFactory(entityManager);
    }
}

3. User Repository - QuerydslRepositorySupport 상속 받기

entity > user > repository > UserMinjRepositoryExtension.java

public interface UserMinjRepositoryExtension {
}

QuerydslRepositorySupport를 사용하기 위해 먼저 인터페이스를 구현하고 해당 인터페이스를 리포지토리 인터페이스에 상속해준다.

해당 인터페이스에선 querydsl에서 구현할 메소드를 추상 메소드로 적어준다.

 

entity > user > repository > UserRepository.java

public interface UserMinjRepository extends CrudRepository<UserMinj, Long>, UserMinjRepositoryExtension {
    UserMinj save(UserMinj userMinj);
}

UserRepository에선 Extension 인터페이스를 상속받는다.

 

entity > user > repository > UserRepositoryImpl.java

public class UserMinjRepositoryImpl extends QuerydslRepositorySupport implements UserMinjRepositoryExtension {

    private final JPAQueryFactory queryFactory;

    public UserMinjRepositoryImpl(JPAQueryFactory jpaQueryFactory) {
        super(UserMinj.class);
        this.queryFactory = jpaQueryFactory;
    }
}

QueryDSL을 사용하기 위해 QuerydslRepositorySupport을 상속받는다.

그리고 추상 메소드를 구현하기 위해 앞에서 추가한 인터페이스인 UserMinjRepositoryExtension을 추가한다.

3. QueryDSL로 update 쿼리문 작성

entity > user > repository > UserMinjRepositoryExtension.java

public interface UserMinjRepositoryExtension {
    void updateUser(long id, UpdateUserRequestDto updateUserRequestDto);
}

인터페이스에서 추상 메소드를 작성한다.

 

entity > user > repository > UserRepositoryImpl.java

@Override
    public void updateUser(long id, UpdateUserRequestDto updateUserRequestDto) {
        queryFactory.update(userMinj)
                .set(userMinj.user_password, updateUserRequestDto.getUser_password())
                .set(userMinj.user_name, updateUserRequestDto.getUser_name())
                .where(userMinj.id.eq(id))
                .execute();
    }

해당 클래스에서 메소드를 구현하면 된다.

 

참고!!! 

Q파일을 import받아 사용하고 싶었는데 엔티티 이름을 그냥 치고 import하려니 QUserMinj를 임포트하라고 계속 떠 삽질하게 되었다. 내가 import하고 싶었던 건 QUserMinj.usrMinj이다. 

 

아마도 내가 자바를 아직 잘 모르고 querydsl도 몰라서 생겼던 삽질이라 생각된다.

 

import를 할 때 꼭 import 뒤에 static이 붙어야지만 생성자를 사용하지 않고 사용할 수 있다. 

import static com.second.spring_study.entity.user_minj.QUserMinj.userMinj;

 


 

반응형

댓글