[Spring Boot] QueryDsl 설정 방법


Spring Boot에서 QueryDsl을 설정하는 방법에 대해 알아보도록 하겠다.QueryDsl은 쿼리문을 함수 형식으로 작성 하도록 되어있다. Mybatis나 JPA nativeQuery를 사용해 직접 잘못된 쿼리문을 사용했을 때 컴파일시 오류가 발생하지 않고 런타임시 오류가 발생하는 단점이 있지만 QueryDsl은 정해진 함수만 사용하려 쿼리문을 잘못 작성 하는 실수를 줄이고 잘못 작성 되었을 경우 컴파일시 에러가 발생해 오류를 쉽게 찾을 수 있다.


[수행 환경]

Windows 10
IntelliJ
java 11
gradle-7.6


[Gradle 설정]
.....

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

def generated = 'src/main/generated'

tasks.withType(JavaCompile) {
options.getGeneratedSourceOutputDirectory().set(file(generated))
}

sourceSets {
main.java.srcDirs += [generated]
}

clean {
delete file(generated)
}

 

[예제] ConnInfo Entity 작
import lombok.*;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.time.LocalDateTime;

@Entity
@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ConnInfo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer seq;
    private String id;
    private String ip;
    private LocalDateTime sysCreateDt;
}

 

[예제] CustomConnInfoRepository 인터페이스 작성
public interface CustomConnInfoRepository {
    ConnInfo findSeq(Integer seq);
}

 

[예제] CustomConnInfoRepositoryImpl 클래스 작성
@Slf4j
public class CustomConnInfoRepositoryImpl implements CustomConnInfoRepository {

    JPAQueryFactory query;

    public CustomConnInfoRepositoryImpl(EntityManager em) {query = new JPAQueryFactory(em);}

    @Override
    public ConnInfo findSeq(Integer seq) {
        ConnInfo connInfo = query.selectFrom(QConnInfo.connInfo) //<--- QueryDSL 사용하는 부분
                .where(
                        QConnInfo.connInfo.seq.eq(seq)
                )
                .fetchOne();
        return connInfo;
    }
}

 

[예제] ConnInfoRepository 인터페이스 작성
// JPA에 CustomConnInfoRepository 인터페이스를 상속 받는다.
public interface ConnInfoRepository extends JpaRepository<ConnInfo, Integer>, CustomConnInfoRepository {

}

 

[예제] queryDsl 사용 부분 호출
//Repository는 보통 Service에서 호출하므로 위에서 구현한 함수도 Service
ConnInfo seq = connInfoRepository.findSeq(1);
호출시 Seq 값이 1인 ConnInfo 정보를 리턴 한다.

 

 

 

반응형

+ Recent posts