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
QAエンジニア起点で進める、SmartHRにおける信頼性向上について
kaomi_wombat
1
140
TypeScript入門 2026
recruitengineers
PRO
3
570
グローバル基準のSREは、運用現場でどう機能したか:成熟度アセスメントの実践 / SRE NEXT 2026
sorawatanabe
0
220
第3回しろおびセキュリティスポンサーセッション
log0417
0
180
サイバー捜査員研修(前半)
nomizone
1
2k
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
240
ボトムアップ文化が強い組織で セキュリティをどう根付かせていくかの現在進行形の話 / Making Security Stick in a Bottom-Up Organization
yamaguchitk333
0
220
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
19k
老害フォレンジッカーはAI羊の夢を見るか?
tadmaddad
0
320
JavaScript 研修 (2026)
recruitengineers
PRO
2
530
【CEDEC2026】専門性の高いデフォルメチームが挑んだ人材育成戦略 〜Cygames Academiaの企画から実施まで〜
cygames
PRO
0
590
【CEDEC2026】Creative Approaches to Localizing the Dialects and Unique Speech of Umamusume: Pretty Derby Characters in English
cygames
PRO
3
5.7k
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.4k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
240
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
320
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
490
Testing 201, or: Great Expectations
jmmastey
46
8.2k
Being A Developer After 40
akosma
91
590k
It's Worth the Effort
3n
188
29k
We Have a Design System, Now What?
morganepeng
55
8.3k
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ͱ૬ੑ͕ྑ͔ͬͨͷͰخ͍͠