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
Typescriptで始めるGraphQL入門_LG勉強会.pdf
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
るりいろぼうや
July 10, 2025
Technology
24
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Typescriptで始めるGraphQL入門_LG勉強会.pdf
るりいろぼうや
July 10, 2025
More Decks by るりいろぼうや
See All by るりいろぼうや
登竜門Hack2026_AI勉強会_講義資料
ruribou
0
23
!コスパよくインターンに受かる方法!
ruribou
1
280
『From Techer To Future』を体現するという宣誓
ruribou
0
48
僕がイベント運営をする理由
ruribou
0
81
優秀じゃないのはみんな同じだって、そろそろ気づきませんか?
ruribou
1
190
Lovendar
ruribou
1
42
Other Decks in Technology
See All in Technology
「勝手に広まる」人気 AI エージェントを爆速で作ろう!(AWS Summit Japan 2026講演資料)
minorun365
PRO
10
2.6k
SRE歴2ヶ月でも開発6年の知見を活かして、チームで止まっていた環境改善を前に進めた話
a_ono
0
110
2026-06-24_人とAIの責務分離に基づく開発プロセスの提案.pdf
takahiromatsui
0
250
サイバーエージェントにおけるAI推進戦略と変革への取り組み
shotatsuge
0
610
「軸足」は 固定しなくていい - 熱量と強みで描く、しなやかなキャリアの形
kakehashi
PRO
1
280
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
11k
元・セキュリティ学習経験0大学生による業務紹介 / An Introduction to the Job by a Former College Student with Zero Security Training Experience
nttcom
0
940
【FinOps】データドリブンな意思決定を目指して
z63d
2
480
製造現場での生成AIの活用、およびエージェントAIの実装のあり方、AVEVAの取り組み
iotcomjpadmin
0
180
そこにあるから地図ができる~位置を示す"モノ"を愉しむ~ - Interface 2026年6月号GPS特集オフ会 / interface_202606_GPS_offline
sakaik
1
120
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
590
AIチャットの改善から見えた、良いAI体験とは / What Constitutes a Good AI Experience: Insights from Improving AI Chat
kubode
0
130
Featured
See All Featured
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
My Coaching Mixtape
mlcsv
0
160
Automating Front-end Workflow
addyosmani
1370
210k
Optimizing for Happiness
mojombo
378
71k
Leo the Paperboy
mayatellez
7
1.9k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
620
Building Flexible Design Systems
yeseniaperezcruz
330
40k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.8k
Into the Great Unknown - MozCon
thekraken
41
2.6k
HDC tutorial
michielstock
2
720
The untapped power of vector embeddings
frankvandijk
2
1.8k
Transcript
Typescript Ͱ࢝ΊΔ GraphQL ೖ גࣜձࣾϥϒάϥϑ ։ൃΠϯλʔϯ ઙҪྋଠ 2025/06/25 created by
ruribou
ࣗݾհ ઙҪ ྋଠʢ͍͋͞ Γΐ͏ͨʣ ౦ژిػେֶཧֶ෦ཧֶՊ ಛఆඇӦར׆ಈ๏ਓ NxTEND झຯ↓ ཱྀɺٿ؍ઓɺΞΠυϧϚελʔ
ࠓճ͢͜ͱ • GraphQLͱͳʹ͔ • ۩ମతͳ࣮ • ࣮ࡍʹୟ͍ͯΈΔ͜ͱ
ࠓճ͞ͳ͍͜ͱ • GraphQLͷ࣮༻ੑ • Ԡ༻ྫ
GraphQL ͱͳΜͧ
HTTPܦ༝ͰDBαʔϏεΛૢ࡞͢Δ ͨΊͷSQLతͳݴޠʴΈ
۩ମతͳҧ͍ • ΫϥΠΞϯτओಋͰඞཁͳใ͚ͩΛऔಘ • RailsͷREST APIͩͱɺ/users/1 → ݻఆͷJSON͕ؼͬͯ͘Δͷʹରͯ͠GraphQLΫϥΠ Ξϯτ͕{ user(id:1)
{ id, name, posts { title } } } ͷΑ͏ʹɺʮͲͷϑΟʔϧυ͕΄͍͔͠ʯ Λࣗ༝ʹهड़Ͱ͖Δ • ୯ҰΤϯυϙΠϯτ & ౷Ұతͳૢ࡞Ϟσϧ • Rails ͷίϯτϩʔϥ×HTTPϝιουʢGET/POST/PUT/DELETEʣͰଟͷΤϯυϙΠϯ τΛཧ͢ΔΘΓʹɺGraphQL جຊతʹ /graphql 1͚ͭͩ
࣮ฤ
ࠓճͷٕज़ߏ Typescript + Hono + Prisma + Supabase + GraphQL
Hono • ຊਓ͕࡞ͬͨɻTypescriptͷܰྔͰߴੑೳͳWebϑϨʔϜϫʔΫɻ • όοΫΤϯυΊͪΌΫιָɻ
Prisma • ݴΘͣͱΕͨJavascipt / Typescript ͷORM • σʔλϕʔεϚΠάϨʔγϣϯͰ͖ΔΑ
Supabase PostgreSQL ΛϕʔεʹೝূɾετϨʔδɾϦΞϧλΠϜػೳΛඋ͑ͨ ΦʔϓϯιʔεͷόοΫΤϯυଈ੮αʔϏε
ࠓճ߃ྫ͚ͩͲTodoΞϓϦͰ ࣮͍ͯ͘͠Α
PrismaͷεΩʔϚ model Todo { id Int @id @default(autoincrement()) title String
completed Boolean @default(false) createdAt DateTime @default(now()) }
GraphQL εΩʔϚఆٛ export const schema = ` type Todo {
id: Int! title: String! completed: Boolean! createdAt: String! } type Query { todos: [Todo!]! } type Mutation { addTodo(title: String!): Todo! toggleTodo(id: Int!): Todo! deleteTodo(id: Int!): Boolean! } `; ɾʮʂʯඞਢΧϥϜ ɾܕఆٛͱ۩ମతͳૢ࡞Λ QueryͱMutationͰఆٛ
QueryͱMutationͱ • Query • CRUDͷRʢREADʣΛ୲ • RESTͰ͍͏ͱGET • Mutation •
CRUDͷCʢCreateʣ, UʢUpdateʣ, DʢDELETEʣΛ୲ • RESTͰ͍͏ͱPOST/PUT/PATCH/DELETE͋ͨΓ • Subscription • αʔόʔͷߋ৽ΛϦΞϧλΠϜͰ௨ʢྫɿଞਓͷૢ࡞Λଈ࣌มߋʣ • ࠓճΘͳ͍
Resolver ͷ࣮
ResolverͬͯͳΜͧ • SchemaͰԿ͕Ͱ͖Δ͔Λఆٛ͠ɺ͜ͷResolverͰͦΕΛͲ͏࣮ݱ͢Δ͔Λ࣮͢Δ • ۩ମతͳCRUDૢ࡞ͷதͱݴ͑Δ • SchemaͰఆٛ͞ΕͨQueryMutation͕࣮ࡍʹͲͷΑ͏ʹͯ͠σʔλΛऔಘɺมߋ͢Δ ͷ͔Λ۩ମతʹ࣮
۩ମతͳ࣮ const rootResolver: RootResolver = () => ({ todos: async
() => { const todos = await prisma.todo.findMany({ orderBy: { createdAt: 'desc' } }); return todos.map(todo => ({ ...todo, createdAt: formatDate(todo.createdAt), })); }, addTodo: async ({ title }: { title: string }) => { const todo = await prisma.todo.create({ data: { title } }); return { ...todo, createdAt: formatDate(todo.createdAt), }; }, toggleTodo: async ({ id }: { id: number }) => { const todo = await prisma.todo.findUnique({ where: { id } }); if (!todo) throw new Error('Not found'); const updated = await prisma.todo.update({ where: { id }, data: { completed: !todo.completed }, }); return { ...updated, createdAt: formatDate(updated.createdAt), }; }, deleteTodo: async ({ id }: { id: number }) => { const todo = await prisma.todo.findUnique({ where: { id } }); if (!todo) return false; await prisma.todo.delete({ where: { id } }); return true; }, });
ΫΤϦૢ࡞Λͯ͠ΈΔ
͕ࣗೖͨ͠ײ • ΫϥΠΞϯτ͕ຊʹඞཁͳใͷΈΛ͚ͨͨΔͷ͕ྑ͍ • REST APIͩͱʮޙ͔Β͜ͷใ͕ཉ͍͠ʯʮ͜ͷใ༨ܭͩʯΈ͍ͨͳ͜ͱ͕ ݁ߏى͖͏Δ • ܕ͖εΩʔϚͳͷͰɺͲΜͳΫΤϦ͕͛ΒΕΔͷ͔Ϩεϙϯεʹ͍ͭͯɺܕͱͯ͠ ѲͰ͖Δ҆৺ײ͕͋Δ
• Honoͱ૬ੑ͕ྑ͔ͬͨͷͰخ͍͠