inflearn logo
강의

講義

知識共有

本当のjOOQ! Type Safe SQL with Java

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

解決済みの質問

1243

tussle

投稿した質問数 1

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;

}

java sql spring-boot jooq dsl

回答 3

1

sdm32851630

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

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

 

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

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

감사합니다!

1

sdm32851630

이찬형님 안녕하세요.

 

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

tussle

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

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

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로 작업하고 있습니다.

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

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

안녕하세요 FetchGroups에서 Multiset방식 사용하면 어떤가 해서 물어봅니다

0

60

1

monosoul jooq plugin-docker registry 변경

1

101

3

질문) jOOQ 프로젝트에서 CI/CD 자동화 문의

1

173

3

generate dao 를 통한 삽입 시 pk auto-increment 가 적용되지 않습니다

1

109

1

jooq+flyway에서 질문드립니다

0

249

2

안녕하세요 생성일,생성자,수정일,수정자는 자동으로 해주는 기능이 있을까요?

0

206

2

[사례] Maven에서 TestContainers 플러그인 적용시 예외발생

0

142

0

Routines 관련 질문

1

159

2

JOOQ 환경설정 중에 db 패스워드 관련 질문입니다.

1

173

1

Sakila DB 도커 컴포즈 구성 시 팁

1

152

1

DB 벤더별 내장함수에 대한 방언 지원 듣고 질문드려요

1

176

1

인텔리제이 테마 질문

2

423

3

kotlin jOOQ , 컴파일시 힙메모리 부족

0

523

2

pojo 에 setter 가 없는 경우가 있을까요?

1

189

1

FilmWithActor로 fetch 시 select와 생성자의 매개변수 순서가 다를 경우 map이 정상적으로 이루어 지지않는 케이스

1

228

1

from절 subquery table filed nullable 처리

1

221

1

kotlin mapping error

0

517

4

db column은 not null로 되어 있는데 kotlin에서 pojo가 다 nullable로 생성되요.

0

514

1

하나의 디비를 여러 백엔드 서버가 필요로 할 때, flyway 관리

1

887

5

dslContext 작성 시 fetchGroups 이렇게 작성해도 될까요?

2

638

6

update with dto 질문

1

267

1

IDE로 스프링부트 실행없이 jooq로 짠 쿼리 결과를 바로 확인하는 방법이 있을까요?

1

502

1

build.gradle.kts

3

755

2

마리아 DB 쓰시는분들은 mysql 파일 쓰시면됩니다.

1

371

1