현재 블로그는 nodejs 풀스택으로 구현되어있다. 프론트는 Next.js로, 백엔드는 InversifyJS를 사용해서 만들었고, 이 둘을 하나의 node위에서 돌리고 있다. 하나의 node위에서 모든걸 처리함에도 불구하고 프론트엔드와 백엔드가 통신할 때는 http request를 사용한다. 즉 이 둘은 node 코드상에서 결합되어있지 않기 때문에 백엔드를 통째로 들어내어 다른 구현체로 갈아끼울 수 있다.
node로 어느정도 끝장을 본 것 같으니, 이제 spring-webflux를 사용해서 NIO(non-blocking input and output)로 구현해봐야겠다(node의 mysql driver는 이미 NIO네...). github에 버전 태깅해놓고 백엔드 구현체를 바꿔보자~~ 그 전에 node에 프론트와 백엔드를 한꺼번에 돌리기 위한 프로젝트 구성을 정리하자 꼭. 나만의 node 풀스택 규칙 정리하기...
https://spring.io/blog/2018/12/07/reactive-programming-and-relational-databases
이 글을 보니까 java에서 RDB로 NIO를 하려면 아직 기다려야한다... 이 글 번역해보자. 번역이 없네,
일단 본문 요약은
- Reactive Programming은 scalibility와 stability에 좋다.
- event-driven non-blocking functional pipeline을 통해서 요청을 처리하기 때문에
- 위 장점은 애플리케이션의 모든 스택이 reactive해야 누릴 수 있다.
- 여기서 RDB가 문제가 됨.
- 아직 표준화된 비동기 RDB API가 없다.
- 오라클이 제안한 ADBA가 있음.
- Postgres ADBA driver가 있긴 한데...
- ADBA가 언제 쓸만해질지 기약할 수 없음.
- Pivotal에서 만드는 R2DBC가 있다.
- 표준 API와 구현체가 없는 마당에 기약없이 기다리기보다 직접 만듦
- 공식적으로 PostgreSQL, H2, Microsoft SQL Server를 지원함
- MySQL도 지원할 계획이 있음.
- 비공식적으로 구현한 r2dbc-mysql 구현체가 있음.
- 스프링에서 R2DBC를 사용할 수 있도록 Spring Data R2DBC라는 프로젝트도 시작함.
- Fibers 위에 JDBC를 올린다.
- Fibers는 blocking-api를 non-blocking으로 바꿔주는 light-weight abstraction임.
- This is possible by stack switching as soon as an invocation hits a blocking API. So the underlying Fiber attempts to continue on a previous flow that was using a blocking API.
- 결론
- Fibers위에 JDBC를 올리는 작업은 아직 미완성이지만, potential game changer임.
- ADBA는 현재 스케쥴이 따르면 Java 17, 2021년쯤 자바 표준 런타임에 포함될 것.
- 당장 시도해볼 수 있는 것은 R2DBC다.
댓글중에 rxjava2-jdbc 언급이 나왔다. 하지만 이 라이브러리는 jdbc의 wrapper일 뿐. jdbc call을 할 때마다 새로운 스레드를 생성해서 blocking 작업을 처리함. 그러나 매번 jdbc call할 때마다 새로운 스레드를 생성하므로 결국 jdbc를 직접 사용할 때와 같은문제에 봉착한다. R2DBC(혹은 Fibers) 말고는 답이 없음.
spring-webflux, spring-r2dbc, r2dbc-mysql를 사용하면 RDB를 NIO로 처리할 수 있다. 이걸로 한 번 해보자. kotlin까지.