Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlin製のGraphQLサーバーをNode.jsでモジュラモノリス化している話
Search
Kazuhito Hokamura
November 19, 2023
Technology
0
3.5k
Kotlin製のGraphQLサーバーをNode.jsでモジュラモノリス化している話
Kazuhito Hokamura
November 19, 2023
Tweet
Share
More Decks by Kazuhito Hokamura
See All by Kazuhito Hokamura
TypeScriptとGraphQLで実現する 型安全なAPI実装 / TSKaigi 2024
hokaccha
5
4.6k
GraphQLの負債と向き合うためにやっていること
hokaccha
2
1.5k
ユビーのアーキテクチャに対する取り組み
hokaccha
1
420
RailsエンジニアのためのNext.js入門
hokaccha
7
20k
Cookpad Summer Internship 2021 Web Frontend
hokaccha
0
7.2k
巨大なモノリシック Rails アプリケーションの マイクロサービス化戦略 / 2019 microservices in cookpad
hokaccha
3
3.9k
巨大なRailsアプリケーションを「普通」にするための取り組み
hokaccha
1
1k
Web Frontend Improvement in Cookpad
hokaccha
1
1.1k
cookpad summer internship 2018 - Git
hokaccha
1
9.7k
Other Decks in Technology
See All in Technology
データエンジニアリング 4年前と変わったこと、 4年前と変わらないこと
tanakarian
2
330
スプリントレビューを効果的にするために
miholovesq
8
1.4k
手動からの解放!!Strands Agents で実現する総合テスト自動化
ideaws
2
240
「現場で活躍するAIエージェント」を実現するチームと開発プロセス
tkikuchi1002
6
940
SREを知らずに SREマネージャーになった話 / How I Became an SRE Manager Without Knowing What SRE Is
moneyforward
0
230
An introduction to Claude Code SDK
choplin
3
3.2k
今日からあなたもGeminiを好きになる
subaruhello
1
490
claude codeでPrompt Engineering
iori0311
0
290
PHPでResult型やってみよう
higaki_program
0
180
MCPに潜むセキュリティリスクを考えてみる
milix_m
0
450
"Découvrir le Liberland"
rlifchitz
0
130
MCP とマネージド PaaS で実現する大規模 AI アプリケーションの高速開発
nahokoxxx
1
1.2k
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
235
140k
Making Projects Easy
brettharned
116
6.3k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Building Applications with DynamoDB
mza
95
6.5k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
The Pragmatic Product Professional
lauravandoore
35
6.8k
Git: the NoSQL Database
bkeepers
PRO
431
65k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
360
Art, The Web, and Tiny UX
lynnandtonic
301
21k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Writing Fast Ruby
sferik
628
62k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Transcript
KotlinͷGraphQLαʔόʔΛNode.jsͰϞδϡϥϞϊϦεԽ͍ͯ͠Δ JSConf JP 2023 @hokaccha
2 About Me Kazuhito Hokamura software engineer @hokaccha @hokaccha
@Ubie,Inc. 3 1. ϢϏʔͷϓϩμΫτʹ͍ͭͯ 2. ϢϏʔͷγεςϜͷݱঢ়ͱ՝ 3. ՝ʹରͯ͠औΓΜͰ͍Δ͜ͱ Table of
Contents
@Ubie,Inc. 4 ࣗͷঢ়Λ͑Δ͚ͩͰɺ ࢀߟප໊ۙ͘ͷҩྍػؔ ʮडͷख͕͔Γʯ͕ௐΒΕΔ ҩྍݱͰ࣮ࡍʹΘΕ͑ΒΕͨAIΛɺੜ׆ऀ͕దͳ ҩྍʹ͔͔Δ҆ͱͯ͠։์͍ͯ͠·͢ (2020य़ʙ) ແྉͰ ୭Ͱ
͍ͭͰ ΄΅શͯͷঢ়Ͱˎ ˎ99% (1.3ສ)ͷঢ়ʹରԠ
@Ubie,Inc. 5 ۀޮԽೝ্ͳͲɺ ױऀ͞ΜͱͷίϛϡχέʔγϣϯઃܭΛ௨͡ɺ ͷ্࣭Λࢧԉ͢Δҩྍػ͚ؔαʔϏε පӃɾΫϦχοΫͦΕͧΕͷχʔζʹ߹ΘͤͨҎԼͷΑ͏ͳ ػೳΛఏڙɾ։ൃ͍ͯ͠·͢ ϢϏʔAI ϢϏʔϦϯΫ ϗʔϜϖʔδAI૬ஊ૭ޱ
etc…
@Ubie,Inc. 6 2. ϢϏʔͷγεςϜͷݱঢ়ͱ՝ 3. ՝ʹରͯ͠औΓΜͰ͍Δ͜ͱ Table of Contents 1.
ϢϏʔͷϓϩμΫτʹ͍ͭͯ
7 γεςϜΞʔΩςΫνϟ
8 • ෳͷݴޠɾϑϨʔϜϫʔΫ͕ཚཱ͍ͯ͠Δ ◦ Kotlin/Spring Boot, Rails, Node.js/NestJS, Go, Python
◦ API GraphQL, gRPC, REST ͕ࠞࡏ • ίʔυϕʔε͕େ͖͘ͳ͖ͬͯͯػೳͷڥք͕ᐆດʹͳΓɺΦʔφʔγοϓ͕ෆ໌ྎʹͳ͍ͬͯΔ ◦ ಛʹϓϩμΫτଆͷαʔϏε͕ංେԽ͍ͯ͠Δ • ݹ͔͘Β͋ΔϨΨγʔͳγεςϜσʔλ͕ΞʔΩςΫνϟతͳΛ࢈ΜͰ͍Δ ◦ ೝෛՙͷ্ঢɺอकίετͷ૿ՃͳͲʹΑΓੜ࢈ੑ͕Լ͍ͯ͠Δ γεςϜ্ͷ՝
9 ҰݴͰ͍͏ͱ ٕज़తෛ࠴͕ ੵΈ্͕͖ͬͯͨʂʂ
@Ubie,Inc. 10 3. ՝ʹରͯ͠औΓΜͰ͍Δ͜ͱ 2. ϢϏʔͷγεςϜͷݱঢ়ͱ՝ Table of Contents 1.
ϢϏʔͷϓϩμΫτʹ͍ͭͯ
11 औΓΜͰ͍Δ͜ͱ • ϦΞʔΩςΫςΟϯάʹΑΔٕज़తෛ࠴ͷղফ ◦ ٕज़ελοΫͷ౷Ұ ◦ ϞδϡϥϞϊϦεԽ • ٕज़తෛ࠴Λίϯτϩʔϧ͢ΔͨΊͷऔΓΈ
◦ ٕज़ઓུɾํͷݴޠԽɾυΩϡϝϯςʔγϣϯ ◦ Design DocʹΑΔઃܭϨϏϡʔͷϓϩηεඋ • ੜ࢈ੑࢦඪͷՄࢹԽͱඪͷઃఆ ◦ Four KeysʹΑΔՄࢹԽ ◦ ੜ࢈ੑվળͷͨΊͷઓུࡦఆ ← ࠓ͜͜ͷ͠
12 ٕज़ελοΫͷ౷Ұ
13 γεςϜΞʔΩςΫνϟ To-Be
14 ٕज़ελοΫͷ౷Ұ • όοΫΤϯυݴޠΛNode.js/Goʹ౷Ұ ◦ ϓϩμΫτଆͷαʔϏεNode.jsɺϓϥοτϑΥʔϜଆGoʹ͢Δ ◦ Node.jsͷਪߏ NestJS, Prisma
͋ͨΓ͕༗ྗ • ϑϩϯτΤϯυNext.jsʹ౷Ұ ◦ ݱঢ়ͱ͋·Γဃͳ͍ͷͰٕज़ελοΫେ෯ͳมߋ༧ఆͳ͠ • APIGraphQLʹ౷Ұ ◦ gRPCͷซ༻Λߟ͍͕͑ͯͨGraphQLʹ౷Ұ͢ΔํͰݕ౼த
15 ϞδϡϥϞϊϦε ʢAI͕ߟ͑ΔϞδϡϥϞϊϦεͷਤʣ
16 ϞδϡϥϞϊϦε #ͱ ϞϊϦεͳΞϓϦέʔγϣϯͷ෦Λػೳ୯ҐͰϞδϡʔϧʹׂͨ͠ΞʔΩςΫνϟ
17 Φʔφʔγοϓ͕େࣄ ʢAI͕ߟ͑ΔΦʔφʔγοϓʣ
18 Why ϞδϡϥϞϊϦε
19 v.s. ϚΠΫϩαʔϏε
20 v.s. ϚΠΫϩαʔϏε • ωοτϫʔΫ௨৴͕ൃੜ͠ͳ͍ͨΊɺ৴པੑύϑΥʔϚϯεͳͲͷͰ༗ར • ಉҰίʔυϕʔεͳͷͰ։ൃڥͷߏஙΠϯςάϨʔγϣϯςετ͕༰қ • ΤϥʔτϥοΩϯάࢹɺτϥϒϧγϡʔςΟϯά͕γϯϓϧʹͳΔ •
ϞδϡʔϧͷڥքͷมߋʹରԠ͍͢͠ ϞδϡϥϞϊϦεͷϝϦοτ
21 v.s. ϚΠΫϩαʔϏε • ػೳ୯ҐͰσϓϩΠεέʔϦϯά͕Ͱ͖ͳ͍ • ϓϩμΫτͷεέʔϧʹͬͯσϓϩΠύΠϓϥΠϯCI͕ංେԽɺෳࡶԽ͢Δ • ϞδϡʔϧͷڥքΛҡ࣋͢ΔͨΊͷίετ͕͔͔Δ ϞδϡϥϞϊϦεͷσϝϦοτ
22 ϢϏʔʹ͓͚ΔϞδϡϥϞϊϦε
23 ٕज़બఆ • NestJS Ͱ GraphQL αʔόʔΛߏங͢Δ • ORM
Prisma • ϑϨʔϜϫʔΫϥΠϒϥϦ͍ͨͬͯී௨ͷߏ
24 ύοέʔδཧ • package.json ͕ϧʔτʹ͋Δ͚ͩͷී௨ͷ Node.js ϓϩδΣΫτ • npm workspace
ͱ Turborepo Λͬͨ multi packages ߏݕ౼ ◦ શͯͷϞδϡʔϧͰಉ͡ϥΠϒϥϦઃఆΛ͏ͷͰ ϝϦοτ͕গͳ͍ ◦ ෳࡶੑͷ૿ՃͳͲͷσϝϦοτ্͕ճΔͱஅͯ͠Ίͨ
25 Database, ORM • DBϞδϡʔϧؒͰڞ༗͢Δ ◦ Ϟδϡʔϧ͝ͱʹDBͷεΩʔϚΛ͚Δʢ༧ఆʣ • ςʔϒϧɾܕͷఆٛϞδϡʔϧ͝ͱʹఆٛ͢Δ •
prisma-import Λͬͯ݁߹͢Δ ◦ github.com/ajmnz/prisma-import • ϞδϡʔϧΛލ͍ͩjoinڐՄ͠ͳ͍ • ϞδϡʔϧΛލ͍ͩτϥϯβΫγϣϯݕ౼த
26 GraphQL • GraphQLͷεΩʔϚؚΊ֤ͯϞδϡʔϧ͕ཧ͢Δ • ΤϯτϦϙΠϯτͰεΩʔϚͱresolverΛ݁߹͢Δ
27 Ϟδϡʔϧؒ௨৴ • exportͨؔ͠Λݺͼग़͚ͩ͢ ◦ TypeScriptͷܕ͕͋ΔͷͰഁյతͳมߋʹΑͬͯյΕΔͱ͍͏͜ͱൃੜ͠ʹ͍ͣ͘ • ֎෦ͷϞδϡʔϧʹެ։͍ͯ͠Δػೳ͔Ͳ͏͔Λ໌ࣔͰ͖ΔΑ͏ʹ͢Δ ◦ modules/module-name
Լͷ index.ts Ͱ export ͨ͠ͷҎ֎֎෦͔Βར༻͠ͳ͍ ◦ eslint ͷ import/no-internal-modules Λ੍ͬͯݶ͢Δ
28 ςετ • NestJSͷDIΛͬͯࣗͷϞδϡʔϧҎ֎Λmock͢Δ • ଞͷϞδϡʔϧͷมߋʹΑͬͯςετ͕յΕͳ͍
29 ·ͱΊ • ϢϏʔϓϩμΫτ৫͕εέʔϧ͖ٕͯͯ͠ज़తෛ࠴Λฦ͍ͯ͠ΔϑΣʔζ • औΓΈͱٕͯ͠ज़ελοΫͷ౷ҰϞδϡϥϞϊϦεԽΛਐΊ͍ͯΔ • ָ͍࣌͠ظͳͷͰڵຯΛ࣋ͬͯ͘Εͨํ͔͚͍ͯͩ͘͞ʂ
30 Ұॹʹͬͯ͘ΕΔํ ੵۃืूதʂ
31 UbieͰੵۃతʹ࠾༻Λߦ͍ͬͯ·͢ɻ͋ͳͨͷԠืΛ͓ ͍ͪͯ͠·͢ɻ ΧδϡΞϧ໘ஊԠืϑΥʔϜ We Are Hiring!