본래 Hibernate 에서 생성해주는 쿼리 메소드만 사용해본터라 DTO Projection , JPQL 이 정확히 뭔지 모른채 살아왔습니다.
이번에 Kotlin Jdsl 이란 쿼리 빌더 기술을 사용하게 되면서 평소의 부족한 지식을 채우고자 글을 적습니다.
Entity 에서 특정 필드를 선택해 Custom class 또는 Data class에 직접 매핑할 수 있는 방식입니다.
즉, 모든 필드가 필요하진 않고 특정 필드만 필요할 시 사용하면 유용할 수 있습니다.
data class AuthorDto(val id: Long, val name: String)
val authors = queryFactory.listQuery<AuthorDto> {
select(
path(Author::id),
path(Author::name)
)
from(entity(Author::class))
}
DB 에 특정되지 않는 객체지향형 쿼리 언어이며 이는 JPA 스펙의 일부입니다.
단순한 언어이며 이를 이용해 Type-safe 같은 장점을 얻을 수 있습니다.
아래 예시를 보면 알 수 있듯
// JPQL
SELECT a.authorId
FROM Author a
JOIN BookAuthor ba ON a.authorId = ba.authorId
GROUP BY a.authorId
ORDER BY COUNT(a.authorId) DESC
// Kotlin JDSL 로 작성한 JPQL
val query = jpql {
select(
path(Author::authorId),
).from(
entity(Author::class),
join(BookAuthor::class).on(path(Author::authorId).equal(path(BookAuthor::authorId))),
).groupBy(
path(Author::authorId),
).orderBy(
count(Author::authorId).desc(),
)
}
정의를 보면 알 수 있는데 둘은 상반된 개념이 아닙니다. DTO Projection 은 쿼리 결과 매핑 방식이고 JQPL 은 SQL 을 추상화한 개념으로 볼 수 있습니다.
Kotlin Jdsl 을 공부하다 생각나 쓴 글이니 이와 관련된 한 마디로 정리하고 끝내겠습니다.
Kotlin Jdsl 을 가지고 Type-safe 하게 JPQL 을 작성할 수 있습니다! 왜 JPQL 이냐하면 DB 마다 다를 수 있는 SQL 대신 추상화된 쿼리 언어이기 때문인 것 같습니다!
(꼭 JPQL 만 만드는 건 아닌것 같습니다. 이후 공부하게 된다면 또 정리하겠습니다.)
https://kotlin-jdsl.gitbook.io/docs/v/ko-1/faq/how-do-i-use-kotlin-value-class
https://stackoverflow.com/questions/54848250/what-should-i-prefer-using-jpa-pure-sql-or-jpql-and-how-to-create-delete-table
https://ittrue.tistory.com/270
https://sun-22.tistory.com/78