brunch

You can make anything
by writing

C.S.Lewis

by 에디의 기술블로그 Apr 13. 2019

[스터디]R2DBC

R2DBC 를 사용해서 RDMBS 리액티브 프로그래밍 구축

R2DBC는, Reactive Relational Database Connectivity 의 약자로 RDBMS 리액티브 프로그래밍을 가능하게 하는 Pivotal 에서 만들고 있는 라이브러리이다. 현재 정식 버전은 출시가 아직 되지 않았지만, 리액티브 프로그래밍에 대한 관심으로 인해서, 필자는 빠르게 검토를 진행하였다. Spring Data R2DBC 를 사용하면, R2DBC 를 쉽게 연동할 수 있기 때문에 Spring Data 프로젝트를 같이 사용하였다. 참고로, R2DBC 는 2019년4월 기준으로 1.0.0.M7 버전까지 출시되었다. 조만간 정식 출시가 된다 해도 당장 쓰기에는 조금 조심스럽다. 올해 하반기쯤 되어야 신규 프로젝트에서 도입을 해볼만 할 것으로 예상된다. 새로 개발중인 오픈소스 답게 레퍼런스 문서는 거의 없는 상황이다.


레퍼런스


https://github.com/r2dbc/

https://r2dbc.io/

https://docs.spring.io/spring-data/r2dbc/docs/1.0.0.M1/reference/html/

https://www.youtube.com/watch?v=idApf9DMdfk



R2DBC


R2DBC는, Reactive Relational Database Connectivity 의 약자로 RDBMS 리액티브 프로그래밍을 가능하게 하는 Pivotal 에서 만들고 있는 라이브러리이다. R2DBC는 현재(2019년4월11일) 기준으로 H2, MS-SQL, PostgreSQL 를 지원한다.


공식적으로 R2DBC  에서 MySQL를 지원하고 있지는 않지만, Jasync SQL를 사용하면 R2DBC를 연동할 수 있다. "조쉬 롱"의 동영상을 참고하길 바란다.

https://spring.io/blog/2019/03/20/spring-tips-reactive-mysql-support-with-jasync-sql-and-r2dbc


R2DBC에서 MySQL를 공식적으로 지원해주는 날이 오기를 기대해본다. 어쩃든 필자는 익숙한 MySQL를 사용하지 않고, 부득이하게 PostgreSQL 로 테스트를 진행하였다. PostgreSQL은 처음 설치해본다. 아주 간단한 coffees 라는 이름의 테이블을 생성하였다.



Spring Data R2DBC


이 글은 R2DBC 를 Spring Data 프로젝트로 연동해서 소개하는 글이다. 또한, Spring Boot 2.1.4.RELEASE 버전으로 진행한다. 아래와 같이 플러그인을 추가한다.

디펜던시에 Spring Data R2DBC 와 r2dbc-postgresql 를 추가해준다. R2DBC가 아직 마일스톤 버전이기 때문에, milestone 레파지토리를 지정해야 한다.


[주의]

R2DBC 는 아직 마일스톤 버전이다. 실무에서는 아직 사용하지 말자!!



Congiguration

데이터베이스 ConnectionFactory 를 정의한다. 필자는 PostgreSQL를 사용하기 때문에 PostgresqlConnectionFactory 를 생성한다.



Entity

엔티티를 정의해주자. 필자는 coffees 라는 테이블을 미리 만들어놨다. Lombok @Data 어노테이션을 사용했다. (참고로 업무에서는 Data 어노테이션은 잘 안쓰기는 하다. )



Repository

ReactiveCrudRepository를 구현하는 Repository 를 정의한다. 필자는 findByName이라는 메서드를 작성하였다.

@Query 어노테이션을 사용해서 SQL 쿼리문을 직접 작성하였다. Spring Data R2DBC 에서는 findByName 같이 쿼리문 작성 없이 바로 사용 가능한 메서드 자동 추론(??) 기능은 제공이 되지 않는 것으로 보인다. Spring Data R2DBC 의 ReactiveCrudRepository 에서 지원하는 메서드는 아래와 같다.


Spring Data JPA에서 지원해주는 findByName,findByNameOrder 같은 메서드 자동 생성은 아직 지원을 하지 않는데, 지원해주면 편할거 같기는 하다.


Service

샘플 코드라서 서비스 레이어는 따로 만들지 않겠다... 신규 데이터 Insert는 아래와 같이 작성할 수 있다.

참고로, Reactor를 사용하기 때문에, subscribe()를 실행해야 실제로 데이터가 저장 된다. Reactor 에 대해서 궁금하다면 필자의 글을 참고하길 바란다.

https://brunch.co.kr/magazine/reactor

데이터 Select 는 아래와 같이 작성할 수 있다.


스프링 프로젝트를 한번이라도 해본 개발자라면, 이 글은 너무 쉽게 느껴질 것이다. 지금까지는, ReactiveCrudRepository 를 상속받아 구현했다.


자 이제...

ReactiveCrudRepository 를 사용하지 않고, DatabaseClient 를 주입받아서 사용해보자.


DatabaseClient

별거 없다. 주입하고 그냥 사용하면 된다.

DatabaseClient 에서는 아래와 같은 메서드를 제공한다.


execute

select

insert

등등.. 자세한 내용은 생략한다.


execute 를 사용하면 아래와 같이, 쿼리문을 직접 작성하면 된다.

select()를 사용하면, 아래와 같이 작성하면 된다.



마무리


R2DBC 가 정식 출시되면 RDBMS 프로젝트에서도 리액티브 프로그래밍을 제대로 할 수 있겠다는 기대감이 있다. 이정도로 마무리하고 글을 마치겠다. 샘플코드 및 레퍼런스는 아래 링크를 참고하길 바란다.


https://github.com/sieunkr/spring-data/tree/master/spring-data-r2dbc


매거진의 이전글 Reactor 6. Data Processing
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari