- Java์์ ํ์
์์ ํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๋ฌธ์์ด์ด๋ xml ๋์ Querydsl์ด ์ ๊ณตํ๋ ํ๋ฃจ์ธํธ(Fluent) API๋ฅผ ์ด์ฉํด ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค.
- SQL, JPA, MongoDB ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์ํ๋ค.
- ์๋ฐ ์ฝ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ผ๋ฏ๋ก, ์คํ๋ ๋ฌธ๋ฒ ์ค๋ฅ๋ฅผ ๋ฐํ์ ์ด์ ์ ์ฐพ์๋ผ ์ ์๋ค.
- IDE์์ ์ฝ๋ ์๋์์ฑ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ด ๊ฐ๋ฐ ํจ์จ์ฑ์ด ํฅ์๋๋ค.
- ์ง๊ด์ ์ด๊ณ ๊ฐ๋
์ฑ์ด ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
- ORM ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฝ๋์ ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ํฅ์๋๋ค.
- ๋์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ์ ์ ์ฐํ๊ฒ ๋์ฒํ ์ ์์ด ์ ์ฉํ๋ค.
- Querydsl ์์๋ ์ํฐํฐ๋ก ์ค์ ๋ ํด๋์ค์ Q ๋ชจ๋ธ์ด๋ผ๋ ์ฟผ๋ฆฌ ํ์
ํด๋์ค๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด๋๊ณ ๋ฉํ๋ฐ์ดํฐ๋ก ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ๋ฉ์๋ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ๋ค.
- ์ํฐํฐ๋ค์
compileQuerydsl ์ ์ด์ฉํด Q-Type ์ผ๋ก ๋ณํ๋๋ค.
- Q-Type ๊ฐ์ฒด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
// 1) alias ๋ณ๋ ์ง์ ๋ฐฉ๋ฒ
QUser user = new QUser("u");
// 2) ๊ธฐ๋ณธ ์ธ์คํด์ค ์ฌ์ฉ
QUser user = QUser.user;
- Q-Type ํด๋์ค๋ฅผ ์์ฑํ๋ ค๋ฉด ์ฐ์ ํ๋ก์ ํธ ์ค์ ์ Querydsl ์ค์ ์ ์ถ๊ฐํด์ค์ผ ํ๋ค.
plugins {
// ...
// querydsl ์ถ๊ฐ
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
dependencies {
// ...
implementation "com.querydsl:querydsl-jpa:5.0.0"
implementation "com.querydsl:querydsl-apt:5.0.0"
}
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
sourceSets {
main.java.srcDir querydslDir
}
compileQuerydsl {
options.annotationProcessorPath = configurations.querydsl
}
configurations {
// ...
querydsl {
extendsFrom compileClasspath
}
}
// ...
- gradle ์ค์ ์ ์ถ๊ฐํ๋ฉด IDE ๋น๋ ์์
๋ชฉ๋ก์
compileQuerydsl ์ด ์ถ๊ฐ๋๋ค.
./gradlew compileQuerydsl ๋๋ ./gradlew build ์ํ ์ Q-Type ํด๋์ค๊ฐ ์์ฑ๋๋ค.
- ์ ์ค์ ๋๋ก๋ผ๋ฉด
$buildDir/generated/querydsl ์ ์์ฑ๋๋ค.
- ๊ฒ์ ๊ธฐ๋ฅ
member.username.eq("member1") // username == "member1"
member.username.ne("member1") // username != "member1"
member.username.eq("member1").not() // username != "member1"
member.username.isNotNull()
member.age.in(10, 20) // age in (10, 20)
member.age.notIn(10, 20) // age not in (10, 20)
member.age.between(10, 30) // age >= 10 && age <= 30
member.age.goe(30) // age >= 30
member.age.gt(30) // age > 30
member.age.loe(30) // age <= 30
member.age.lt(30) // age < 30
member.username.like("member%") // like "member%" ๊ฒ์
member.username.contains("member") // like "%member%" ๊ฒ์
member.username.startsWith("member") // like "member%" ๊ฒ์
- ๊ฒฐ๊ณผ ์กฐํ
fetch(): ๋ฆฌ์คํธ ์กฐํ, ๋ฐ์ดํฐ ์์ผ๋ฉด ๋น ๋ฆฌ์คํธ ๋ฐํ
fetchOne(): ๋จ ๊ฑด ์กฐํ
- ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด null
- ๊ฒฐ๊ณผ๊ฐ ๋ ์ด์์ด๋ฉด com.querydsl.core.NonUniqueResultException
fetchFirst(): limit(1).fetchOne()
fetchResults(): ํ์ด์ง ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ด ์ํํ์ฌ, total count ์ฟผ๋ฆฌ ์ถ๊ฐ
fetchCount(): count ์ฟผ๋ฆฌ, count ์๋ง ์กฐํ
List<Member> fetch = queryFactory
.selectFrom(member)
.fetch();
Member fetchOne = queryFactory
.selectFrom(member)
.fetchOne();
Member.oneMember = queryFactory
.selectFrom(member)
.fetchFirst();
QueryResults<Member> results = queryFactory
.selectFrom(QMember.member)
.fetchResults();
List<Member> content = results.getResults();
long total = queryFactory.selectFrom(member)
.fetchCount();
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
QUser user = QUser.user;
List<String> names = queryFactory
.select(user.name)
.from(user)
.where(user.age.gt(20))
.orderBy(user.name.asc())
.fetch();
QUser Qํด๋์ค๋ฅผ ์ด์ฉํ์ฌ user ํ
์ด๋ธ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.
where ์กฐ๊ฑด์ ๊ณผ orderBy ์ ์ ์ด์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
fetch ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์จ๋ค.