SlideShare una empresa de Scribd logo
1 de 30
Descargar para leer sin conexión
ビットバンク株式会社
TypeScript製フレームワーク「Nest」のご紹介
@d-yokoi
2018.8
Copyright © bitbank, inc.
自己紹介
❏ ビットバンクでサーバーサイドを担当
❏ Node.js, TypeScript
❏ 前職ではモバイルゲームを開発
❏ C++, C#, PHP, etc.
Daiki Yokoi
Copyright © bitbank, inc.
目的とアジェンダ
Nestについて広く浅く紹介し、興味を持ってもらう
❏ Nestを使い始めるまで
❏ そもそもどんな課題があったのか
❏ Nest入門
❏ 前提となる基礎知識をつける
❏ Nestの機能紹介
❏ どのようなことができるのか
Copyright © bitbank, inc.
Nestを使い始めるまで
Copyright © bitbank, inc.
❏ 既存のアプリは Node.js (v6) + Express という構成
❏ コードの透明性と柔軟性が高い
❏ データ構造がわかりにくく、可読性が低い
❏ フロントエンドチームの知見も借りられる
❏ TypeScript + Angular で開発している
Nestを使い始めるまで
新規開発はTypeScriptでやりたい
Copyright © bitbank, inc.
Nestを使い始めるまで
TypeScript化と同時により効率的な開発手法を模索
❏ DIの導入
❏ ユニットテストの効率化など
❏ ルーティング効率化
❏ ハンドラの登録をよりモダンな形で行えないか
❏ APIドキュメント
❏ スプレッドシートでの手動管理から脱却
❏ 自動でSwaggerUIに繋ぎこみたい
Copyright © bitbank, inc.
❏ InversifyJS [1]
❏ IoCコンテナ
❏ routing-controllers [2]
❏ デコレータでハンドラを登録できる
❏ tsoa [3]
❏ APIドキュメントの自動生成
[1] http://inversify.io/
[2] https://github.com/typestack/routing-controllers
[3] https://github.com/lukeautry/tsoa
Nestを使い始めるまで
いくつかのツールを試してみた
Copyright © bitbank, inc.
Nestを使い始めるまで
これらが統合されたフレームワークが欲しくなった
❏ 各ツールの守備範囲が微妙に噛み合わない
❏ ツールごとの前提条件や制約もあり、まとめ上げるのが少し面倒
Copyright © bitbank, inc.
Nestを使い始めるまで
そこで見つけたのがNest
Copyright © bitbank, inc.
Nestを使い始めるまで
Nestを使ってみることに
❏ もともと欲しかった機能が一通り揃っていた
❏ オリジナルのDIコンテナ
❏ デコレータでのハンドラ登録
❏ APIドキュメントの生成
❏ ポピュラーになりそう
❏ 日本語情報が全くない中、GitHubのスターは5000超え (2018/03時点)
❏ Angularのカンファレンスにも登場
Copyright © bitbank, inc.
Nest入門
Copyright © bitbank, inc.
Nest入門
❏ 簡単に言うとクラスの集まり
❏ 例)UserModule = UserController + UserService + …
❏ 関係性の強いクラスでまとめるべき
❏ 複数のモジュールがツリー状になって一つのアプリを構成
❏ 頂点のモジュールは ApplicationModule と命名されるのが一般的
フレームワーク独自のモジュールという概念がある
Copyright © bitbank, inc.
Nest入門
モジュールツリーのイメージ
Copyright © bitbank, inc.
Nest入門
❏ コントローラー
❏ 各エンドポイントへのリクエストハンドラを持つクラス
❏ プロバイダ
❏ コントローラー以外のクラス
❏ ロジックを持ち、コントローラーや別のプロバイダから呼び出される
モジュール内の各クラスは以下の2つに分類される
Copyright © bitbank, inc.
Nest入門
コントローラーではデコレータでハンドラを登録する
@Controller(‘users’)
class UserController {
@Get(‘:id’)
create(@Param(‘id’) id: string) {
// GET /users/1 等をハンドリングする
}
@Post()
create(@Body() body: CreateUserRequest) {
// POST /users をハンドリングする
}
}
Copyright © bitbank, inc.
Nest入門
プロバイダは各種ビジネスロジックを担当
UserModule
UserController UserService
UserDetailService
SessionService
Controllers Providers
Copyright © bitbank, inc.
Nest入門
依存関係はコンストラクタの実装を元に解決される
@Controller(‘users’)
class UserController {
constructor(private readonly userService: UserService) {}
// 略
}
---
@Injectable()
class UserService {
constructor(private readonly userDetailService: UserDetailService) {}
// 略
}
---
class UserDetailService {
Copyright © bitbank, inc.
Nest入門
❏ ツリー状のモジュール群がアプリケーションを構成
❏ トップのモジュールは Application Module と命名する
❏ モジュールは関係性の強いクラスの集合
❏ コントローラークラス => リクエストハンドラ
❏ プロバイダクラス => ビジネスロジック
❏ クラス間の依存関係はコンストラクタの実装を元に解決される
❏ モジュールをまたぐクラス間の依存関係の解決手段もある
ここまでのおさらい
Copyright © bitbank, inc.
@Module({
imports: [UserModule]
})
export class ApplicationModule {}
---
import { NestFactory } from '@nestjs/core';
import { ApplicationModule } from './app.module.ts';
async function bootstrap() {
const app = await NestFactory.create(ApplicationModule);
await app.listen(3000);
}
bootstrap();
Nest入門
モジュールが作成できたらサーバーを起動できる
ツリーのトップのモジュールを渡す
Copyright © bitbank, inc.
Nestの機能紹介
Copyright © bitbank, inc.
❏ コントローラの実装を解析してドキュメントを生成する
❏ 必要に応じてデコレータで追加の情報を与えられる
APIドキュメントを自動で作成し、SwaggerUIに連携
Nestの機能紹介
Copyright © bitbank, inc.
Nestの機能紹介
ロギングやレスポンスの整形に便利なインターセプタ
❏ ハンドラの実行前後に処理を差し込むことができる
❏ リクエスト開始時と終了時のログを簡単に紐づけることができる
❏ レスポンスにメタデータを追加したりするのにも便利
❏ いわゆるアスペクト指向プログラミングをサポートしてくれる
Copyright © bitbank, inc.
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(contexct: ExecutionContext, call$: Observable<any>): Observable<any> {
const requestId = uuid.v4();
console.log(`[Before] requestId: ${requestId}`);
return call$.pipe(
tap(() =>
console.log(`[After] requestId: ${requestId}`)
),
);
}
}
Nestの機能紹介
ロギングやレスポンスの整形に便利なインターセプタ
一つのメソッド内で
前後の処理を記述できる
Copyright © bitbank, inc.
Nestの機能紹介
リクエストパラメータと同時に定義するバリデーション
class CreateUserRequest {
@Length(10, 100)
@IsEmail()
readonly mail!: string;
}
@Controller(‘users’)
class UserController {
@Post()
create(@Body() body: CreateUserRequest) {
// 新規ユーザーを作成
}
}
この時点では以下が全て完了している
- リクエストボティのパース
- 指定したクラスへの変換
- バリデーションの実行
各バリデーションをデコレータで定義
- class-validatorが提供するもの
- カスタマイズも可能
Copyright © bitbank, inc.
Nestの機能紹介
Passportでの認証もサポート
❏ Passportはポピュラーな認証ツール
❏ JWT (JSON Web Token) やSAMLなど多様な認証手法が実装されている
❏ @nestjs/passportという公式パッケージがある
❏ 認証部分をアスペクト指向で実装する枠組みを提供してくれる
Copyright © bitbank, inc.
Nestの機能紹介
ガードによってアクセスコントロールを実現
❏ ガードは不正なリクエストを弾くための仕組み
❏ canActivateというインターフェースが用意されている
❏ リクエストデータを受けてboolean値を返すメソッドを実装するだけ
❏ 登録されたハンドラの実行前に評価される
❏ ビットバンクのあるアプリケーションではAPIごとに権限を設定
❏ Nestの全モジュールをスキャンしてAPI一覧を取得
❏ これを各ユーザーに割り当てる
❏ あとはガードの中でユーザーの権限をチェックすれば良い
Copyright © bitbank, inc.
❏ TypeORMはポピュラーな O/R Mapper
❏ 基本的なユースケースはほぼカバーされている印象
❏ トランザクションやパーティショニングが絡むと少しだけ手間だが問題ない範囲
❏ どうにもならなければSQLを直接書くこともできるがあまり使わない
❏ マイグレーションの仕組みも用意されている
❏ メンテナーの方が非常にオープンかつ反応が早い
❏ IssueやPRがすぐ処理される安心感
❏ @nestjs/typeorm という公式パッケージがある
❏ TypeORMのリポジトリクラス等を他のクラスと同じように簡単にDIできる
Nestの機能紹介
TypeORMでのデータベースアクセスをサポート
Copyright © bitbank, inc.
モックを使用したテストを簡単に行える
Nestの機能紹介
❏ @nestjs/testing という公式パッケージがある
❏ モジュール内の一部のクラスをモックに差し替えることができる
❏ 依存先が多いクラスをテストする際に便利
❏ ユニットテストにもe2eテストにも使える
❏ 特定のテストフレームワークとの連携はなし
❏ サンプルではJestというFacebookが開発するツールが使用されている
❏ JestはテストAPIやモック化の手法が豊富で使いやすい
❏ カバレッジを計測してHTMLで出力することもできる
❏ ビットバンクではMochaからJestへの移行が進んでいる
Copyright © bitbank, inc.
その他
Nestの機能紹介
❏ CLIツール
❏ @nestjs/cli という公式パッケージがある
❏ nest new <app-name> でアプリケーションの雛形ができる
❏ 個別のコンポーネントを作成することもできる
❏ コントローラー部分はREST以外にも対応可能
❏ GraphQL, WebSocket, gRPC, etc.
❏ MVCにも対応可能
Copyright © bitbank, inc.
❏ TypeScriptで開発したい方
❏ Nestで本格的なアプリケーションを作ってみたい方
❏ 暗号通貨取引所のバックエンドを支えたい方
最後に
仲間を募集しています :)

