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

jimin.song3님의 프로필 이미지

작성한 질문수

견고한 결제 시스템 구축

결제 승인 기능 구현

R2DBC 관련해서 질문 드립니다.

24.08.25 18:54 작성

·

71

·

수정됨

0

안녕하세요.

강의 잘 듣고 있습니다.

R2DBC로 실습 환경을 구축해주셨는데요.

 

R2DBC 이용하면서 DatabaseClient 를 이용해주셨는데요.

혹시 Jooq 를 이용안하신 이유가 있을까요?

그리고 실무에서도 DatabaseClient 를 이용하시는지 궁금합니다.

 

추가로 DatabaseClient 를 사용시에 동적 쿼리를 어떻게 작성을 해야 하는지 팁 주시면 감사하겠습니다!
(where 절 고정이 아닌 특정값이 있을 경우에만 where절 생성 이라던지 ㅎ )

 

감사합니다!

답변 3

3

설동민님의 프로필 이미지

2024. 09. 01. 10:55

안녕하세요. 인프런에 jOOQ 강의를 출시한 강사입니다.

다른분들 질문 답변드리다가 이 질문이 보여서 슬쩍... 의견드리고 갑니다.

 

본 강의 강사님의 생각이 다르실 수도 있지만.

 

제가 생각하기엔

  1. jOOQ 자체가 생각보다 잘 알려지지 않은 기술이기 때문에 강의의 내용과 동떨어 질 수 있음

  2. jOOQ는 다른 데이터베이스 접근 기술보다 초기 세팅비용이 큼 (마찬가지로 이때문에 강의의 내용과 멀어질 수 있음)

     

  3. jOOQ도 R2DBC 환경에서 기존 기능의 100%를 지원하지 못함 (이 질문에서도 확인 할 수 있습니다.)

이런 이유 때문에 사용 안하셨을것이라고 조심스럽게 의견드려봅니다. 감사합니다 🙂

0

jimin.song3님의 프로필 이미지
jimin.song3
질문자

2024. 09. 07. 22:57

두분 너무나 친절한 답변 감사합니다.

현재 R2DBC 이용해서 서비스 개발 중에 있습니다. AI 인턴님 답변 주신대로- 동적 쿼리를 만들어 사용 중입니다.

그런데 문자열 보다는 기존 Spring-Web 에서 QueryDSL형식으로 객체를 다뤄서 작업할 수 있는 방법을 찾다가 jOOQ를 알게 되었습니다.

그래서 jOOQ를 도입을 할까 고민을 했어서 드린 질문이였습니다. 그런데 설동민님이 주신 조언으로 100%지원을 안한다는 점을 알게되었네요 ㅎ

두분 모두 감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 08. 27. 18:56

안녕하세요, 인프런 AI 인턴입니다.

jimin.song3님, R2DBC와 jOOQ 관련 질문 주셔서 감사합니다.

우선, jOOQ와 R2DBC는 서로 다른 목적을 가지고 설계된 라이브러리입니다. jOOQ는 Java 코드에서 직접 SQL 쿼리를 작성하지 않고도, 타입 안전성을 제공하며 SQL을 구성할 수 있게 해주는 라이브러리입니다. 반면, R2DBC는 리액티브 프로그래밍 패러다임을 SQL 데이터베이스 작업에 적용하기 위해 만들어진 것으로, 비동기적인 데이터베이스 연결과 통신을 가능하게 합니다.

R2DBC를 사용하여 DatabaseClient를 실습에 사용한 이유는 R2DBC가 리액티브 프로그래밍을 지원하여, Spring WebFlux와 같은 리액티브 스택에서 사용될 경우, 더 효율적이고 비동기적인 데이터 처리가 가능하기 때문입니다. jOOQ를 사용하지 않은 이유는 jOOQ 자체가 리액티브 프로그래밍을 지원하지 않기 때문에, 리액티브 환경에서는 R2DBC가 더 적합할 수 있습니다.

실무에서 DatabaseClient의 사용 여부는 프로젝트의 요구 사항과 개발 환경에 따라 달라집니다. 특히, 리액티브 프로그래밍을 채택한 프로젝트의 경우, R2DBC와 함께 DatabaseClient를 사용하는 것이 일반적입니다.

동적 쿼리를 작성하는 방법으로는, DatabaseClientsql(…) 메소드를 이용해 직접 SQL을 작성하거나, 조건에 따라 SQL 문을 동적으로 구성할 수 있습니다. 예를 들어, 특정 조건에서만 WHERE 절을 추가하려면, 조건을 체크하는 로직을 통해 SQL 문자열을 조건에 따라 다르게 구성할 수 있습니다. 리액티브 스트림즈를 사용하여 동적으로 쿼리 조건을 만들고, 이를 DatabaseClient에 전달하는 방식으로 구현할 수 있습니다.

아래는 DatabaseClient를 이용하여 동적 쿼리를 실행하는 간단한 예시입니다:

import java.util.Map;

import reactor.core.publisher.Flux;

import org.springframework.r2dbc.core.DatabaseClient;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

    private final DatabaseClient databaseClient;

    public MyBean(DatabaseClient databaseClient) {
        this.databaseClient = databaseClient;
    }

    // ...

    public Flux<Map<String, Object>> someMethod(boolean someCondition) {
        String sql = "select * from user";
        if (someCondition) {
            sql += " where condition = true"; // 동적으로 WHERE 절 추가
        }
        return this.databaseClient.sql(sql).fetch().all();
    }

}

이렇게 동적으로 SQL 쿼리를 조합하여 사용할 수 있습니다. 필요에 따라 복잡한 조건과 논리를 적용하여 동적 쿼리를 구성하는 것이 가능합니다.

질문에 대한 답변이 도움이 되셨길 바라며, 더 궁금한 사항이 있으시면 언제든지 질문해 주세요.

감사합니다!