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.5k
GraphQLの負債と向き合うためにやっていること
hokaccha
2
1.4k
ユビーのアーキテクチャに対する取り組み
hokaccha
1
400
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
970
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
Rebase エンジニアリング組織の現状とこれから
rebase_engineering
0
110
シンプルな設定ファイルで実現する AWS IAM Identity Center のユーザー管理と開発チームへの委譲 / Delegating AWS IAM Identity Center User Management with a Simple DSL
yamaguchitk333
3
440
Oracle Database オプティマイザ・ヒントの活用
oracle4engineer
PRO
1
120
グループ ポリシー再確認 ③
murachiakira
0
140
初参加のハノーバーメッセで感じた世界最大級イベントの熱気とAI活用の未来
hamadakoji
0
210
熱々🔥のUDN🍜を喰らえ❗マルチテナントもVM統合も思いのまま❗新機能で切り拓くk8sネットワークの未来
tsukaman
0
190
AIの電力問題を概観する
rmaruy
0
160
AWS LambdaをTypeScriptで動かして分かった、Node.jsのTypeScriptサポートの利点と課題
smt7174
1
2.8k
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
24k
変化に強いテーブル設計の勘所 / Table design that is resistant to changes
soudai
47
13k
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
730
AWS LambdaでSocket通信サーバーレスアプリケーションのリアルタイム通信 / 20250523 Kumiko Hennmi
shift_evolve
1
300
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.5k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
Build The Right Thing And Hit Your Dates
maggiecrowley
35
2.7k
Side Projects
sachag
453
42k
Speed Design
sergeychernyshev
30
960
How STYLIGHT went responsive
nonsquared
100
5.6k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
Adopting Sorbet at Scale
ufuk
76
9.4k
Become a Pro
speakerdeck
PRO
28
5.3k
The Cult of Friendly URLs
andyhume
78
6.4k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.8k
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!