인프런 커뮤니티 질문&답변

이찬형님의 프로필 이미지
이찬형

작성한 질문수

실전 jOOQ! Type Safe SQL with Java

R2DBC 환경에서 jOOQ generate 된 Dao를 사용할 수 있는 방법이 있을까요?

해결된 질문

작성

·

727

2

jOOQ generate을 통해서 생성된 Dao를 기반으로 R2DBC 환경에서 테스트를 진행할 때 findAll(), findById() 등 뒤에 fetch()가 붙어서 Blocking 방식으로 DB에 접근하게 되어 있었습니다.

fetch() 코드를 들어가서 확인하였을 때 아래와 같았습니다.

 

    @Blocking
    <E> @NotNull List<E> fetch(RecordMapper<? super R, E> var1) throws DataAccessException;

 

그래서, jOOQ 공식 사이트에서 찾아보았을 때 아래와 같이 reactor fecth()가 가능하다는 것은 확인하였습니다.

https://www.jooq.org/doc/latest/manual/sql-execution/fetching/reactive-fetching/

 

Dao을 적용해서 Reactor 방식으로 진행할 수 있는 방법은 없을까요??

또한, Reactor Fetch 방식으로 실행하였을 때 디버깅 로그가 찍히지 않는 문제가 발생하고 있는데 이것에 대해서도 해결 방법이 있을까요???

Configuration이 적용되지 않는 것 같아서 아래와 같이 설정도 해보았지만 적용되지는 않았습니다.

 
import io.r2dbc.spi.ConnectionFactory;
...

@Configuration
public class JooqConfig {

 public final ConnectionFactory connectionFactory;

 public JooqConfig(ConnectionFactory connectionFactory) {
        this.connectionFactory = connectionFactory;
 }
...
@Bean
public DSLContext jooQDSLContext() {

    DSLContext dsl = DSL.using(connectionFactory).dsl();
    dsl.configuration().set(PerformanceListener::new);
    dsl.settings().withRenderSchema(false);
    return dsl;

}

답변 3

1

설동민님의 프로필 이미지
설동민
지식공유자

답변은 이정도로 충분할것같은데요!

해당 질문은 완료처리하도록 하겠습니다 ㅎㅎ

 

추후에 시도해보신 후기를 정리해서 다른분들에게 공유해보는것도 정말 좋을것같아요!

추가로 궁금한 점이 있으시다면 댓글 달아주시면 답변해드리도록 하겠습니다

감사합니다!

1

설동민님의 프로필 이미지
설동민
지식공유자

이찬형님 안녕하세요.

 

R2DBC 같은 경우는 제한적인 환경에서 사용되기 때문에 이번 강의에서는 다루지 않았는데요.


관련해서 답변드리자면 jOOQ는 공식적으로 R2DBC를 지원하지만,

R2DBC 환경에서는 아직 jOOQ의 모든 기능을 사용 할 수는 없습니다.

 

아래의 R2DBC known limitation 이슈를 확인해주세요.

https://github.com/jOOQ/jOOQ/issues/13590

 

질문을 두가지로 정리해보도록 하겠습니다.

1. R2DBC 환경에서 generated DAO를 통해 Reactor를 사용하기

-> 불가능합니다. 위의 known limitations 이슈에서 나와있듯이 아직 지원되지 않습니다.

추가로 jOOQ 창시자는 DAO 방식에 추가적인 메서드를 넣는것을 좋아하지 않습니다.

앞으로도 안될 가능성이 높고, 된다하더라도 우선순위는 매우 낮을것으로 보입니다. 참고 부탁드립니다.

 

길긴 하지만 Deprecate DAO: 이 이슈와

DAO에 부연설명 추가: 이 이슈를 번역해서 보시면 좋을듯합니다.

 

간략하게 요약하자면

창시자 (lukaseder)는 이 DAO가 새로운 유저들에게 혼란을 주고, 모든걸 generated DAO로만 처리해야한다는 강박관념을 심어주기 때문에 deprecate 하길 원했고, 유저들의 강력한 반대에 이를 철회했습니다.

 

2. Reactor Fetch 방식으로 실행하였을 때 디버깅 로그가 찍히지 않는 문제

-> 이부분도 위의 known limitations 방식에서 ExecuteListener가 R2DBC 환경에서 지원되지 않는다고 명시되었기 때문에, 이에 대한 구현체인 LoggerListener 또한 동작하지 않습니다.

 

대안은 이 글을 참고해서 적용해보시면 좋을듯합니다.

https://blog.jooq.org/jooqs-r2dbc-loggingconnection-to-log-all-sql-statements/

 

그리고 이 이슈를 참고해주세요.

https://github.com/jOOQ/jOOQ/issues/12220

왜 LoggerListener가 리엑티브 환경에서 적용 될 수 없는지 파악 할 수 있을겁니다. 🙂

0

이찬형님의 프로필 이미지
이찬형
질문자

먼저 좋은 답변 감사합니다.

해당 문제에 대해서 제가 접근한 방법 및 생각한 내용에 대해서 공유드립니다.

1. R2DBC 환경에서 Reactor Fetch 방식에서 로그가 찍히지 않는 문제

우선, 저는 execute Listener을 통해서 쿼리에 속도를 측정하는 것이 매우 유용하다고 생각하였으며, 쿼리 로그와 더불어 표시할 수 있는 방법이 없는지 찾아보았으며, 아래의 FrameWork을 찾게 되었습니다.

https://github.com/r2dbc/r2dbc-proxy

해당 FramWork을 통해서 ConnectionFactory을 ProxyConnectionFactory으로 Building하는 방식으로 DB에 통해 전달되는 Query와 속도를 로그로 찍을 수 있기 때문에 사용하였습니다.

2. R2DBC 환경에서 jOOQ 사용 시 성능적 이슈(개인적인 환경 문제일 수도 있습니다.)

R2DBC 환경에서 페이징 처리, 삽입/삭제 등에 대해서는 Database Client을 통해서 Native Query을 실행하는 것과는 속도적으로 크게 차이가 나지 않았습니다.

2만건 이상에 데이터를 조회할 때에는 jOOQ를 이용해서 데이터를 가져오는 것과 Database Client을 통해 데이터를 가져오는 것에 있어서 시간적인 차이가 생겼습니다.

그래서, 시간적으로 차이가 많이나는 조회 쿼리에 대해서는 jOOQ보다 기존 Database Client을 통해서 Native Query로 작업하고 있습니다.

(제가 작업한 환경에 특수성으로 인한 이유일 수도 있으니, 각자 환경에서 테스트 해보신 뒤에 사용하시는 것을 추천드립니다.)

※ 더 좋은 방법을 알고 계신 분이 있으면 공유해주시면 감사하겠습니다.

이찬형님의 프로필 이미지
이찬형

작성한 질문수

질문하기