현재 블로그는 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를 하려면 아직 기다려야한다... 이 글 번역해보자. 번역이 없네,

일단 본문 요약은

  1. Reactive Programming은 scalibility와 stability에 좋다.
    • event-driven non-blocking functional pipeline을 통해서 요청을 처리하기 때문에
  2. 위 장점은 애플리케이션의 모든 스택이 reactive해야 누릴 수 있다.
    • 여기서 RDB가 문제가 됨.
  3. 아직 표준화된 비동기 RDB API가 없다.
  4. 오라클이 제안한 ADBA가 있음.
  5. Postgres ADBA driver가 있긴 한데...
  6. ADBA가 언제 쓸만해질지 기약할 수 없음.
  7. Pivotal에서 만드는 R2DBC가 있다.
  8. 표준 API와 구현체가 없는 마당에 기약없이 기다리기보다 직접 만듦
  9. 공식적으로 PostgreSQL, H2, Microsoft SQL Server를 지원함
  10. MySQL도 지원할 계획이 있음.
  11. 비공식적으로 구현한 r2dbc-mysql 구현체가 있음.
  12. 스프링에서 R2DBC를 사용할 수 있도록 Spring Data R2DBC라는 프로젝트도 시작함.
  13. Fibers 위에 JDBC를 올린다.
  14. Fibers는 blocking-api를 non-blocking으로 바꿔주는 light-weight abstraction임.
  15. 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.
  16. 결론
  17. Fibers위에 JDBC를 올리는 작업은 아직 미완성이지만, potential game changer임.
  18. ADBA는 현재 스케쥴이 따르면 Java 17, 2021년쯤 자바 표준 런타임에 포함될 것.
  19. 당장 시도해볼 수 있는 것은 R2DBC다.

댓글중에 rxjava2-jdbc 언급이 나왔다. 하지만 이 라이브러리는 jdbc의 wrapper일 뿐. jdbc call을 할 때마다 새로운 스레드를 생성해서 blocking 작업을 처리함. 그러나 매번 jdbc call할 때마다 새로운 스레드를 생성하므로 결국 jdbc를 직접 사용할 때와 같은문제에 봉착한다. R2DBC(혹은 Fibers) 말고는 답이 없음.

spring-webflux, spring-r2dbc, r2dbc-mysql를 사용하면 RDB를 NIO로 처리할 수 있다. 이걸로 한 번 해보자. kotlin까지.