Más contenido relacionado

La actualidad más candente

乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)NTT DATA Technology & Innovation
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!Tetsutaro Watanabe
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説増田 亨
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方増田 亨
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAkihiro Kuwano
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMPYusuke Kagata
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜Yoshiki Nakagawa
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことAmazon Web Services Japan
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと増田 亨
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Shin Ohno
 
フロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkanフロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkanItsuki Kuroda
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?naoki koyama
 

La actualidad más candente (20)

乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
テストコードの DRY と DAMP
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
 
フロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkanフロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkan
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
 

Similar a TypeScript製フレームワーク「Nest」のご紹介

Node.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたことNode.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたことbitbank, Inc. Tokyo, Japan
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるRancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるMichitaka Terada
 
Deep-Dive into Scriptable Build Pipeline
Deep-Dive into Scriptable Build PipelineDeep-Dive into Scriptable Build Pipeline
Deep-Dive into Scriptable Build PipelineHaruto Otake
 
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用de:code 2017
 
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
1891件以上のカーネルの不具合修正に貢献した再現用プログラムを自動生成するsyzkallerのテスト自動化技術(NTT Tech Conference ...
1891件以上のカーネルの不具合修正に貢献した再現用プログラムを自動生成するsyzkallerのテスト自動化技術(NTT Tech Conference ...1891件以上のカーネルの不具合修正に貢献した再現用プログラムを自動生成するsyzkallerのテスト自動化技術(NTT Tech Conference ...
1891件以上のカーネルの不具合修正に貢献した再現用プログラムを自動生成するsyzkallerのテスト自動化技術(NTT Tech Conference ...NTT DATA Technology & Innovation
 
de:code2018 登壇資料
de:code2018 登壇資料de:code2018 登壇資料
de:code2018 登壇資料Hiroshi Senga
 
Essentials of container
Essentials of containerEssentials of container
Essentials of containerToru Makabe
 
キャリア網の完全なソフトウェア制御化への取り組み (沖縄オープンデイズ 2017) / Telecommunication Infrastructure ...
キャリア網の完全なソフトウェア制御化への取り組み (沖縄オープンデイズ 2017) / Telecommunication Infrastructure ...キャリア網の完全なソフトウェア制御化への取り組み (沖縄オープンデイズ 2017) / Telecommunication Infrastructure ...
キャリア網の完全なソフトウェア制御化への取り組み (沖縄オープンデイズ 2017) / Telecommunication Infrastructure ...KenzoOkuda
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーToru Makabe
 
エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識Daiyu Hatakeyama
 
次世代の企業ITインフラを支えるエンジニアとは
次世代の企業ITインフラを支えるエンジニアとは次世代の企業ITインフラを支えるエンジニアとは
次世代の企業ITインフラを支えるエンジニアとはTrainocate Japan, Ltd.
 
【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT
【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT
【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoTcloudconductor
 
Azure Antenna AI 概要
Azure Antenna AI 概要Azure Antenna AI 概要
Azure Antenna AI 概要Miho Yamamoto
 
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)NTT DATA Technology & Innovation
 
The road of Apache CloudStack Contributor (Translation and Patch)
The road of Apache CloudStack Contributor (Translation and Patch)The road of Apache CloudStack Contributor (Translation and Patch)
The road of Apache CloudStack Contributor (Translation and Patch)Kimihiko Kitase
 
C# でブロックチェーン実装
C# でブロックチェーン実装C# でブロックチェーン実装
C# でブロックチェーン実装Yuto Takei
 

Similar a TypeScript製フレームワーク「Nest」のご紹介 (20)

Node.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたことNode.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたこと
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げるRancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げる
 
Deep-Dive into Scriptable Build Pipeline
Deep-Dive into Scriptable Build PipelineDeep-Dive into Scriptable Build Pipeline
Deep-Dive into Scriptable Build Pipeline
 
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
 
Angularreflex20141210
Angularreflex20141210Angularreflex20141210
Angularreflex20141210
 
Vue入門
Vue入門Vue入門
Vue入門
 
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
 
1891件以上のカーネルの不具合修正に貢献した再現用プログラムを自動生成するsyzkallerのテスト自動化技術(NTT Tech Conference ...
1891件以上のカーネルの不具合修正に貢献した再現用プログラムを自動生成するsyzkallerのテスト自動化技術(NTT Tech Conference ...1891件以上のカーネルの不具合修正に貢献した再現用プログラムを自動生成するsyzkallerのテスト自動化技術(NTT Tech Conference ...
1891件以上のカーネルの不具合修正に貢献した再現用プログラムを自動生成するsyzkallerのテスト自動化技術(NTT Tech Conference ...
 
de:code2018 登壇資料
de:code2018 登壇資料de:code2018 登壇資料
de:code2018 登壇資料
 
Essentials of container
Essentials of containerEssentials of container
Essentials of container
 
キャリア網の完全なソフトウェア制御化への取り組み (沖縄オープンデイズ 2017) / Telecommunication Infrastructure ...
キャリア網の完全なソフトウェア制御化への取り組み (沖縄オープンデイズ 2017) / Telecommunication Infrastructure ...キャリア網の完全なソフトウェア制御化への取り組み (沖縄オープンデイズ 2017) / Telecommunication Infrastructure ...
キャリア網の完全なソフトウェア制御化への取り組み (沖縄オープンデイズ 2017) / Telecommunication Infrastructure ...
 
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャーKubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
 
エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識
 
次世代の企業ITインフラを支えるエンジニアとは
次世代の企業ITインフラを支えるエンジニアとは次世代の企業ITインフラを支えるエンジニアとは
次世代の企業ITインフラを支えるエンジニアとは
 
【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT
【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT
【Cloud Week 2015@Hokkaido University】Dockerとインフラ運用自働化とIoT
 
Azure Antenna AI 概要
Azure Antenna AI 概要Azure Antenna AI 概要
Azure Antenna AI 概要
 
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
 
The road of Apache CloudStack Contributor (Translation and Patch)
The road of Apache CloudStack Contributor (Translation and Patch)The road of Apache CloudStack Contributor (Translation and Patch)
The road of Apache CloudStack Contributor (Translation and Patch)
 
C# でブロックチェーン実装
C# でブロックチェーン実装C# でブロックチェーン実装
C# でブロックチェーン実装
 

Más de bitbank, Inc. Tokyo, Japan

ビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略についてビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略についてbitbank, Inc. Tokyo, Japan
 
ビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdfビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdfbitbank, Inc. Tokyo, Japan
 
ビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメントビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメントbitbank, Inc. Tokyo, Japan
 
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境bitbank, Inc. Tokyo, Japan
 
ビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdfビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdfbitbank, Inc. Tokyo, Japan
 
ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略bitbank, Inc. Tokyo, Japan
 
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜bitbank, Inc. Tokyo, Japan
 
中規模Angularアプリケーションの再設計
中規模Angularアプリケーションの再設計中規模Angularアプリケーションの再設計
中規模Angularアプリケーションの再設計bitbank, Inc. Tokyo, Japan
 
仮想通貨取引所 bitbank の IaC の導入と実践
仮想通貨取引所 bitbank の IaC の導入と実践 仮想通貨取引所 bitbank の IaC の導入と実践
仮想通貨取引所 bitbank の IaC の導入と実践 bitbank, Inc. Tokyo, Japan
 
Introduction of bitbank frontend development environment
Introduction of bitbank frontend development environmentIntroduction of bitbank frontend development environment
Introduction of bitbank frontend development environmentbitbank, Inc. Tokyo, Japan
 
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるかDeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるかbitbank, Inc. Tokyo, Japan
 
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介	ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介 bitbank, Inc. Tokyo, Japan
 
TypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみようTypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみようbitbank, Inc. Tokyo, Japan
 

Más de bitbank, Inc. Tokyo, Japan (20)

インフラチームの歴史とこれから
インフラチームの歴史とこれからインフラチームの歴史とこれから
インフラチームの歴史とこれから
 
ビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略についてビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略について
 
ビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdfビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdf
 
ビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメントビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメント
 
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
 
ビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdfビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdf
 
Lightning Network, Swap, Nloop
Lightning Network, Swap, NloopLightning Network, Swap, Nloop
Lightning Network, Swap, Nloop
 
ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略
 
bitbank Corporate Information
bitbank Corporate Informationbitbank Corporate Information
bitbank Corporate Information
 
ng build --prod & Continuous Delivery
ng build --prod & Continuous Deliveryng build --prod & Continuous Delivery
ng build --prod & Continuous Delivery
 
マーブル図で怖くないRxJS
マーブル図で怖くないRxJSマーブル図で怖くないRxJS
マーブル図で怖くないRxJS
 
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
持続的な運用開発のために社内基盤を整えている話 〜auditのCI組み込みやlintの社内PKG化〜
 
中規模Angularアプリケーションの再設計
中規模Angularアプリケーションの再設計中規模Angularアプリケーションの再設計
中規模Angularアプリケーションの再設計
 
仮想通貨取引所 bitbank の IaC の導入と実践
仮想通貨取引所 bitbank の IaC の導入と実践 仮想通貨取引所 bitbank の IaC の導入と実践
仮想通貨取引所 bitbank の IaC の導入と実践
 
Introduction of bitbank frontend development environment
Introduction of bitbank frontend development environmentIntroduction of bitbank frontend development environment
Introduction of bitbank frontend development environment
 
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるかDeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
 
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介	ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
 
Ethereumのシャーディング概論
Ethereumのシャーディング概論Ethereumのシャーディング概論
Ethereumのシャーディング概論
 
Daocasinoにおけるstate channel実装
Daocasinoにおけるstate channel実装Daocasinoにおけるstate channel実装
Daocasinoにおけるstate channel実装
 
TypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみようTypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみよう
 

TypeScript製フレームワーク「Nest」のご紹介

  • 2. Copyright © bitbank, inc. 自己紹介 ❏ ビットバンクでサーバーサイドを担当 ❏ Node.js, TypeScript ❏ 前職ではモバイルゲームを開発 ❏ C++, C#, PHP, etc. Daiki Yokoi
  • 3. Copyright © bitbank, inc. 目的とアジェンダ Nestについて広く浅く紹介し、興味を持ってもらう ❏ Nestを使い始めるまで ❏ そもそもどんな課題があったのか ❏ Nest入門 ❏ 前提となる基礎知識をつける ❏ Nestの機能紹介 ❏ どのようなことができるのか
  • 4. Copyright © bitbank, inc. Nestを使い始めるまで
  • 5. Copyright © bitbank, inc. ❏ 既存のアプリは Node.js (v6) + Express という構成 ❏ コードの透明性と柔軟性が高い ❏ データ構造がわかりにくく、可読性が低い ❏ フロントエンドチームの知見も借りられる ❏ TypeScript + Angular で開発している Nestを使い始めるまで 新規開発はTypeScriptでやりたい
  • 6. Copyright © bitbank, inc. Nestを使い始めるまで TypeScript化と同時により効率的な開発手法を模索 ❏ DIの導入 ❏ ユニットテストの効率化など ❏ ルーティング効率化 ❏ ハンドラの登録をよりモダンな形で行えないか ❏ APIドキュメント ❏ スプレッドシートでの手動管理から脱却 ❏ 自動でSwaggerUIに繋ぎこみたい
  • 7. Copyright © bitbank, inc. ❏ InversifyJS [1] ❏ IoCコンテナ ❏ routing-controllers [2] ❏ デコレータでハンドラを登録できる ❏ tsoa [3] ❏ APIドキュメントの自動生成 [1] http://inversify.io/ [2] https://github.com/typestack/routing-controllers [3] https://github.com/lukeautry/tsoa Nestを使い始めるまで いくつかのツールを試してみた
  • 8. Copyright © bitbank, inc. Nestを使い始めるまで これらが統合されたフレームワークが欲しくなった ❏ 各ツールの守備範囲が微妙に噛み合わない ❏ ツールごとの前提条件や制約もあり、まとめ上げるのが少し面倒
  • 9. Copyright © bitbank, inc. Nestを使い始めるまで そこで見つけたのがNest
  • 10. Copyright © bitbank, inc. Nestを使い始めるまで Nestを使ってみることに ❏ もともと欲しかった機能が一通り揃っていた ❏ オリジナルのDIコンテナ ❏ デコレータでのハンドラ登録 ❏ APIドキュメントの生成 ❏ ポピュラーになりそう ❏ 日本語情報が全くない中、GitHubのスターは5000超え (2018/03時点) ❏ Angularのカンファレンスにも登場
  • 11. Copyright © bitbank, inc. Nest入門
  • 12. Copyright © bitbank, inc. Nest入門 ❏ 簡単に言うとクラスの集まり ❏ 例)UserModule = UserController + UserService + … ❏ 関係性の強いクラスでまとめるべき ❏ 複数のモジュールがツリー状になって一つのアプリを構成 ❏ 頂点のモジュールは ApplicationModule と命名されるのが一般的 フレームワーク独自のモジュールという概念がある
  • 13. Copyright © bitbank, inc. Nest入門 モジュールツリーのイメージ
  • 14. Copyright © bitbank, inc. Nest入門 ❏ コントローラー ❏ 各エンドポイントへのリクエストハンドラを持つクラス ❏ プロバイダ ❏ コントローラー以外のクラス ❏ ロジックを持ち、コントローラーや別のプロバイダから呼び出される モジュール内の各クラスは以下の2つに分類される
  • 15. Copyright © bitbank, inc. Nest入門 コントローラーではデコレータでハンドラを登録する @Controller(‘users’) class UserController { @Get(‘:id’) create(@Param(‘id’) id: string) { // GET /users/1 等をハンドリングする } @Post() create(@Body() body: CreateUserRequest) { // POST /users をハンドリングする } }
  • 16. Copyright © bitbank, inc. Nest入門 プロバイダは各種ビジネスロジックを担当 UserModule UserController UserService UserDetailService SessionService Controllers Providers
  • 17. Copyright © bitbank, inc. Nest入門 依存関係はコンストラクタの実装を元に解決される @Controller(‘users’) class UserController { constructor(private readonly userService: UserService) {} // 略 } --- @Injectable() class UserService { constructor(private readonly userDetailService: UserDetailService) {} // 略 } --- class UserDetailService {
  • 18. Copyright © bitbank, inc. Nest入門 ❏ ツリー状のモジュール群がアプリケーションを構成 ❏ トップのモジュールは Application Module と命名する ❏ モジュールは関係性の強いクラスの集合 ❏ コントローラークラス => リクエストハンドラ ❏ プロバイダクラス => ビジネスロジック ❏ クラス間の依存関係はコンストラクタの実装を元に解決される ❏ モジュールをまたぐクラス間の依存関係の解決手段もある ここまでのおさらい
  • 19. Copyright © bitbank, inc. @Module({ imports: [UserModule] }) export class ApplicationModule {} --- import { NestFactory } from '@nestjs/core'; import { ApplicationModule } from './app.module.ts'; async function bootstrap() { const app = await NestFactory.create(ApplicationModule); await app.listen(3000); } bootstrap(); Nest入門 モジュールが作成できたらサーバーを起動できる ツリーのトップのモジュールを渡す
  • 20. Copyright © bitbank, inc. Nestの機能紹介
  • 21. Copyright © bitbank, inc. ❏ コントローラの実装を解析してドキュメントを生成する ❏ 必要に応じてデコレータで追加の情報を与えられる APIドキュメントを自動で作成し、SwaggerUIに連携 Nestの機能紹介
  • 22. Copyright © bitbank, inc. Nestの機能紹介 ロギングやレスポンスの整形に便利なインターセプタ ❏ ハンドラの実行前後に処理を差し込むことができる ❏ リクエスト開始時と終了時のログを簡単に紐づけることができる ❏ レスポンスにメタデータを追加したりするのにも便利 ❏ いわゆるアスペクト指向プログラミングをサポートしてくれる
  • 23. Copyright © bitbank, inc. @Injectable() export class LoggingInterceptor implements NestInterceptor { intercept(contexct: ExecutionContext, call$: Observable<any>): Observable<any> { const requestId = uuid.v4(); console.log(`[Before] requestId: ${requestId}`); return call$.pipe( tap(() => console.log(`[After] requestId: ${requestId}`) ), ); } } Nestの機能紹介 ロギングやレスポンスの整形に便利なインターセプタ 一つのメソッド内で 前後の処理を記述できる
  • 24. Copyright © bitbank, inc. Nestの機能紹介 リクエストパラメータと同時に定義するバリデーション class CreateUserRequest { @Length(10, 100) @IsEmail() readonly mail!: string; } @Controller(‘users’) class UserController { @Post() create(@Body() body: CreateUserRequest) { // 新規ユーザーを作成 } } この時点では以下が全て完了している - リクエストボティのパース - 指定したクラスへの変換 - バリデーションの実行 各バリデーションをデコレータで定義 - class-validatorが提供するもの - カスタマイズも可能
  • 25. Copyright © bitbank, inc. Nestの機能紹介 Passportでの認証もサポート ❏ Passportはポピュラーな認証ツール ❏ JWT (JSON Web Token) やSAMLなど多様な認証手法が実装されている ❏ @nestjs/passportという公式パッケージがある ❏ 認証部分をアスペクト指向で実装する枠組みを提供してくれる
  • 26. Copyright © bitbank, inc. Nestの機能紹介 ガードによってアクセスコントロールを実現 ❏ ガードは不正なリクエストを弾くための仕組み ❏ canActivateというインターフェースが用意されている ❏ リクエストデータを受けてboolean値を返すメソッドを実装するだけ ❏ 登録されたハンドラの実行前に評価される ❏ ビットバンクのあるアプリケーションではAPIごとに権限を設定 ❏ Nestの全モジュールをスキャンしてAPI一覧を取得 ❏ これを各ユーザーに割り当てる ❏ あとはガードの中でユーザーの権限をチェックすれば良い
  • 27. Copyright © bitbank, inc. ❏ TypeORMはポピュラーな O/R Mapper ❏ 基本的なユースケースはほぼカバーされている印象 ❏ トランザクションやパーティショニングが絡むと少しだけ手間だが問題ない範囲 ❏ どうにもならなければSQLを直接書くこともできるがあまり使わない ❏ マイグレーションの仕組みも用意されている ❏ メンテナーの方が非常にオープンかつ反応が早い ❏ IssueやPRがすぐ処理される安心感 ❏ @nestjs/typeorm という公式パッケージがある ❏ TypeORMのリポジトリクラス等を他のクラスと同じように簡単にDIできる Nestの機能紹介 TypeORMでのデータベースアクセスをサポート
  • 28. Copyright © bitbank, inc. モックを使用したテストを簡単に行える Nestの機能紹介 ❏ @nestjs/testing という公式パッケージがある ❏ モジュール内の一部のクラスをモックに差し替えることができる ❏ 依存先が多いクラスをテストする際に便利 ❏ ユニットテストにもe2eテストにも使える ❏ 特定のテストフレームワークとの連携はなし ❏ サンプルではJestというFacebookが開発するツールが使用されている ❏ JestはテストAPIやモック化の手法が豊富で使いやすい ❏ カバレッジを計測してHTMLで出力することもできる ❏ ビットバンクではMochaからJestへの移行が進んでいる
  • 29. Copyright © bitbank, inc. その他 Nestの機能紹介 ❏ CLIツール ❏ @nestjs/cli という公式パッケージがある ❏ nest new <app-name> でアプリケーションの雛形ができる ❏ 個別のコンポーネントを作成することもできる ❏ コントローラー部分はREST以外にも対応可能 ❏ GraphQL, WebSocket, gRPC, etc. ❏ MVCにも対応可能
  • 30. Copyright © bitbank, inc. ❏ TypeScriptで開発したい方 ❏ Nestで本格的なアプリケーションを作ってみたい方 ❏ 暗号通貨取引所のバックエンドを支えたい方 最後に 仲間を募集しています :)