JPA 활용편 2 - Spring Data JPA, QueryDSL 소개

Stella·2022년 6월 24일
1

Java

목록 보기
18/18

Spring Data JPA

  • JpaRepository 인터페이스에서 기본적인 CRUD기능 제공
  • findByName 특정 필드도 정해진 method이름으로 만들면 정확한 JPQL 쿼리를 실행
    • select m from Member m where m.name = :name
  • 인터페이스만 만들면 구현체는 스프링 데이터 JPA가 애플리케이션 실행시점에 주입!

QueryDSL

  • SQL(JPQL)과 모양이 유사
  • 자바코드로 동적쿼리 편리하게 생성
  • 높은 개발 생산성
  • 장점
    • 컴파일 시점에서 문법 오류 발견
    • 직관적인 문법
    • 코드 자동완성
    • 코드 재사용
    • 깔끔한 DTO 조회 지원

build.gradle 추가

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

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

group = 'jpabook'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

//apply plugin: 'io.spring.dependency-management'
apply plugin: "com.ewerk.gradle.plugins.querydsl"

configurations {
   compileOnly {
      extendsFrom annotationProcessor
   }
}

repositories {
   mavenCentral()
}

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
   implementation 'org.springframework.boot:spring-boot-starter-validation'
   implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
   implementation 'org.springframework.boot:spring-boot-starter-web'
   implementation 'org.springframework.boot:spring-boot-devtools'
   implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5'
// implementation 'org.hibernate:hibernate-core:5.4.13.Final'

   implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6'

   compileOnly 'org.projectlombok:lombok'
   runtimeOnly 'com.h2database:h2'

   annotationProcessor 'org.projectlombok:lombok'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'
   //추가
   testImplementation("org.junit.vintage:junit-vintage-engine") {
      exclude group: "org.hamcrest", module: "hamcrest-core"
   }

   //querydsl 추가
   implementation 'com.querydsl:querydsl-jpa'
   //querydsl 추가
   implementation 'com.querydsl:querydsl-apt'
}


//querydsl 추가
//def querydslDir = 'src/main/generated'
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
}

Complie 실행

  • complieQuerydsl 눌러서 Q파일 만들기

생성된 파일

  • 지정한 경로에 파일 생성됨
  • generated는 git에 올릴 때.gitignore로 빼주기

OrderRepository

// QueryDSL 사용
    public List<Order> findAll(OrderSearch orderSearch){
        JPAQueryFactory query = new JPAQueryFactory(em);
        QOrder order = QOrder.order;
        QMember member = QMember.member;

        return query
                .select(order)
                .from(order)
                .join(order.member,member)
                .where(statusEq(orderSearch.getOrderStatus()), nameLike(orderSearch.getMemberName()))// 동적쿼리
                //.where(order.status.eq(orderSearch.getOrderStatus()),member.name.like(orderSearch.getMemberName())) // 이렇게도 가능. 정적쿼리
                .limit(1000)
                .fetch();

    }

    private BooleanExpression nameLike(String memberName) {
        if (StringUtils.hasText(memberName)){
            return null;
        }
        return QMember.member.name.like(memberName);
    }

    private BooleanExpression statusEq(OrderStatus statusCond){
        if(statusCond == null){
            return null;
        }
        return QOrder.order.status.eq(statusCond);
    }
profile
Hello!

0개의 댓글