Skip to content

Latest commit

ย 

History

History
132 lines (113 loc) ยท 4.35 KB

File metadata and controls

132 lines (113 loc) ยท 4.35 KB

Querydsl

Querydsl ์ด๋ž€?

  • Java์—์„œ ํƒ€์ž… ์•ˆ์ „ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๋ฌธ์ž์—ด์ด๋‚˜ xml ๋Œ€์‹  Querydsl์ด ์ œ๊ณตํ•˜๋Š” ํ”Œ๋ฃจ์–ธํŠธ(Fluent) API๋ฅผ ์ด์šฉํ•ด ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Querydsl์˜ ํŠน์ง•

  • SQL, JPA, MongoDB ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค.
  • ์ž๋ฐ” ์ฝ”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์˜คํƒ€๋‚˜ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋ฅผ ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • IDE์—์„œ ์ฝ”๋“œ ์ž๋™์™„์„ฑ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค.
  • ์ง๊ด€์ ์ด๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ORM ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค.
  • ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ์–ด ์œ ์šฉํ•˜๋‹ค.

Q-Type

  • Querydsl ์—์„œ๋Š” ์—”ํ‹ฐํ‹ฐ๋กœ ์„ค์ •๋œ ํด๋ž˜์Šค์— Q ๋ชจ๋ธ์ด๋ผ๋Š” ์ฟผ๋ฆฌ ํƒ€์ž… ํด๋ž˜์Šค๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋†“๊ณ  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ๋ฉ”์„œ๋“œ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • ์—”ํ‹ฐํ‹ฐ๋“ค์€ compileQuerydsl ์„ ์ด์šฉํ•ด Q-Type ์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
  • Q-Type ๊ฐ์ฒด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
// 1) alias ๋ณ„๋„ ์ง€์ • ๋ฐฉ๋ฒ•
QUser user = new QUser("u");

// 2) ๊ธฐ๋ณธ ์ธ์Šคํ„ด์Šค ์‚ฌ์šฉ
QUser user = QUser.user;
  • Q-Type ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์šฐ์„  ํ”„๋กœ์ ํŠธ ์„ค์ •์— Querydsl ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
    • gradle ์‚ฌ์šฉ ์˜ˆ์‹œ
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 ์— ์ƒ์„ฑ๋œ๋‹ค.

Querydsl ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

  1. ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ
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%" ๊ฒ€์ƒ‰
  1. ๊ฒฐ๊ณผ ์กฐํšŒ
  • 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();

Querydsl ์˜ˆ์ œ ์†Œ์Šค

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 ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.