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.4k
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.2k
GraphQLの負債と向き合うためにやっていること
hokaccha
2
1.4k
ユビーのアーキテクチャに対する取り組み
hokaccha
1
370
RailsエンジニアのためのNext.js入門
hokaccha
7
19k
Cookpad Summer Internship 2021 Web Frontend
hokaccha
0
7.1k
巨大なモノリシック Rails アプリケーションの マイクロサービス化戦略 / 2019 microservices in cookpad
hokaccha
3
3.8k
巨大なRailsアプリケーションを「普通」にするための取り組み
hokaccha
1
930
Web Frontend Improvement in Cookpad
hokaccha
1
1k
cookpad summer internship 2018 - Git
hokaccha
1
9.6k
Other Decks in Technology
See All in Technology
30分でわかる『アジャイルデータモデリング』
hanon52_
9
2.7k
抽象化をするということ - 具体と抽象の往復を身につける / Abstraction and concretization
soudai
18
7.3k
現場の種を事業の芽にする - エンジニア主導のイノベーションを事業戦略に装着する方法 -
kzkmaeda
2
2.1k
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
6
57k
Data-centric AI入門第6章:Data-centric AIの実践例
x_ttyszk
1
410
インフラをつくるとはどういうことなのか、 あるいはPlatform Engineeringについて
nwiizo
5
2.6k
人はなぜISUCONに夢中になるのか
kakehashi
PRO
6
1.7k
AndroidXR 開発ツールごとの できることできないこと
donabe3
0
130
PHPで印刷所に入稿できる名札データを作る / Generating Print-Ready Name Tag Data with PHP
tomzoh
0
110
OpenID Connect for Identity Assurance の概要と翻訳版のご紹介 / 20250219-BizDay17-OIDC4IDA-Intro
oidfj
0
280
Developer Summit 2025 [14-D-1] Yuki Hattori
yuhattor
19
6.2k
データの品質が低いと何が困るのか
kzykmyzw
6
1.1k
Featured
See All Featured
Designing Experiences People Love
moore
140
23k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.4k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
What's in a price? How to price your products and services
michaelherold
244
12k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
100
18k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.6k
Into the Great Unknown - MozCon
thekraken
35
1.6k
How STYLIGHT went responsive
nonsquared
98
5.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
46
2.3k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
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!