QueryDSL์ ํ์ ์์ ํ SQL๊ณผ ์ ์ฌํ ์ฟผ๋ฆฌ๋ฅผ ์๋ฐ ์ฝ๋๋ก ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋ ์์ํฌ์ ๋๋ค. JPA, MongoDB, SQL ๋ฑ ๋ค์ํ ๋ฐฑ์๋๋ฅผ ์ง์ํ๋ฉฐ, ํนํ JPA์ ํจ๊ป ์ฌ์ฉํ ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
ํ์ ์์ ํ ์ฟผ๋ฆฌ ์์ฑ
์๋ ์์ฑ ์ง์์ผ๋ก ์์ฐ์ฑ ํฅ์
๋์ ์ฟผ๋ฆฌ ์์ฑ ์ฉ์ด
๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ORM ์ง์
QueryDSL์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํ๋ก์ ํธ์ ์์กด์ฑ์ ์ถ๊ฐํ๊ณ Qํด๋์ค๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
Maven ๋๋ Gradle์ ํตํ ์์กด์ฑ ๊ด๋ฆฌ
APT(Annotation Processing Tool)๋ฅผ ์ฌ์ฉํ Qํด๋์ค ์๋ ์์ฑ
JPA ์ํฐํฐ ๊ธฐ๋ฐ์ ์ฟผ๋ฆฌ ๋๋ฉ์ธ ํด๋์ค ์์ฑ
public List<User> findUsers(String username, Integer age) {
QUser user = QUser.user;
BooleanBuilder builder = new BooleanBuilder();
if (StringUtils.hasText(username)) {
builder.and(user.username.eq(username));
}
if (age != null) {
builder.and(user.age.goe(age));
}
return queryFactory
.selectFrom(user)
.where(builder)
.fetch();
}
ํ์ ์์ ํ ์ฟผ๋ฆฌ ์์ฑ
๋ฉ์๋ ์ฒด์ด๋์ ํตํ ์ง๊ด์ ์ธ ์ฟผ๋ฆฌ ๊ตฌ์ฑ
๋์ ์ฟผ๋ฆฌ ์์ฑ์ด ์ฉ์ด
์ปดํ์ผ ์์ ์ ์ค๋ฅ ๊ฒ์ถ ๊ฐ๋ฅ
ํ์ ์์ ์ฑ ๋ณด์ฅ
IDE์ ์๋ ์์ฑ ๊ธฐ๋ฅ ํ์ฉ ๊ฐ๋ฅ
๋์ ์ฟผ๋ฆฌ ์์ฑ์ด ํธ๋ฆฌ
๋ณต์กํ ์ฟผ๋ฆฌ๋ ์๋ฐ ์ฝ๋๋ก ์์ฑ ๊ฐ๋ฅ
ํ์ต ๊ณก์ ์ด ์กด์ฌ
ํ๋ก์ ํธ ์ค์ ์ด ๋ค์ ๋ณต์ก
Qํด๋์ค ์์ฑ์ผ๋ก ์ธํ ๋น๋ ์๊ฐ ์ฆ๊ฐ
Qํด๋์ค ๊ด๋ฆฌ: ์์ฑ๋ Qํด๋์ค๋ฅผ ๋ฒ์ ๊ด๋ฆฌ์ ํฌํจ์ํค์ง ์๋๋ก ์ฃผ์
gitignoreCopy/target/generated-sources/
ํ์ด์ง ์ฒ๋ฆฌ: fetchResults() ๋ฉ์๋ ์ฌ์ฉ ์ ์ฃผ์ ํ์ (deprecate ์์ )
QueryResults<User> results = queryFactory
.selectFrom(user)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetchResults();
return new PageImpl<>(results.getResults(), pageable, results.getTotal());
์ฑ๋ฅ ์ต์ ํ: ํ์ํ ์ปฌ๋ผ๋ง ์กฐํํ๋ ํ๋ก์ ์ ์ฌ์ฉ
List<String> usernames = queryFactory
.select(user.username)
.from(user)
.fetch();
ํ ์คํธ ์์ฑ: QueryDSL ์ฟผ๋ฆฌ์ ๋ํ ๋จ์ ํ ์คํธ ๋ฐ ํตํฉ ํ ์คํธ ์์ฑ ๊ถ์ฅ
JPQL๊ณผ์ ๋ณํ ์ฌ์ฉ: ๋ณต์กํ ์ฟผ๋ฆฌ๋ QueryDSL, ๊ฐ๋จํ ์ฟผ๋ฆฌ๋ JPQL ์ฌ์ฉ ๊ณ ๋ ค