Slide 1

Slide 1 text

NestJSを実運用してみて 営業製作所 白石 卓馬

Slide 2

Slide 2 text

会社紹介:営業製作所 ・設立 2020年4月 ・本社 大阪 (肥後橋駅 徒歩3分) ・従業員数 約150名 (2024年4月時点) ・目的 日本の製造業を支える ・特徴 泥臭い中にこそ本質がある

Slide 3

Slide 3 text

自己紹介 ・なまえ 白石 卓馬 (gizm000) ・出身地 大阪 ・職種 ソフトウェアエンジニア ・経歴 SIer → 受託 → SaaS

Slide 4

Slide 4 text

営業製作所のざっくり技術スタック ・フロントエンド:Next.js ・サーバーサイド:NestJS ・IaC:Terraform (CDKじゃないヨ) 業務で使う 80 98%以上がTypeScript

Slide 5

Slide 5 text

営業製作所のざっくり技術スタック ・フロントエンド:Next.js ・サーバーサイド:NestJS ・IaC:Terraform (CDKじゃないヨ) 業務で使う 80 98%以上がTypeScript

Slide 6

Slide 6 text

NestJSを採用している

Slide 7

Slide 7 text

なぜNestJSを採用したか? ・TypeScriptがサポートされている ・GraphQLがサポートされている ・PrismaORMのモジュールが提供されている ・Node.js界隈ではわりと枯れている (2017年リリース, Star 66.9K)  ・Mediumとかで調べても結構情報がある  ・最近は日本語の情報も増えてきている

Slide 8

Slide 8 text

なぜNestJSを採用したか? ・(個人的には)わりと理解しやすい ・DIはそこまで必要かはわからないが、楽ではある  ・明示的に new する必要がない ・サーバーに対するe2eテスト用のAPIも用意されている ・ボイラープレートが多いので記述のブレを少なくできそう

Slide 9

Slide 9 text

実際に導入してみた感触 としても悪くないが...

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

ポジティブな意見が わりとある!

Slide 12

Slide 12 text

最近、風当たりが 強くない? 🤔

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

ネガティブな意見が 増えてきた・・・?

Slide 15

Slide 15 text

デコレータ およびDIがなぁ...

Slide 16

Slide 16 text

デコレータ およびDIがなぁ...

Slide 17

Slide 17 text

クラスにつけたり・・・ デコレータ

Slide 18

Slide 18 text

プロパティにつけたり・・・ デコレータ

Slide 19

Slide 19 text

@Fieldをつけると、 schema.gqlに GraphQLスキーマとして出力される デコレータ

Slide 20

Slide 20 text

TypeScriptでstring型のため、 GraphQLでStringとして定義されている デコレータ

Slide 21

Slide 21 text

NestJSのデコレータはなぜダメ? ・reflect-metadataを使って得られたメタデータを利用している ・TypeScriptの emitDecoratorMetadata オプションを true にする必要 ・型定義の情報を利用するため、開発時に型チェックをスキップできない ・ビルドが遅い... 😢 ・TypeScript 5.0からはレガシー機能となった ・仕様の異なるデコレータが正式版として採択されてしまった ・experimentalDecorators フラグを有効にすれば利用可能

Slide 22

Slide 22 text

デコレータ およびDIがなぁ...

Slide 23

Slide 23 text

依存性注入は いつ必要?

Slide 24

Slide 24 text

なぜ依存性を注入するのか ・外環境に依存していて簡単にモックできるようにしたい ・決済API, AWS SDKとか ・依存するモジュールが多い ・依存関係を記述するのが面倒臭い ・同一のインタフェースを持っていれば付け替えられるようにしたい ・GoF デザインパターンの Template methodパターンのイメージ

Slide 25

Slide 25 text

依存性注入に反対勢の意見 ・同一のIFを持った別オブジェクトに付け替えることそんなにある? ・環境変数に依存するケースぐらいではないか ・異なるロガーを付け替えられるようにとか、本当にある? ・エラーがわかりにくい、依存関係がわかりにくい ・Nest can't resolve dependencies…. ・依存関係を表示するツールが ま さ か の 有 料

Slide 26

Slide 26 text

果たして、本当にDIは必要か? TypeScriptであれば、依存関係は 型定義によって担保されるので、 十分なのでは...?

Slide 27

Slide 27 text

Now coding...

Slide 28

Slide 28 text

・依存関係は明確にしよう! ・関数単位で依存している方が楽だぞ!

Slide 29

Slide 29 text

・依存関係は明確にしよう! ・関数単位で依存している方が楽だぞ! NestJSはどこまで依存しているかわからな くて大変になる... 子モジュールが依存している孫モジュール のimportがされていないくてエラーになると か、めんどくさい!!!

Slide 30

Slide 30 text

ところで...

Slide 31

Slide 31 text

experimentalDecoratorに 依存していなくて コードファーストに書ける GraphQLライブラリ...

Slide 32

Slide 32 text

experimentalDecoratorに 依存していなくて コードファーストに書ける GraphQLライブラリ... 実はまだない ?

Slide 33

Slide 33 text

1. Pothos (旧GraphQL Nexus) 2. GraphQL Modules 3. type-graphql-next どれも使ったことない...󰷺 Claude調べ

Slide 34

Slide 34 text

ご清聴ありがとうご ざいました

Slide 35

Slide 35 text

さいごに ・絶賛採用活動中です❗ → X, LinkedIn, Green, LAPRAS, …  情報交換程度でも良いので、  よかったらご連絡を😆