Querydsl 이란? 

JPQL 빌더이다 

장점

1. 자바 코드로 작성하기 때문에 컴파일 시점에 오류를 잡아준다. code assistance도 해준다 

2. 파라미터 바인딩을 자동으로 해준다

 

build.gradle에서 Querydsl 설정하기

buildscript {
	ext {
		queryDslVersion = "5.0.0"
	}
}
plugins {
	id 'org.springframework.boot' version '2.6.4'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	//querydsl 추가
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
	id 'java'

}

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

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-web'


	//querydsl 추가
	implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
	implementation "com.querydsl:querydsl-apt:${queryDslVersion}"

	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8'
}

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

//querydsl 추가 시작
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
	jpa = true
	querydslSourcesDir = querydslDir
}
sourceSets {
	main.java.srcDir querydslDir
}
configurations {
	compileOnly{
		extendsFrom annotationProcessor
	}
	querydsl.extendsFrom compileClasspath
}
compileQuerydsl {
	options.annotationProcessorPath = configurations.querydsl
}
//querydsl 추가 끝

Querydsl 코드 줄이기 전

@Test
public void startQuerydsl(){

    JPAQueryFactory queryFactory = new JPAQueryFactory(em);

    QMember m = new QMember("m");

    Member findMember = queryFactory.selectFrom(m)
            .from(m)
            .where(m.username.eq("member1"))
            .fetchOne();

    Assertions.assertThat(findMember.getUsername()).isEqualTo("member1");

    }

 

기본 Q-Type 활용

Q클래스 인스턴스를 사용하는 2가지 방법

QMember qMember = new QMember("m"); //별칭 직접 지정 
QMember qMember = QMember.member; //기본 인스턴스 사용

 

-QType은 static import로 쓸 것을 권장한다(QMember.member-> member)

Querydsl 코드 줄인 후 

JPAQueryFactory queryFactory;

@BeforeEach
public void before(){

    queryFactory= new JPAQueryFactory(em); //필드 레벨로 사용하기 
    ...
}

@Test
public void startQuerydsl(){
        
    Member findMember = queryFactory
            .selectFrom(member)
            .from(member)
            .where(member.username.eq("member1"))
            .fetchOne();

    Assertions.assertThat(findMember.getUsername()).isEqualTo("member1");

    }

 

-JPAQueryFactory를 필드로 제공했을 때 동시성 문제는 어떻게 해결하는지에 대해서

 

동시성 문제는 JPAQueryFactory를 생성할 때 제공하는 EntityManager에 달려있다. 

스프링 프레임워크는 여러 쓰레드에서 동시에 같은 EntityManager에 접근해도, 트랜잭션마다 별도의 영속성 컨텍스트를 제공하기 때문에 동시성 문제는 걱정하지 않아도 된다. 

 

 

+ Recent posts