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
るりいろぼうや
July 10, 2025
Technology
26
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
33
!コスパよくインターンに受かる方法!
ruribou
1
320
『From Techer To Future』を体現するという宣誓
ruribou
0
51
僕がイベント運営をする理由
ruribou
0
82
優秀じゃないのはみんな同じだって、そろそろ気づきませんか?
ruribou
1
200
Lovendar
ruribou
1
45
Other Decks in Technology
See All in Technology
その“隠したつもり”が命取り ── 自前と平文をやめて「正解」に委ねる
kuroneko13
0
120
変化の早いClaude Codeを 書籍に落とし込む
oikon48
7
1.4k
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
570
トヨタ⽣産⽅式(TPS)⼊⾨
recruitengineers
PRO
3
810
認知負荷をGemini で溶かす — GKE 基盤「Orbit」における AI エージェントの実践
sansantech
PRO
1
300
モバイルアプリ開発概論2026
recruitengineers
PRO
5
590
システム思考で問題に対処する
yussak
0
280
QAエンジニア起点で進める、SmartHRにおける信頼性向上について
kaomi_wombat
1
140
ハーレムエンジニアリング
kazuma777777
0
150
AIエージェントを前提としたプラットフォーム エンジニアリング:GKEで作るAgent-Ready Golden Path
legalontechnologies
PRO
2
230
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
9k
社内の7割が使うデータ基盤を、 データチーム2人で回すためにやったこと
koh_yoshi
4
1.3k
Featured
See All Featured
Speed Design
sergeychernyshev
33
2k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
700
What's in a price? How to price your products and services
michaelherold
247
13k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
How STYLIGHT went responsive
nonsquared
100
6.2k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
340
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
470
HDC tutorial
michielstock
2
790
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
320
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
220
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
200
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ͱ૬ੑ͕ྑ͔ͬͨͷͰخ͍͠