NestJS meetup Online #3にて、atama plus・WEBエンジニアの久米が登壇しました。
▼開発チームの情報発信リンク集 https://linktr.ee/atama_plus_dev
新プロダクト開発でNestJSを導⼊してみたWataru Kume / kumewata2022.07.22
View Slide
⾃⼰紹介atama plus株式会社Product EngineerNestJS歴 1年弱とり@wataridori_kすき:バスケ、カレー、Podcast、クラフトビール、将棋W a t a r u K u m e /K u m e w a t a2
atama plus
ⓒ 2022 atama plus Inc.atama plusのミッション4新プロダクト開発でNestJSを導⼊してみた「基礎学⼒」の習得「基礎学⼒」の習得 「社会でいきる⼒」の習得学習を⼀⼈ひとり最適化し、「基礎学⼒」を最短で⾝につけ、そのぶん増える時間で、「社会でいきる⼒」を伸ばす。そんな新しい学びを数億⼈の⽣徒に届け、社会のまんなかから変えていきます。
ⓒ 2022 atama plus Inc.アジェンダ• atama plusの技術背景• プロダクト背景• 選定⽅針• 採⽤スタック• 採⽤理由と使ってみて• よかったこと• 苦労したこと• 全体のふりかえり5新プロダクト開発でNestJSを導⼊してみた
ⓒ 2022 atama plus Inc.atama plusの技術背景:プロダクトと採⽤技術6新プロダクト開発でNestJSを導⼊してみた安定感や開発スピードを重視した開発環境を構築しています。事業や開発組織の変化に合わせて、適宜最適化します。技術選定のコンセプトWebエンジニア全員が、アプリとサーバの両⽅に携わる体制に適している安定感や開発スピードを重視し、よいプロダクトを早く届けるのに適しているContents ⼊稿ツール*Tools & Services*atama+の教材コンテンツは、⼊稿ツールを含め全て⾃社で開発しています。React SPA の技術選定で考えたことCasefrontendbackendData/Infra→※刷新中オンライン模試**atama+ / atama+COACHatama+ PORTALCloud Functions
ⓒ 2022 atama plus Inc.プロダクト背景• 検証のため、短期間でクイックに体験を提供する必要がある。• 既存の複数プロダクト(atama+、オンライン模試)の体験を⼀つのアプリ上で提供する。• 詳しくはzennにて• 連載:「学⼒の測定」と「学習」をつなぐプロダクトのリリースにむけてやってきたこと7新プロダクト開発でNestJSを導⼊してみた
ⓒ 2022 atama plus Inc.選定⽅針• 体験上のメリットによりフロントはReact / TypeScriptを選定済み。• チームメンバーがフロント / バック両⽅を担当するため、⾔語を統⼀するとスイッチングコストを抑えられそう(TypeScriptは普段から利⽤している)。• Djangoのようなフルスタックのフレームワークに乗りたい。• ノウハウのあるRESTful APIにしつつ、型安全なクライアントを使いたい。• チームメンバーが気持ちよく開発できるか。8新プロダクト開発でNestJSを導⼊してみた
ⓒ 2022 atama plus Inc.採⽤スタック:こうなった• フレームワーク / ⾔語• NestJS / TypeScript• ORM• TypeORM• API連携• OpenAPI + aspida• (おまけ)管理画⾯• nestjs-tsx-views + ???9新プロダクト開発でNestJSを導⼊してみた
ⓒ 2022 atama plus Inc.採⽤理由と使ってみて:フレームワーク / ⾔語 →NestJS / TypeScript• 採⽤理由• 選定⽅針ベースで触ってみて、ニーズをひと通り満たしていた。• よかったこと• Nodeのベストプラクティスに添いやすい• “Tao of Node - Design, Architecture & Best Practices” ⽇本語翻訳• ドキュメントが充実していて、アクセシビリティも良い。• DIと依存モジュールの明⽂化はやはり便利• TypeScriptなこともあり、コードの再構成(モジュールの切り出しや移動)がかなりスムーズ10新プロダクト開発でNestJSを導⼊してみた
ⓒ 2022 atama plus Inc.採⽤理由と使ってみて:フレームワーク / ⾔語 →NestJS / TypeScript• 苦労したこと• 学習コストがチョット⾼いカモシレナイ• デコレーター祭になりがち(OpenAPI、validator、etc.)• モジュールが増えてくると依存関係が複雑になり、管理が⼤変• 次プロダクトでdependency-cruiserを試し中• ドキュメントが⼀部カタログ的、もう少し踏み⼊った事例も知りたい場合のリソースはあまり多くない。• 気になり• 今回エンジンには枯れているexpressを採⽤したけど、fastifyはどうなんだろう?11新プロダクト開発でNestJSを導⼊してみた
ⓒ 2022 atama plus Inc.採⽤理由と使ってみて:ORM→TypeORM• 採⽤理由• 利⽤ユーザー数が多い。• Django経験者が多く、厚めなORMの⽅が慣れている。• Prismaにも惹かれたが、選定時期が2021/8頃(ver2)でまだ若⼲不安定だったので⾒送り(もう少し遅ければ選んでたかも)• よかったこと• なんだかんだ便利(Repository簡単に利⽤できたり、transformerかませたり)• 苦労したこと• ドキュメント読むだけだと罠が多い。issueやstack overflowなどからワークアラウンドを積極的に拾う必要がある。12新プロダクト開発でNestJSを導⼊してみた
ⓒ 2022 atama plus Inc.採⽤理由と使ってみて:API連携→OpenAPI + aspida• 採⽤理由• 型安全なクライアントを利⽤できる。• スキーマファーストな開発によりフロント / バックで並⾏開発できる。• よかったこと• ドキュメントが充実していて利⽤に迷わなかった。• ローカル開発でバックエンド側のコード変更検知→API定義を再⽣成することでストレスレスで開発できた(frourioの体験を拝借)。• サーバー間(NestJS<->Django)でも型安全なAPI連携を実現できた。• 苦労したこと• aspida/SWRのキャッシュ管理• Provide .esm.js and .mjs files with @aspida/swr13新プロダクト開発でNestJSを導⼊してみた
ⓒ 2022 atama plus Inc.• 採⽤経緯• ⽴ち上げ時に管理画⾯の構築に時間をかける余裕がなく、ローコストな⽅法を模索していった。• nestjs-admin is dead…• AdminJSはちょうどAdminBroからの改名でドキュメントまわり崩壊してたり、ActiveRecordパターンとの併⽤を避けたかったので⾒送り。• hbsはさすがにつらい。せめてReactで書いてレンダリングだけでも欲しい→nestjs-tsx-views• 管理画⾯がどんどんリッチになり、hydrationがないと⾟い状況に...採⽤理由と使ってみて:(おまけ)管理画⾯→nestjs-tsx-views + ???14新プロダクト開発でNestJSを導⼊してみた
ⓒ 2022 atama plus Inc.• 最終形• nestjs-tsx-views + 独⾃のhydration middleware• チームのつよつよエンジニアがカッとなって実装• よかったこと• hydration⼊ってからはかなり快適• サクッと画⾯を作りたい時に、同じ型を参照しながらフロントからバックまでTypeScriptで書き切れる体験が良かった。• 苦労したこと• (hydration前)なつかしのjQueryや⽣に近いJSを書くはめになった。• 気になり• みんな管理画⾯どうしてる?採⽤理由と使ってみて:(おまけ)管理画⾯→nestjs-tsx-views + ???15新プロダクト開発でNestJSを導⼊してみた
ⓒ 2022 atama plus Inc.チームメンバーにも聞いてみた• Iさん• ⾊々揃ってるけどモジュラーなのは好感が持てる⼀⽅で、それゆえにフレームワークとしてレールが敷かれてない感じの⾟さもちょこちょこあったかな、という感じ。• Oさん(フロントメイン)• プロジェクトのはじめやすさがメリットかな?雑な設計でも何とかなるというか。TypeScriptだけどReactとの⽂化的な相性は良くない。Angular好きなら良いかもしれないが、Reactだとフロントとサーバーで頭の切り替え必要。• Dさん• フロントもバックも全部TypeScriptになって嬉しかったです。16新プロダクト開発でNestJSを導⼊してみた
ⓒ 2022 atama plus Inc.全体のふりかえり• Keep• NestJSの利⽤(6⽉から作り始めたプロダクトでも採⽤中)• スキーマ駆動で型安全なAPI開発• Problem• 低凝集な設計でモジュール内&モジュール間の依存が複雑になった。• 管理画⾯のユースケースまで⾒越して選定を⾏わなかった。• Try• そもそもの設計⽅針を⾒直す&dependency-cruiserで明⽰的に境界を付ける。• ユーザー利⽤開始後の検証が⾏われるかまで認識合わせた上で開発を進める。17新プロダクト開発でNestJSを導⼊してみた
ⓒ 2022 atama plus Inc.おしまい18新プロダクト開発でNestJSを導⼊してみたHappy Hacking with NestJS!
もっと知りたい⽅はこちら@atamaplus_devプロダクト開発に関する情報発信を⾒る atama plusのニュースレターに登録