๐ 3/14(๋ชฉ) ๋ด์ผ๋ฐฐ์์บ ํ Java-Spring 55์ผ์ฐจ TIL - SpringData JPA QueryDSL
๐ ์ค๋์ ํ์ต ํค์๋
- SpringData JPA - QueryDSL
๐ QueryDSL์ด๋?
QueryDSL์ ์คํ์์ค ํ๋ก์ ํธ์ด๋ค. SQL์ ์ง์ ๋ฌธ์์ด๋ก ์์ฑํ๋ ๋์ , QueryDSL์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค. Maven์ด๋ Gradle๊ณผ ๊ฐ์ ์์กด์ฑ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ํตํด ํ๋ก์ ํธ์ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
- ํ์ ์์ ์ฑ(Type Safety)
Java์ ํ์ ์์คํ ์ ํ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ฏ๋ก ์คํ๋ ์๋ชป๋ ํ๋๋ช ์ ์ฌ์ฉํ๋ ๋ฑ์ ์ค์๋ฅผ ์ปดํ์ผ ์๊ฐ์ ์ก์๋ผ ์ ์๋ค.
- ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ
SQL ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์๋ฐ ์ฝ๋๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ฏ๋ก ๊ฐ๋ ์ฑ์ด ํฅ์๋๊ณ , ์ฝ๋์ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๋ค.
- ๋์ ์ฟผ๋ฆฌ ์์ฑ
๊ณ ์ ๋ SQL๋ฌธ์ด ์๋ ์กฐ๊ฑด์ ๋ง๊ฒ ๋์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค.
- ์์ฐ์ฑ ํฅ์
IDE์ ๋์์ ๋ฐ์์ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฐ์ฑ์ ํฅ์์ํฌ ์ ์๋ค.
- ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์
๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์ํ๋ฉฐ, JPA์ ํจ๊ป ์ฌ์ฉ๋ ๋๋ ํนํ JPA ์ํฐํฐ์์ ํตํฉ์ด ์ฉ์ดํ๋ค.
๐ QueryDSL ํ๊ฒฝ์ค์
QueryDSL์ ์ฌ์ฉํ๋ ค๋ฉด ์ํฐํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฟผ๋ฆฌ ํ์ ์ด๋ผ๋ ์ฟผ๋ฆฌ์ฉ ํด๋์ค(Qclass)๋ฅผ ์์ฑํด์ผ ํ๋ค. ํ๊ฒฝ์ค์ ์ ํตํด QueryDSL์ ์ฌ์ฉํด ๋ณด์.
- JPAQueryFactory ์์กด์ฑ ์ฃผ์
- build.gradleํ์ผ์ ์์กด์ฑ์ ์ถ๊ฐํ๊ณ ๋ค์ build ํด์ค๋ค.
dependencies {
.
.
.
//QueryDSL ์ ์ฉ์ ์ํ ์์กด์ฑ (SpringBoot3.0.x๋ถํฐ๋ jakarta๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค)
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}
- Java ์ปดํ์ผ
- gradle -> other -> compile.java
- Qclass ์์ฑ ํ์ธ
- build -> generated -> sources -> annotationProcessor -> java -> main
- JPAConfig ํด๋์ค ์์ฑ
- @Configuration ์ด๋ ธํ ์ด์ ์ฌ์ฉ
- ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด @PersistenceContext ์ด๋ ธํ ์ด์ ์ ์ด์ฉํด EntityManager ๋น์ ์ฃผ์
@Configuration
public class JPAConfig {
@PersistenceContext
private EntityManager em;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(em);
}
}
- QueryRepository ์์ฑ
- QEntity class๋ฅผ import ํ๊ณ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
import static com.sparta.todoapp.entity.QTodo.todo;
.
.
.
@Repository
@RequiredArgsConstructor
public class QueryRepository {
private final JPAQueryFactory jpaQueryFactory;
public List<Todo> findByKeyword(String keyword) {
return jpaQueryFactory
.selectFrom(todo)
.where(
todo.title.contains(keyword)
.or(todo.content.contains(keyword))
.or(todo.user.username.contains(keyword))
)
.fetch();
}
}