Develop/spring-data

Spring Data JPA 기반 Querydsl 사용해보자. ( 설정편 )

에디개발자 2020. 11. 7. 08:06
반응형

지난글 JPA 프로젝트에 이어서 Querydsl까지 진행해보자!

이 글에서 작성된 모든 소스는 github에 올려두었습니다.

Querydsl 세팅은 허들이 있다고 생각한다. 최대한 자세히 정리해보도록 노력할 것입니다.

 

Gradle ( version 6.6 )

querydsl은 gradle 버전에 따라서 세팅하는 값이 다릅니다. 이 글에서는 version 5.0 이상일 기준으로 작성하겠습니다.

plugins {
	id 'org.springframework.boot' version '2.3.5.RELEASE'
	id 'io.spring.dependency-management' version '1.0.10.RELEASE'
	id 'java'
	id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-jdbc'
	runtimeOnly 'mysql:mysql-connector-java'

	implementation 'com.querydsl:querydsl-jpa'
	implementation 'com.querydsl:querydsl-apt'

	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}

test {
	useJUnitPlatform()
}

test {
	useJUnitPlatform()
}

def querydslSrcDir = "$buildDir/generated/querydsl"

querydsl {
	jpa = true
	querydslSourcesDir = querydslSrcDir
}

sourceSets {
	main.java.srcDirs querydslSrcDir
}

configurations {
	querydsl.extendsFrom compileClasspath
}

compileQuerydsl{
	options.annotationProcessorPath = configurations.querydsl
}

plugins

id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
  • querydsl에서 필요한 Q클래스를 생성해주는 plugin입니다.
  • Entity기반으로 Q클래스를 생성합니다. 

dependencies

DataBase 관련 dependencies

implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' 
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'mysql:mysql-connector-java'

implementation 'com.querydsl:querydsl-jpa'
implementation 'com.querydsl:querydsl-apt'
  • Querydsl은 JPA 기반이므로 추가
  • JPA로 요청하면 내부에서 JDBC를 통해 DB와 커넥션 맺기 때문에 추가
  • mysql을 사용했으므로 추가
  • querydsl을 사용하기 위해 추가
apt는 이전글에 정리해놨습니다. 참조해주세요.

Querydsl 설정

def querydslSrcDir = "$buildDir/generated/querydsl"

querydsl {
	jpa = true
	querydslSourcesDir = querydslSrcDir
}

sourceSets {
	main.java.srcDirs querydslSrcDir
}

// 여기부터 gradle 5.0 이후로 추가
configurations {
	querydsl.extendsFrom compileClasspath
}

compileQuerydsl{
	options.annotationProcessorPath = configurations.querydsl
}
  • querydsl 플러그인 task를 실행했을 때 Q클래스 파일 위치 지정해주는 설정입니다.

 

application.yaml

spring:
  profiles:
    active: local


--- #local
spring:
  profiles: local
  datasource:
    url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
    username: root
    password: vnfmsqka0727!
    driver-class-name: com.mysql.jdbc.Driver

  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    database: mysql
    generate-ddl: false
    open-in-view: false
    show-sql: true
    hibernate:
      ddl-auto:     # 항상 조심!!
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        use_sql_comments: true



logging:
  level:
    org:
      hibernate:
        SQL: DEBUG
        type:
          trace
  • datasource : database 설정값을 세팅한다.
  • jpa.database-platform : platform 설정
  • jpa.open-in-view : 영속성을 어느 범위까지 설정할지 결정. 참조
  • jpa.show-sql : 실행하는 쿼리 show
  • jpa.hibernate.ddl-auto: 톰캣 기동할 때 어떤 동작을 할지 결정
    • 해당 설정을 잘못하면 테이블이 drop될수 있다. 
    • 한 번 설정이 끝났다면 none, validate 로 설정하는 것을 추천한다.
  • jpa.properties.hibernate.format_sql : 쿼리를 이쁘게 보여준다.
  • logging.level.org.hibernate.SQL : 로그 레벨 설정

 

Configuration

package com.example.queyrdsl.configuration;

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
public class DataBaseConfiguration {

    @PersistenceContext
    private EntityManager entityManager;

    @Bean
    public JPAQueryFactory jpaQueryFactory() {
        return new JPAQueryFactory(entityManager);
    }
}

jpa기반이기 때문에 설정과 동일합니다. 

 

Repository

package com.example.queyrdsl.repository;

import com.example.queyrdsl.entity.Staff;
import org.springframework.data.jpa.repository.JpaRepository;

public interface StaffRepository extends JpaRepository<Staff, Long> {
}
package com.example.queyrdsl.repository;

import com.example.queyrdsl.entity.Store;
import org.springframework.data.jpa.repository.JpaRepository;

public interface StoreRepository extends JpaRepository<Store, Long> {
    Store findByName(String name);
}

JPA와 동일합니다.

 

여기까지 동일 세팅입니다.

Entity 관계 매핑이 되어 있는 경우와 안되어있는 경우로 2가지 경우로 작성하겠습니다.

 

 

 

 

 

 

 

 

 

 

반응형