๐ข ์์ฝ
์ฌ๋ฌ๋ถ์ด ์์ ๊ฐ์ ์๋ฌ๋ฅผ ๋ง๋๋ค๋ฉด ์ฌ๋ฌ๊ฐ์ง ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ธํด๋ณด์ ์ผํฉ๋๋ค.
1๏ธโฃ Gradle ์ค์ ํ์ธ
Gradle ์ค์ ํ์ผ์ด ์ ๋๋ก ๊ตฌ์ฑ๋์๋์ง ํ์ธํด์ฃผ์ ์ผํฉ๋๋ค.
2๏ธโฃ Q ํด๋์ค ์์ฑ ํ์ธ
Qํด๋์ค๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์์ฑ์ด ๋์๋์ง ํ์ธํ์ ์ผํฉ๋๋ค.
(build/generated/sources/annotationProcessor/java/main ๋๋ ํฐ๋ฆฌ์ ์์ฑ๋์ด์์ด์ผ ํฉ๋๋ค.)
3๏ธโฃ query๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์์ฑํ์๋์ง ํ์ธํด์ฃผ์ธ์.
๐ ์ค๋ฅ ํ๊ณ
1๏ธโฃ Gradle ์ค์ ํ์ธ
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
dependencies {
implementation 'com.querydsl:querydsl-core:5.1.0'
implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta'
implementation "jakarta.annotation:jakarta.annotation-api"
implementation "jakarta.persistence:jakarta.persistence-api"
annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}
clean {
delete file('src/main/generated')
}
- implementation 'com.querydsl:querydsl-core:5.1.0'
- QueryDSL์ ํต์ฌ(core) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํฉ๋๋ค. QueryDSL์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta'
- QueryDSL์ JPA(Jakarta Persistence API) ๋ชจ๋์ ํฌํจํฉ๋๋ค. JPA๋ฅผ ์ฌ์ฉํ ๋ QueryDSL์ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
- annotationProcessor "com.querydsl:querydsl-apt:5.1.0:jakarta"
- QueryDSL์์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ํ๋ก์ธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ปดํ์ผ ์์ ํ์ํ QueryDSL ํ์ ์ ์์ฑํฉ๋๋ค.
- annotationProcessor "jakarta.annotation:jakarta.annotation-api"
- Jakarta EE์์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ API๋ฅผ ํฌํจํฉ๋๋ค. ์ด๋ ์ด๋ ธํ ์ด์ ํ๋ก์ธ์๊ฐ Jakarta EE ์ด๋ ธํ ์ด์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
- annotationProcessor "jakarta.persistence:jakarta.persistence-api"
- Jakarta Persistence API ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. JPA๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์ ์ด๋ ธํ ์ด์ ํ๋ก์ธ์๊ฐ ์ด API๋ฅผ ์ฐธ์กฐํ ์ ์๊ฒ ํฉ๋๋ค.
- implementation 'jakarta.annotation:jakarta.annotation-api'
- implementation 'jakarta.persistence:jakarta.persistence-api'
- ๋ฐํ์์ ์ด API๋ค์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋๋ค. ์ด๋ ๋ฐํ์์๋ ์ด๋ ธํ ์ด์ API๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ ์ฉํฉ๋๋ค.
- delete file('src/main/generated')
- clean ์์ ์ด ์คํ๋ ๋ src/main/generated ๋๋ ํ ๋ฆฌ๋ฅผ ์ญ์ ํ๋๋ก ์ค์ ํฉ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก QueryDSL์ ์ด๋ ธํ ์ด์ ํ๋ก์ธ์๊ฐ ์์ฑํ ์์ค ํ์ผ๋ค์ด ์ ์ฅ๋๋ ๋๋ ํ ๋ฆฌ์ ๋๋ค.
โ๏ธ SemanticException
๋จผ์ SemanticExcpetion ๋ถํฐ ์์๋ด ์๋ค.
SemanticException์ hibernate-orm ์์ ์ฐพ์๋ณด์ค ์ ์์ต๋๋ค.
๊ฐ์๊ธฐ hibernate ? ๋ผ๊ณ ํ์ค ์๋ ์๋๋ฐ QueryDSL์๋ ๊ผญ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
โ QueryDSL์ด Hibernate ORM์ ์ฌ์ฉํ๋ ์ด์
QueryDSL์ด Hibernate ORM์ ์ฌ์ฉํ๋ ์ด์
Hibernate ORM์ JPA ๊ตฌํ์ฒด ์ค ํ๋๋ก, ์๋ฐ ๊ฐ์ฒด๋ฅผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋งคํํ๋ ์ญํ ์ ํฉ๋๋ค.
1. JPA ๊ตฌํ์ฒด๋ก์์ Hibernate
QueryDSL์ JPA์ ํจ๊ป ๋์ํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค. JPA๋ Java ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๊ธฐ ์ํ ํ์ค API๋ฅผ ์ ๊ณตํ๋ฉฐ, Hibernate๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ JPA ๊ตฌํ์ฒด ์ค ํ๋์ ๋๋ค. ๋ฐ๋ผ์, QueryDSL์ Hibernate๋ฅผ ํตํด JPA์ ์ฐ๋ํ์ฌ ORM ๊ธฐ๋ฅ์ ํ์ฉํฉ๋๋ค.
2. ๊ด๋ฒ์ํ ๊ธฐ๋ฅ ์ง์
Hibernate๋ ๊ฐ๋ ฅํ๊ณ ํ๋ถํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ORM ํ๋ ์์ํฌ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ณต์กํ ์ํธ์์ฉ์ ๋จ์ํํ๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. QueryDSL์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ๋จํ๊ณ ์์ ํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
ํนํ, Hibernate์ ์บ์ฑ, ํธ๋์ญ์ ๊ด๋ฆฌ, ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
3. ํตํฉ๊ณผ ํธํ์ฑ
QueryDSL์ Hibernate์์ ํตํฉ์ ํตํด JPA ํ์ค์ผ์ ์ค์ํ๋ฉด์๋, Hibernate์ ํน์ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Hibernate์ ๊ณ ์ ํ ๊ธฐ๋ฅ์ด๋ ์ต์ ํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ค๋ฅธ JPA ๊ตฌํ์ฒด์์๋ ์ ๊ณต๋์ง ์์ ์ ์์ต๋๋ค.
> QueryDSL๊ณผ Hibernate๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฐ๋จํ ์์ ์ ๋๋ค.
public class QueryDSLExample {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
EntityManager em = emf.createEntityManager();
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
// ์์ : ํน์ ์กฐ๊ฑด์ ๋ง๋ ์ฌ์ฉ์ ์กฐํ
List<User> users = queryFactory.selectFrom(user)
.where(user.age.gt(18))
.fetch();
for (User u : users) {
System.out.println(u.getName());
}
em.close();
emf.close();
}
}
์ด ์์ ์์ JPAQueryFactory๋ฅผ ์ฌ์ฉํ์ฌ QueryDSL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ณ Hibernate๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํฉ๋๋ค.
QueryDSL์ JPA ํ์ค API๋ฅผ ์ฌ์ฉํ๋ฉด์๋ ํ์ ์์ ์ฑ๊ณผ ๋์ ์ฟผ๋ฆฌ ์์ฑ์ ์ฅ์ ์ ์ ๊ณตํฉ๋๋ค.
์ฌ๊ธฐ์ SemanticExcpetion ์์์ ํ๊ณ ๋๊น์ง ์ฌ๋ผ๊ฐ๋ณด๋ฉด ์๋์ ๊ฐ์ด 'jakarta.persistence.PersistenceException'์ ์์ํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
PersistenceException๋ JPA ์ฌ์ฉ ์ค์ ๋ฐ์ํ ์ ์๋ ์ฌ๋ฌ ๊ฐ์ง ์์ธ์ ์์ ํด๋์ค์ ๋๋ค. ์ด ์์ธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์์ ๋ฐ์ํ ์ ์๋ ๋ค์ํ ๋ฌธ์ ๋ฅผ ํฌ๊ดํฉ๋๋ค.
๐ ์ฃผ์ ํ์ ํด๋์ค์ ์์ธ ์ํฉ
- EntityExistsException
- ๋ฐ์ ์ํฉ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฏธ ์กด์ฌํ๋ ์ํฐํฐ๋ฅผ ์ ์ฅํ๋ ค๊ณ ํ ๋ ๋ฐ์ํฉ๋๋ค.
- ์์ : ๋์ผํ ID๋ฅผ ๊ฐ์ง ์ํฐํฐ๋ฅผ persist() ๋ฉ์๋๋ก ์ ์ฅํ๋ ค๊ณ ํ ๋.
- EntityNotFoundException
- ๋ฐ์ ์ํฉ: find() ๋ฉ์๋๋ก ์กฐํํ๋ ค๋ ์ํฐํฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ์ง ์์ ๋ ๋ฐ์ํฉ๋๋ค.
- ์์ : find ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํน์ ID์ ์ํฐํฐ๋ฅผ ์ฐพ์ผ๋ ค๊ณ ํ์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ.
- OptimisticLockException
- ๋ฐ์ ์ํฉ: ๋๊ด์ ์ ๊ธ ์ถฉ๋์ด ๋ฐ์ํ์ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ ๋์์ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๊ฐ์ ์ํฐํฐ๋ฅผ ์์ ํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์์ : ๋ ๊ฐ์ ํธ๋์ญ์ ์ด ๋์ผํ ์ํฐํฐ๋ฅผ ์์ ํ๊ณ ๊ฐ๊ฐ์ ๋ณ๊ฒฝ์ฌํญ์ ์ปค๋ฐํ๋ ค๊ณ ํ ๋.
- RollbackException
- ๋ฐ์ ์ํฉ: ํธ๋์ญ์ ์ ์ปค๋ฐํ๋ ค๊ณ ํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ๋กค๋ฐฑ๋์์ ๋ ๋ฐ์ํฉ๋๋ค.
- ์์ : ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฝ ์กฐ๊ฑด ์๋ฐ ๋ฑ์ผ๋ก ์ธํด ํธ๋์ญ์ ์ปค๋ฐ์ด ์คํจํ ๊ฒฝ์ฐ
- TransactionRequiredException
- ๋ฐ์ ์ํฉ: ํธ๋์ญ์ ์ด ํ์ํ ์์ ์ ํธ๋์ญ์ ์์ด ์ํํ๋ ค๊ณ ํ ๋ ๋ฐ์ํฉ๋๋ค.
- ์์ : ํธ๋์ญ์ ์ด ์๋ ์ํ์์ ์ํฐํฐ๋ฅผ ์ ์ฅ ๋๋ ์ญ์ ํ๋ ค๊ณ ํ ๋.
- NoResultException
- ๋ฐ์ ์ํฉ: ์ฟผ๋ฆฌ ์คํ ๊ฒฐ๊ณผ๊ฐ ์์ ๋ ๋ฐ์ํฉ๋๋ค.
- ์์ : ๋จ์ผ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ํ๋ ์ฟผ๋ฆฌ๊ฐ ์๋ฌด๋ฐ ๊ฒฐ๊ณผ๋ ๋ฐํํ์ง ์์์ ๋
- NonUniqueResultException
- ๋ฐ์ ์ํฉ: ๋จ์ผ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ํ๋ ์ฟผ๋ฆฌ๊ฐ ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ ๋ ๋ฐ์ํฉ๋๋ค.
- ์์ : ๋จ์ผ ๊ฒฐ๊ณผ ์ฟผ๋ฆฌ๊ฐ ๋ ๊ฐ ์ด์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ๊ฒฝ์ฐ.
- PersistenceUnitLoadingException
- ๋ฐ์ ์ํฉ: ์์์ฑ ์ ๋์ ๋ก๋ํ๋ ๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ๋ฐ์ํฉ๋๋ค.
- ์์ : ์๋ชป๋ ์ค์ ์ด๋ ํ์ผ ๋๋ฝ์ผ๋ก ์ธํด ์์์ฑ ์ ๋์ด ๋ก๋๋์ง ์๋ ๊ฒฝ์ฐ.
์ด๋ ๊ฒ ๋ค์ํ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๊ณ PersistenceException์ ๊ธฐ๋ณธ์ ์ผ๋ก RuntimeException์ ์์์ ๋ฐ๊ธฐ์ ๋ฐํ์ ์๋ฌ๋ผ์ ์ฝ๋๋ฅผ ์์ฑํ๋ค ์ค์๋ฅผ ํด๋ ์ปดํ์ผ ํ์์๋ ์๊ธฐ ํ๋ญ๋๋ค. ์ฆ ์ง์ ์ฝ๋๋ฅผ ์คํํด๋ณด๊ณ SemanticException๊ฐ ๋ฐ์ํ๋ฉด ์์ ๋งํ๋ ์์๋๋ก ํ์ธ์ ํด์ฃผ์ ์ผํฉ๋๋ค.
์ ๊ฐ์ ๊ฒฝ์ฐ "could not interpret path expression"์๋ฌ ๋ฉ์์ง์ ๊ฝํ๊ฐ์ง๊ณ 8์๊ฐ๋์ ์ฝ์ง์ ํ์ต๋๋ค.
์์ ์ ๊ฐ ์ ์๋๋ ธ๋ 1. Gradle ์ค์ ํ์ธ, 2. Q ํด๋์ค ์์ฑ ํ์ธ๊น์ง๋ง ํ๊ธฐ์ 8์๊ฐ์ ํ์ธํ์ต๋๋ค.
๋ฑ์๋ฐ์ด ์ด๋ก์ฃ . ์ query๊ฐ ์ ๋ชป ๋์ด์๋ค๋ ์๊ฐ์ ํ์ง ๋ชปํ์ต๋๋ค.
๊ทธ๋ฅ ์ ์๋ฌ๋ฉ์์ง๋ง ๋ณด๊ณ ์ ์ธํ ๋๋ ๊ฒฝ๋ก๊ฐ ์๋ชป๋์ด์ ์๋ฌ๊ฐ ๋จ๋ ๊ตฌ๋ ์ถ์์ต๋๋ค.
๊ทธ๋์ ๊ณต์๋ฌธ์ ๊ฐ์ ํน์ hibernate์ ์ค๋ฅ๊ฐ ์๋๊ฑด ์๋๊น ์ฐพ์๋ณด๊ธฐ๋ ํ๊ณ ์ค์ ๋ก 6.4.x ๋ฒ์ ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ์ฌ ์ฌ๋ฌ๋ฒ์ ์ ๋ฐ๊พธ๊ธฐ๋ ํ๊ณ ์ธํ ์ ๋ค์ ํด๋ณด๊ธฐ๋ ํ๊ณ Qํด๋์ค ์์ฑ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์๋์ง ํ๋ํ๋ ํ์ธ๋ ํ๊ณ ํ ์คํธ ํด๋์ค๋ฅผ ์ฌ๋ฌ๊ฐ ๋ง๋ค์ด๊ฐ๋ฉด ๊ฒฝ์ฐ์ ์๋ฅผ ์ง์ฐ๋ค๊ฐ ๊ฒฐ๊ตญ์๋ ์๋ฒฝ 6์๊น์ง ํด๊ฒฐ ๋ชปํ๊ณ ๋ค์๋ ์ผ์ด๋์๋ง์ ๋ ํด๋ณด๊ณ ํ๋ค๊ณ ์ ์ฌ ๋จน์ผ๋ฉด์ ์๊ฐํด๋ณด์์ต๋๋ค.
"์๋ฌ๋ฉ์์ง ์๊ฐํด๋ณด์ง ๋ง๊ณ ์ ๋ฆฌํด๋ณด์ queryDSL ์ค์ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ํ๊ณ Q ํด๋์ค๋ ์ ์ ๊ฒฝ๋ก์ ์์ฑ๋์์ผ๋ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด ๋ด๊ฐ ์ง๊ธ๊น์ง ํ์ธํ์ง ์์๋ ๋ฐ๋ฐ์ธ ์ฟผ๋ฆฌ๊ฐ ์๋ชป๋๊ฒ ์๋๊น? ํ๊ณ ๋ฐ๋ก ์ฟผ๋ฆฌ์ ๋ถ ์ง์ฐ๊ณ ๋ค์ ์์ฑํ๋๋ฐ ์ ์์ ์ผ๋ก ๋์ํ์ต๋๋ค.
๊ฐ์ฅ ํฐ ์์ธ์ QueryDSL์ ๋ํด ์ ํํ๊ฒ ๋์ ์๋ฆฌ๋ฅผ ์์ง ๋ชปํ๊ณ ์ฌ์ฉํด์ ์ด๊ณ ๋๋ฌด ์๋ฌ ๋ฉ์์ง์๋ง ์ ๊ฒฝ์ ์ฐ๊ธฐ์ ์ฃผ๋ณ ์ํฉ์ ๋ณด์ง ๋ชปํ ์ ์ ์๋ชป์ ๋๋ค.
์ด๋ฒ ์๋ฌ๋ฅผ ๊ณ๊ธฐ๋ก ๋์ผํ ์๋ฌ๊ฐ ๋์จ๋ค๋ฉด ๋ช๋ฐฐ๋ ๋ ๋น ๋ฅด๊ฒ ํด๊ฒฐ ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.
๐ Reference
'๊ฐ๋ฐ > BACKEND' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Data Auditing ์ ์ฉํ๊ธฐ (0) | 2024.07.10 |
---|---|
PK๋ฅผ ์ด๋ป๊ฒ ์ค์ ํ๋ ๊ฒ์ด ์ข์๊น? ๐ค (0) | 2024.07.10 |
[์๋ฌ ํด๊ฒฐ] cannot resolve class or package 'cj' (2) | 2024.07.10 |
java์์ ์ด๋ฏธ์ง ์์ ๋ฐ ์ต์ ํํ๊ธฐ (0) | 2024.07.10 |
spring batch์์ DataSource ๋ถ๋ฆฌ (0) | 2024.07.10 |