SlideShare a Scribd company logo
ビットバンク株式会社
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で本格的なアプリケーションを作ってみたい方
❏ 暗号通貨取引所のバックエンドを支えたい方
最後に
仲間を募集しています :)

More Related Content

What's hot

Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Teppei Sato
 
最近のやられアプリを試してみた
最近のやられアプリを試してみた最近のやられアプリを試してみた
最近のやられアプリを試してみた
zaki4649
 
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #1320210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
Amazon Web Services Japan
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
Akihiro Kuwano
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Kohei Tokunaga
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
 
とある診断員とSQLインジェクション
とある診断員とSQLインジェクションとある診断員とSQLインジェクション
とある診断員とSQLインジェクション
zaki4649
 
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
NTT DATA Technology & Innovation
 
MongoDBの監視
MongoDBの監視MongoDBの監視
MongoDBの監視
Tetsutaro Watanabe
 
CloudFront経由でのCORS利用
CloudFront経由でのCORS利用CloudFront経由でのCORS利用
CloudFront経由でのCORS利用
Yuta Imai
 
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
Yuta Imai
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
Takuto Wada
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
 
ここが良かったDatadog
ここが良かったDatadogここが良かったDatadog
ここが良かったDatadog
tyamane
 
WiredTigerを詳しく説明
WiredTigerを詳しく説明WiredTigerを詳しく説明
WiredTigerを詳しく説明
Tetsutaro Watanabe
 
Node.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたことNode.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたこと
bitbank, Inc. Tokyo, Japan
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
Akihiro Suda
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
NTT DATA Technology & Innovation
 
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
Yoshikazu GOTO
 

What's hot (20)

Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
 
最近のやられアプリを試してみた
最近のやられアプリを試してみた最近のやられアプリを試してみた
最近のやられアプリを試してみた
 
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #1320210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
とある診断員とSQLインジェクション
とある診断員とSQLインジェクションとある診断員とSQLインジェクション
とある診断員とSQLインジェクション
 
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
乗っ取れコンテナ!!開発者から見たコンテナセキュリティの考え方(CloudNative Days Tokyo 2021 発表資料)
 
MongoDBの監視
MongoDBの監視MongoDBの監視
MongoDBの監視
 
CloudFront経由でのCORS利用
CloudFront経由でのCORS利用CloudFront経由でのCORS利用
CloudFront経由でのCORS利用
 
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
EC2のストレージどう使う? -Instance Storageを理解して高速IOを上手に活用!-
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
ここが良かったDatadog
ここが良かったDatadogここが良かったDatadog
ここが良かったDatadog
 
WiredTigerを詳しく説明
WiredTigerを詳しく説明WiredTigerを詳しく説明
WiredTigerを詳しく説明
 
Node.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたことNode.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたこと
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
 
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
「DNS浸透いうな」と言うけれど… (#ssmjp 2018/07)
 

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

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 Pipeline
Haruto Otake
 
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
[AI08] 深層学習フレームワーク Chainer × Microsoft で広がる応用
de:code 2017
 
Angularreflex20141210
Angularreflex20141210Angularreflex20141210
Angularreflex20141210
Shinichiro Takezaki
 
Vue入門
Vue入門Vue入門
Vue入門
Takeo Noda
 
今こそ知りたい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 container
Toru Makabe
 
キャリア網の完全なソフトウェア制御化への取り組み (沖縄オープンデイズ 2017) / Telecommunication Infrastructure ...
キャリア網の完全なソフトウェア制御化への取り組み (沖縄オープンデイズ 2017) / Telecommunication Infrastructure ...キャリア網の完全なソフトウェア制御化への取り組み (沖縄オープンデイズ 2017) / Telecommunication Infrastructure ...
キャリア網の完全なソフトウェア制御化への取り組み (沖縄オープンデイズ 2017) / Telecommunication Infrastructure ...
KenzoOkuda
 
エンジニアのための 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とインフラ運用自働化とIoT
cloudconductor
 
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
 
機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編
Fujio Kojima
 
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
Nobuyuki Matsui
 

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

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 ...
 
エンジニアのための 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# でブロックチェーン実装
 
機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編
 
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
【AWS Night in ITHD】AWSとのSoftLayerで仮想ネットワークオーバーレイ
 

More from bitbank, Inc. Tokyo, Japan

インフラチームの歴史とこれから
インフラチームの歴史とこれからインフラチームの歴史とこれから
インフラチームの歴史とこれから
bitbank, Inc. Tokyo, Japan
 
ビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略についてビットバンクのデプロイ戦略について
ビットバンクのデプロイ戦略について
bitbank, Inc. Tokyo, Japan
 
ビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdfビットバンク流 アジャイル開発の紹介.pdf
ビットバンク流 アジャイル開発の紹介.pdf
bitbank, Inc. Tokyo, Japan
 
ビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメントビットバンクで求められるプロジェクトマネジメント
ビットバンクで求められるプロジェクトマネジメント
bitbank, Inc. Tokyo, Japan
 
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
ビットバンクでのネイティブアプリケーション開発におけるCI_CD環境
bitbank, Inc. Tokyo, Japan
 
ビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdfビットバンクのマッチングエンジン.pdf
ビットバンクのマッチングエンジン.pdf
bitbank, Inc. Tokyo, Japan
 
Lightning Network, Swap, Nloop
Lightning Network, Swap, NloopLightning Network, Swap, Nloop
Lightning Network, Swap, Nloop
bitbank, Inc. Tokyo, Japan
 
ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略ビットバンクにおける少人数で支えるインフラチームの戦略
ビットバンクにおける少人数で支えるインフラチームの戦略
bitbank, Inc. Tokyo, Japan
 
bitbank Corporate Information
bitbank Corporate Informationbitbank Corporate Information
bitbank Corporate Information
bitbank, Inc. Tokyo, Japan
 
ng build --prod & Continuous Delivery
ng build --prod & Continuous Deliveryng build --prod & Continuous Delivery
ng build --prod & Continuous Delivery
bitbank, Inc. Tokyo, Japan
 
マーブル図で怖くないRxJS
マーブル図で怖くないRxJSマーブル図で怖くないRxJS
マーブル図で怖くないRxJS
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 environment
bitbank, Inc. Tokyo, Japan
 
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるかDeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
DeveloperSuccess として何を届けられるか、様々な分野を経た先として何ができるか
bitbank, Inc. Tokyo, Japan
 
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介	ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
ビットコインウォレットで手軽にパスワードレス認証が可能なbitidについての紹介
bitbank, Inc. Tokyo, Japan
 
Ethereumのシャーディング概論
Ethereumのシャーディング概論Ethereumのシャーディング概論
Ethereumのシャーディング概論
bitbank, Inc. Tokyo, Japan
 
Daocasinoにおけるstate channel実装
Daocasinoにおけるstate channel実装Daocasinoにおけるstate channel実装
Daocasinoにおけるstate channel実装
bitbank, Inc. Tokyo, Japan
 
TypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみようTypeScriptでライトニングネットワークを使ってみよう
TypeScriptでライトニングネットワークを使ってみよう
bitbank, Inc. Tokyo, Japan
 

More from 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で本格的なアプリケーションを作ってみたい方 ❏ 暗号通貨取引所のバックエンドを支えたい方 最後に 仲間を募集しています :)