티스토리 뷰

728x90
반응형

목차

     

    지금 진행하고 있는 과제전형에서 웹플럭스+R2DBC+MySQL을 이용해 프로젝트를 구성하게 되었다.

     

    리액티브한 디비는 몽고만 써본 터라 초기 설정에 아주 조금 시간이 소요되었는데,

     

    결론부터 말하자면 리액티브 몽고 디비에 비해 R2DBC는 다소 허접하고 덜 만들어진 느낌을 지울 수가 없었다.

     

    그래도 좋아지겠지.. 하며 내가 구성해둔 기본의 기본 설정을 기록.

     

    R2DBC

     

    R2DBC는 Reactive Relational Database Connectivity의 약자로,

     

    리액티브 프로그래밍 모델을 기반으로 한 관계형 데이터베이스 연결을 제공하는 라이브러리이다.

     

    2018년 5월에 처음 공개되었으며, 기존의 JDBC 방식으로 접근 가능하면서도 비동기/논블로킹을 지원한다는 장점이 있다.

     

    따라서 당연히 고성능, (실시간) 대규모 처리, 리소스의 효율적 사용과 같은 특징을 보유하고 있으며

     

    역시 당연히 Reactive Streams 스펙을 따르고, Spring Data R2DBC와 같은 프레임워크가 나와있으며,

     

    PostgreSQL, MySQL, Microsoft SQL Server, H2, Oracle과 같은 다양한 디비를 지원하고 있다.

     

    하지만 아직 위키에도 문서가 없는 상황이라, 관련 정보를 얻으려면 품을 조금 더 팔아야 한다.

     

    장점은 위에 적혀있으니 단점을 먼저 짧게 나열하면 아래와 같다.

     

    • 새로운 기술이라 성숙도가 낮고 레퍼런스가 적다.
    • 역시 새로운 기술이라 기존 JDBC와는 동작 방식이 달라 학습에 시간이 필요하다.
    • 비동기, 리액티브 프로그래밍에 익숙해야 한다.

    추가로, JDBC에는 있지만 R2DBC에 없는 기능도 정리하고 가자.

     

    • Lazy Loading
      지연로딩은 기본적으로 객체가 실제 필요한 순간까지 데이터를 불러오지 않는 방식이다.
      이는 디비 쿼리 실행 시점을 최대한 뒤로 미루기 때문에 성능 향상에 도움이 된다.
      하지만 R2DBC는 애초에 비동기적인 방식으로 데이터를 처리하기 때문에 지연로딩 없이도
      쿼리 실행시점을 뒤로 미루며 비동기 상호작용이 가능하다.
      따라서 지연로딩이 필요가 없기 때문에 지원하지 않는다.
    • Persistence Context
      영속성 컨텍스트는 JPA에서 제공하는 기능으로, 쉽게 말하면 엔티티 객체를 메모리에 보관하는 방식으로
      디비와의 상호작용을 관리해 주는 역할을 한다. 따라서 디비와 연동 시 직접 쿼리를 날리는 것이 아니라
      객체의 상태를 추적한 뒤에 쿼리를 실행해 주는데, 이 덕분에 디비와 객체 사이의 매핑을 직접 관리하지 않아도 된다.
      그러나 리액티브 스트림을 이용한 비동기 처리방식은 디비와 직접 상호작용하기 때문에 객체를 메모리에 저장하는 것이 불가능하다.
      하지만 실제로 사용할 때는 ReactiveCrudRepository 인터페이스가 있어 체감하지 못했다.
    • Batch
      배치 작업이란 대량의 데이터를 모아서 한 번에 처리하는 방식을 가리킨다.
      그러나 R2DBC는 리액티브 스트림을 통해 비동기 처리를 하기 때문에 배치 작업을 지원하지 않는다.
      모노, 플럭스와 같은 리액티브 스트림이 이미 비동기 방식으로 대량의 데이터를 처리할 수 있기 때문이다.
    • Cache
      R2DBC에선 JPA와 다르게 기본적으로 캐싱을 지원하지 않는다.
      캐시를 사용하려면 다른 라이브러리를 사용하거나 Redis와 같은 외부 캐시 서버를 따로 사용해야 한다.

    Basic Configuration

     

    설정에 앞서, 당연하게도 이 설정들 전에 MySQL 서버가 켜져 있고, 포트 번호는 3306이어야 한다.

     

    서버를 다운로드하여 실행시키는 법은 생략. 여기서는 웹플럭스 프로젝트 내에 작성한 설정만 추가한다.

     

    먼저 build.gradle의 의존성 설정이다.

    dependencies {
    	implementation 'org.springframework.boot:spring-boot-starter-webflux'
    	implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'
    	implementation "com.github.jasync-sql:jasync-r2dbc-mysql:2.1.24"
    }

    웹플럭스와 R2DBC, MySQL 의존성이 추가된 것을 확인할 수 있다.

     

    계속해서 application.yml이다.

    spring:
      r2dbc:
        enabled: true
        url: r2dbc:mysql://localhost:3306/mydatabase
        username: root
        password: MyNewPassword!123
        pool:
          enabled: true
          max-size: 20

    MySQL 연결 설정과 데이터베이스 연결 풀 설정을 확인할 수 있다.

     

    여기까지만 해줘도 따로 연결 팩토리를 생성할 필요 없이 알아서 처리해 준다.

     

    다만, 기존 JPA와는 DDL 사용 방식이 조금 다른데, 나는 소규모로 하는 거라서

     

    그냥 디비에 쿼리를 입력해서 테이블을 생성해 주었다.

     

    이어서 config 클래스.

    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.r2dbc.config.EnableR2dbcAuditing;
    
    @Configuration
    @EnableR2dbcAuditing
    class R2dbcConfig {
    }

    위 클래스는 오로지 R2dbcAuditing, 즉 생성 일시와 수정 일시를 자동으로 추가하기 위해 작성했다.

     

    필요 없다면 이 클래스도 일단은 없어도 된다.

     

    마지막으로 레포지토리 인터페이스.

    import org.springframework.data.repository.reactive.ReactiveCrudRepository;
    
    import assignment.chatbot.entity.Message;
    
    public interface MessageRepository extends ReactiveCrudRepository<Message, Long> {
    }

    JPA를 사용할 때와 다른 점이 없다.

     

    실제로 복잡한 쿼리를 날리게 되면 상황이 다를 수 있지만,

     

    기본적으로 JPA에서 지원하는 메서드 이름 기반 쿼리도 작동하는 것 같았다.

     

    R2DBC가 앞으로 어쩔 수 없는 대세가 될지 아닐지는 모르겠지만,

     

    일단 아주 기초적인 설정과 사용법을 익히는 데 성공했다.

     

    리액티브 몽고 디비가 그립지만..

     

    R2DBC에 대해 업데이트할 기회가 계속 있으면 좋겠다!

    반응형

    'Development > Database' 카테고리의 다른 글

    [Database]NoSQL(mongoDB)에서 1:N, N:M 구현  (0) 2023.07.09
    [Database]mongoDB의 '_id', 또는 auto-increment ID  (0) 2023.07.03
    [Database]MariaDB  (0) 2023.05.10
    [Database]SQLite  (0) 2023.04.07
    [Database]mongoDB 튜토리얼  (0) 2023.04.03
    [Database]B+Tree, B*Tree  (0) 2023.03.26
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/05   »
    1 2 3 4
    5 6 7 8 9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31
    글 보관함