Skip to content

Support Reactive JPA

Hyunsik Kang edited this page Jan 13, 2022 · 5 revisions

Please refer to #24 issue

Background

Kotlin JDSL is a query DSL library built on the JPA standard. Kotlin JDSL uses the JPA specification to ensure reliability of query generation results.

Currently, there is no Reactive JPA standard in place. Since there is no Reactive JPA standard, there is also no Reactive interface on which Kotlin JDSL is based.

Strategies for Reactive Kotlin JDSL Implementation

There are 3 ways to support Reactive Kotlin JDSL.

  1. Reactive specification is not supported until Reactive JPA specification is defined.
  2. Based on the Reactive interface defined by Hibernate, define the Reactive interface of Kotlin JDSL.
  3. A Reactive interface is provided for each Reactive implementation.

Reactive specification is not supported until Reactive JPA specification is defined.

There is currently no discussion of the Reactive JPA standard.

We don't know when the standard will be enacted, so there's no guarantee when we'll be able to support Reactive JPA.

Defines the reactive interface of Kotlin JDSL based on the reactive interface defined by Hibernate.

Hibernate is a major contributor to JPA and is also the most used JPA implementation.

The Reactive specification defined by Hibnerate is also likely to be established as a Reactive JPA standard.

Therefore, defining the Reactive interface of Kotlin JDSL based on this can provide the interface as a de facto standard.

Reactive interface is provided for each reactive implementation.

Each JPA implementation may support the reactive interface differently.

In this case, we will not be able to tie each JPA implementation together with a common interface.

So, if there is no clarity about the common interface, it may be efficient to support each implementation.

Reactive JPA support direction

Kotlin JDSL decided to write its own Reactive interface with Hibnerate Reactive interface.

The reason is that among the current JPA implementations, Hibernate's usage rate is overwhelmingly high, and we do not have any disagreement with the interface defined by Hibernate.

Google Trend

core and reactive-core

We decided to provide two core interfaces, core and reactive-core.

core provides a synchronous JPA interface.

  • QueryFactory
  • TypedQuery

reactive-core provides an asynchronous JPA interface.

  • ReactiveQueryFactory
  • ReactiveTypedQuery

Each JPA implementation can implement only core or both core and reactive-core.

Common Module

We can have code that is used in both core and reactive-core.

An example is CriteriaQuery.

Commonly used code is extracted into common modules, separating modules for selective use by the core and reactive core.

-- korean

#24 이슈를 참고해주세요

Background

Kotlin JDSL은 JPA 표준을 바탕으로 작성된 쿼리 DSL 라이브러리입니다. Kotlin JDSL은 JPA 스펙을 이용하여 쿼리 생성 결과물에 대한 신뢰성을 가져가고 있습니다.

현재 Reactive JPA 표준은 제정되어 있지 않습니다. Reactive JPA 표준이 없기 때문에 Kotlin JDSL의 바탕이 될 Reactive 인터페이스 또한 존재하지 않습니다.

Reactive Kotlin JDSL 구현에 대한 전략

Reactive Kotlin JDSL 지원을 위해 3가지 방안이 존재합니다.

  1. Reactive JPA 스펙이 정의될 때 까지 Reactive 스펙을 지원하지 않는다.
  2. Hibernate가 정의한 Reactive 인터페이스를 바탕으로 Kotlin JDSL의 Reactive 인터페이스를 정의한다.
  3. 각 Reactive 구현체 별로 Reactive 인터페이스를 제공한다.

Reactive JPA 스펙이 정의될 때 까지 Reactive 스펙을 지원하지 않는다.

현재 Reactive JPA 표준에 대한 논의는 아직 진행되지 않고 있습니다.

언제 표준이 제정 될지 모르기 때문에 언제 Reactive JPA를 지원할 수 있을지 기약 없습니다.

Hibernate가 정의한 Reactive 인터페이스를 바탕으로 Kotlin JDSL의 Reactive 인터페이스를 정의한다.

Hibernate는 JPA의 큰 기여자로 가장 많이 사용되고 있는 JPA 구현체이기도 합니다.

Hibnerate가 정의한 Reactive 스펙 또한 Reactive JPA 표준으로 제정될 가능성이 높습니다.

그렇기 때문에 이를 기반으로 Kotlin JDSL의 Reactive 인터페이스를 정의하면 사실상 표준으로서 인터페이스를 제공할 수 있습니다.

각 Reactive 구현체 별로 Reactive 인터페이스를 제공한다.

각 JPA 구현체 별로 Reactive 인터페이스의 지원 방식이 다를 수 있습니다.

이 경우 저희는 공통 인터페이스로 각 JPA 구현체들을 묶을 수 없게 됩니다.

그래서 공통 인터페이스에 대한 명확성이 없다면 각 구현체 별로 지원하는 방법이 효율적일 수 있습니다.

Reactive JPA 지원 방향

Kotlin JDSL은 Hibnerate Reactive 인터페이스로 자체 Reactive 인터페이스를 작성하기로 결정했습니다.

이유는 현재 JPA 구현체 중 Hibernate의 사용율이 압도적으로 높고 우리는 Hibernate가 정의한 인터페이스에 이견이 없기 때문입니다. Google Trend

core and reactive-core

저희는 core 와 reactive-core 두 가지 core 인터페이스를 제공하기로 결정했습니다.

core는 동기 방식의 JPA 인터페이스를 제공합니다.

  • QueryFactory
  • TypedQuery

reactive-core는 비동기 방식의 JPA 인터페이스를 제공합니다.

  • ReactiveQueryFactory
  • ReativeTypedQuery

각 JPA 구현체는 core만 구현하거나 core와 reactive-core 두 가지 모두 구현할 수 있습니다.

Common Module

core와 reactive-core 두 곳에서 같이 사용되는 코드가 있을 수 있습니다.

CriteriaQuery를 그 예로 들 수 있습니다.

공통적으로 사용되는 코드는 공통 모듈로 추출하여 core 및 reactive core가 선택적으로 사용할 수 있도록 모듈을 분리합니다.