Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TypeScriptとモジュラーモノリスで挑む複雑なWebアプリケーション開発

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 TypeScriptとモジュラーモノリスで挑む複雑なWebアプリケーション開発

Avatar for Katsuma Narisawa

Katsuma Narisawa

July 25, 2023
Tweet

More Decks by Katsuma Narisawa

Other Decks in Programming

Transcript

  1. Katsuma Narisawa 東北大学で自然言語処理 → 株式会社ディー・エヌ・エー → 株式会社ラブグラフ → フリーランス →

    SALESCORE株式会社のCTO 直近はTypeScript, GraphQL, Prisma, Recoil, Turborepoあたりが好き 趣味:食、酒、旅、写真、漫画
  2. どれだけ複雑か? - SALESCOREのデータパイプライン Data Source ELT TRANSFORM DWH BI SHEET

    REVERSE-ETL User SALESFORCE →普通は複数サービスでやることを単一サービスで実現
  3. 実際の設計紹介 - 垂直分割?水平分割? 垂直分割:ドメインごとに分割 水平分割:レイヤーごとに分割 Q. 我々は? A. 世間的にはモジュラーモノリス=垂直分割が一般的? 一般のイメージとはやや異なる設計かも

    特に、複雑なドメインロジックを外に独立させているの がお気に入り どちらでも分割。必要な粒度で分割   +コアロジックを外に抽出 PRESENTATION1 INFRA1 INFRA2 APPLICATION2 MODULE1 MODULE2 PRESENTATION2 DB1 DB2 サービス1 サービス2 なんか複雑な ドメインロジック
  4. 実際の設計紹介 - 構成方法 モジュールごとにpackage.jsonを定義 mainにindex.tsを指定 index.tsにexportしたい関数を書く → モジュール外にexportしたくない関数はexportされ ない(カプセル化) →

    これが地味に良い。関数名を長くしなくて良い ドメインロジックのモジュールは依存 パッケージはほぼなし。ピュアな関数で 構成。
  5. 実際やってみてどうか - 悪かったところ ・buildとlint のパフォーマンスが悪い  主目的のためにはYarn Workspaceを使ったモジュール構成の必然性はそこまでないの で eslint-plugin-import-access を使う構成に変更を検討中

    ・初期構築の難易度が多少高い ・新規メンバーのキャッチアップには、良くも悪くもあまり影響していない…? (全体像を整理したくなるくらいのドメイン理解度がないと、モノリスと同じ?) 「モノレポ」の恩恵は大きい。コードジャンプしていくだけで全部把握できる (=マイクロサービスだと受けづらい恩恵)
  6. Appendix - 技術スタックの変遷 2019- Rails, Nuxt.jsで開発。2週間でMVPを作った。週0.5くらいで開発していた時代 2021- フルコミット開始。Next.js + Node.js

    (Nexus) に移行。    初期はフロントエンド・バックエンドをリポジトリ分割。    それぞれTypeScript Project Referencesを使ったモジュール構成 2022- Turborepoを使ったモノレポ・モジュラーモノリスに移行 2023春 二人目のエンジニア、PdM、デザイナーがジョイン!    (逆に、ここまでずっと一人開発)