
- TOP
- ã¿ã°äžèЧ
- Next.js
Next.js
ã€ãã³ã
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
ãã¬ãžã³

æè¡ããã°
ããã«ã¡ã¯ãæ°å3幎ç®ã§ããžãã¹ã€ãããŒã·ã§ã³çµ±æ¬æ¬éšITD1-3ã®å å·ã§ãã æçšããŠããããŒããŒã㯠GoForty v2ã®Orthoé
å ã§ãã ä»åãç§ãæ®æ®µã®æ¥åã§äœ¿çšããŠããTypeScriptãããŒãã«ãã倧åã«ã³ãã¡ã¬ã³ã¹ãTSKaigi 2026ãã®åå ã¬ããŒããæžãããŠããã ããŸããïŒ å»å¹Žã®åå ã¬ããŒãèšäºã«åŒãç¶ããã«ã³ãã¡ã¬ã³ã¹ã®æ§åãææ³ãé
åãªã©ãçºä¿¡ããŠãããŸã TSKaigi2025ã§åãã£ãTypeScriptã®æµè¡ âä»å¹Žã®æå¿«ãªTSKaigiåå ã¡ã³ããŒãã¡ ã«ã³ãã¡ã¬ã³ã¹æŠèŠ æ
å ±åºå ã«ã³ãã¡ã¬ã³ã¹è©³çް ã€ãã³ãå TSKaigi 2026 é嬿¥ 2026/05/22ã2026/05/23 éå¬å Žæ ãã«ãµãŒã«çŸœç° 京æ¥ç©ºæž¯ç·çŸœç°ç©ºæž¯ç¬¬3ã¿ãŒããã«é§
ããåŸæ©5å ããã·ã§ã³ åŠã³ãç¹ããã"å"ãç Žãã ã»ãã·ã§ã³ææ³ ããã§ã¯ç§ãåå ããã»ãã·ã§ã³ã®äžã§ãç¹ã«é¢çœãã£ããã®ãèªåãªãã®çè§£ã亀ããŠç޹ä»ããŸã ã»ãã·ã§ã³ææ³â å®è·µTanStack Start: æ°èŠãããã¯ããéçºããŠç¢ºç«ããããµãŒããŒãšã¯ã©ã€ã¢ã³ãå¢çã®èšèšãã¿ãŒã³ ã»ãã·ã§ã³æŠèŠ https://2026.tskaigi.org/talks/26 ã¹ããŒã«ãŒ Shimmy ã¹ã©ã€ãè³æ https://speakerdeck.com/kaminashi/practical-tanstack-start-server-client-boundary-patterns?slide=3 Next.js ãšåã React åããã«ã¹ã¿ãã¯ãã¬ãŒã ã¯ãŒã¯ã§ãã TanStack Start  ã«é¢ããã»ãã·ã§ã³ã§ãããŸã v1.0 æªæºã§ã³ãã¥ããã£ãäºäŸãå°ãªãäžã å®éã«æ¡çšããæ°èŠãããã¯ãã®èšèšç¥èŠ ãèãã貎éãªå
容ã§ããã loader ãš Server Functions ã®è²¬åèšèš TanStack Start ã䜿ãäžã§æ žå¿ãšãªãã®ãããã®2ã€ã®è²¬åãã©ãåããããšããåé¡ã§ãã åœ¹å² loader ããŒãžæç»ãåãã«èµ°ãåŠçãæžãå Žæ Server Functions ã¯ã©ã€ã¢ã³ãããåŒã³åºãããµãŒããŒåŽã®åŠç Next.js ã§ã¯ãã®2ã€ã®æåããã¬ãŒã ã¯ãŒã¯åŽã§ãããããæ±ºãŸã£ãŠããŸããäžæ¹ TanStack Start ã¯ãã©ã¡ãã«äœãæžããã éçºè
èªèº«ã決ãã èšèšã§ãã ãã®éãã¯éçºäœéšã«ãçŸããŸããNext.js ã¯ãã£ãã·ã¥æåããã¬ãŒã ã¯ãŒã¯å
éšã§èªåçã«æ±ºãŸããããããªãããŒã¿ãå€ããŸãŸè¡šç€ºãããã®ããã調ã¹ãããã«å
éšå®è£
ãèªã¿èŸŒãããšãå°ãªããããŸãããTanStack Start ã¯ãã¹ãŠã®æåãèªåãã¡ã®ã³ãŒãã«æç€ºããèšèšã®ããã åäœãžã®çè§£ãä¿ã£ããŸãŸéçºã§ãã ãšããã¡ãªããããããŸãã èšèšãã¿ãŒã³ïŒloader ç·š loader å
ã®ååŸã¯æå°éã«çããåã³ã³ããŒãã³ããå¿
èŠãªããŒã¿ãèªåã§ååŸãã ãšããã¢ãããŒãã§ãã // loader ã§ã¯èªèšŒæ
å ±ãã tenantId ã ããåãåºãexport const Route = createFileRoute("/_authed/orders")({ loader: ({ context: { session } }) => ({ tenantId: session.tenantId }), component: OrdersPage,});// åã³ã³ããŒãã³ãã useQuery ã§å¿
èŠãªããŒã¿ãååŸããfunction OrdersPage() { const { tenantId } = Route.useLoaderData(); const { data } = useSuspenseQuery(ordersQueryOptions(tenantId)); return ( <> <NotificationBadge /> {/* åã®äžã§ useQuery */} <OrdersTable orders={data} /> <Recommendations /> {/* åã®äžã§ useQuery */} </> );} // loader ã§ã¯èªèšŒæ
å ±ãã tenantId ã ããåãåºã export const Route = createFileRoute ( " /_authed/orders " )( { loader : ({ context : { session } }) => ( { tenantId : session . tenantId } ) , component : OrdersPage , } ) ; // åã³ã³ããŒãã³ãã useQuery ã§å¿
èŠãªããŒã¿ãååŸãã function OrdersPage () { const { tenantId } = Route . useLoaderData () ; const { data } = useSuspenseQuery ( ordersQueryOptions ( tenantId )) ; return ( <> < NotificationBadge /> { /* åã®äžã§ useQuery */ } < OrdersTable orders ={ data } /> < Recommendations /> { /* åã®äžã§ useQuery */ } </> ) ; } èšèšãã¿ãŒã³ïŒServer Functions ç·š â æšªæé¢å¿äºã¯ Middleware ãžåãåºã ãã°åºåãèªèšŒãã§ãã¯ãªã©ãè€æ°ã® Server Functions ã«å
±éããåŠç㯠handler ã«çŽæ¥æžãããMiddleware ãšããŠåé¢ããŸãã export const loggerMiddleware = createMiddleware({ type: "function" }).server( async ({ next, functionId }) => { const requestId = crypto.randomUUID(); logger.info({ requestId, functionId }, "handler:start"); return next({ context: { requestId } }); },); export const loggerMiddleware = createMiddleware ( { type : " function " } ) . server ( async ({ next , functionId }) => { const requestId = crypto . randomUUID () ; logger . info ( { requestId , functionId }, " handler:start " ) ; return next ( { context : { requestId } } ) ; }, ) ; â¡ handler ã«ã¯ããžãã¯ã I/O ã®è©³çްãçŽæ¥æžããªã handler ã¯ãåãåã£ãŠå§è²ãããã ãã«ãšã©ããå®è£
ã®è©³çްã¯å¥ã®é¢æ°ã«ä»»ããŸãã export const saveOrder = createServerFn({ method: "POST" }) .middleware([loggerMiddleware]) // 暪æé¢å¿äº .inputValidator(saveOrderInputSchema) // å
¥åã®æ€èšŒ .handler(async ({ data }) => upsertOrder(data), // ããžãã¯ã¯å¥é¢æ°ãžå§è² export const saveOrder = createServerFn ( { method : " POST " } ) . middleware ([loggerMiddleware]) // 暪æé¢å¿äº . inputValidator (saveOrderInputSchema) // å
¥åã®æ€èšŒ . handler ( async ({ data }) => upsertOrder (data) , // ããžãã¯ã¯å¥é¢æ°ãžå§è² ãã®èšèšã«ãã責åãèªç¶ãšåé¢ããã人éã«ã AI ã«ãèªã¿ãããã³ãŒãããŒã¹ãå®çŸã§ããŸãã ãŸãšã ãã TanStack Start ãæ°èŠãããã¯ããžå°å
¥ãããšããããNext.js ãšã®æå€§ã®éãã¯ããã¬ãŒã ã¯ãŒã¯ã«åäœãä»»ããããèªåãã¡ã§æç€ºãããããšããèšèšææ³ã®å·®ã§ãã 䜿ãåãã®ç®å®ãšããŠã¯ãSEOãé«éãªåæè¡šç€ºãæ±ãããããµãŒãã¹ããŸãã¯ããŒã ã« Next.js ã®ç¥èŠãè±å¯ãªå Žå㯠Next.js ãç¡é£ã§ããäžæ¹ãè€éãªãµãŒããŒïŒã¯ã©ã€ã¢ã³ãéã®ããŒã¿ãããŒãèªåãã¡ã§å¶åŸ¡ãããå Žåããã³ãŒãããŒã¹ã®æåãé
ã
ãŸã§ææ¡ãããå Žå㯠TanStack Start ãåããŠãããšãããŸãã Next.js ã«æ
£ã芪ããã§ããã»ã©ãæåã¯èªç±åºŠã®é«ãã«æžæããããããŸããããããä»å玹ä»ããèšèšãã¿ãŒã³ãæåããåãå
¥ããããšã§ãã³ãŒãããŒã¹ã®èŠéããä¿ã£ããŸãŸéçºãã¹ã¿ãŒãã§ããŸãã ããªããã®æåã«ãªãã®ãããææ¡ãããŸãŸéçºãããæ°èŠãããã¯ãã«ãããŠãTanStack Start ã¯æåãªéžæè¢ã«ãªãããã§ãã ã»ãã·ã§ã³ææ³â¡ãAIæä»£ã«èãããBranded Types ã§å®çŸããå
ç¢ãªåä»ã ã»ãã·ã§ã³æŠèŠ https://2026.tskaigi.org/talks/62 ã¹ããŒã«ãŒ æ± å¥¥è£å€ª / @yuta-ike ã¹ã©ã€ãè³æ https://www.docswell.com/s/4136989/Z6NJ78-tskaigi2026#p1 TypeScript ã®äžã§ãããã«å³æ Œãªåå®çŸ©ãè¡ã Branded Types ã«ã€ããŠããã®æçŸ©ãšå
·äœçãªé
åããããããã解説ããã»ãã·ã§ã³ã§ããã åãã§ãã¯ã®æçŸ© ãŸãåæãšããŠãåãã§ãã¯ã«ã¯4ã€ã®ãã¿ãŒã³ããããŸãã å®è£
åãã§ã㯠è©äŸ¡ æ£ãã éã å¬ãã ééã£ãŠãã éããªã æ£åžž æ£ãã éããªã ããããã»èŸã ééã£ãŠãã éã äžçªé¿ããã ãå®è£
ãééã£ãŠããã®ã«åãã§ãã¯ãéãããšã¯ãããšãã°æ¬¡ã®ãããªã±ãŒã¹ã§ãã <em>// è¶³ãç®é¢æ° (number + number â number)</em>function add(a: number, b: number): number { return 0; // åžžã« 0 ãè¿ã} < em > // è¶³ãç®é¢æ° (number + number â number)</em> function add ( a : number , b : number ): number { return 0 ; // åžžã« 0 ãè¿ã } è¶³ãç®ãæåŸ
ããŠããã®ã«åžžã« 0 ãè¿ã£ãŠããå®è£
ã§ãããæ»ãå€ã®å㯠number ãšããŠæ£ãããããåãã§ãã¯ã§ã¯æ€ç¥ã§ããŸããã ããã¯æ¥µç«¯ãªäŸã§ãããAI ã«å®è£
ãäŸé Œããéã«ããããšèŠã¯åé¡ãªãããã ããããèªããšæå³ããåŠçã«ãªã£ãŠããªãããšããçµéšãããæ¹ãããã®ã§ã¯ãªãã§ãããããããããåé¡ã«å¯ŸåŠããããã«ããã峿 Œãªåå®çŸ©ãæ±ããããŸããããã§æå¹ãªã®ã Branded Types ã§ãã Branded Types ãšã¯ åãæ§é ãæã¡ãªããæå³åãã®ç°ãªãåïŒäŸïŒ User ãš Book ïŒãåºå¥ããããã«ãæ¶ç©ºã®ãããã㣠__type ãä»äžããŠåãèå¥ããææ³ã§ãã User  åãæåŸ
ããåŒæ°ã«Â Book  åãæž¡ãããšãããšãåãã§ãã¯ã§ãšã©ãŒã«ãªããŸãã function createUser(user: User) { ... }const book: Book = { id: getUUID(), name: "åŸèŒ©ã¯ãšã³ãžãã¢ã§ãã", date: new Date(2000, 0, 1),} as Book;createUser(book); // TypeError: Book åã User åã«ä»£å
¥ã§ããªã function createUser ( user : User ) { ... } const book : Book = { id : getUUID () , name : " åŸèŒ©ã¯ãšã³ãžãã¢ã§ãã " , date : new Date ( 2000 , 0 , 1 ) , } as Book ; createUser (book) ; // TypeError: Book åã User åã«ä»£å
¥ã§ããªã ãããã¯ãéçºã«ããã Branded Types ã®äœ¿ãã©ãã ã»ãã·ã§ã³ã§ã¯ãBranded Types ã广çã«æŽ»çšããããã®æ¹éãšããŠ2ã€ã玹ä»ãããŠããŸããã â ãã¡ã€ã³ã¢ãã«ãåºå¥ãã 倿°åã§åºå¥ã§ããã°çæ³çã§ãããAI ã FailedUploadingFileId ã®ãããªäžå¯§ãªåœåãåžžã«ããŠããããšã¯éããŸããããããã FailedFileId çšåºŠã«ãªãããšãå€ãã§ããããBranded Types ãšåãã§ãã¯ãçµã¿åãããããšã§ããã®åºå¥ãã³ãŒãã¬ãã«ã§æ
ä¿ã§ããŸãã â¡ å€ã®ç¶æ
ã屿§ã衚çŸãã ããšãã°ããã¯ãšã³ããžéã string åã®å€ã«å¯ŸããŠããåãã§ãã¯æžã¿ãããã¡ã€ã³ãã§ãã¯ïŒèšå·ãå«ãŸãªããªã©ïŒæžã¿ããšããæ¡ä»¶ãæ¬åœã«æºãããŠãããã©ããã¯ãéåžžã®åå®çŸ©ã ãã§ã¯ä¿èšŒã§ããŸãããBranded Types ã䜿ãããšã§ãããããããã§ãã¯æžã¿ã®ç¶æ
ããåãšããŠè¡šçŸã§ããŸãã Branded Types ã«ãã£ãŠåå®å
šãªã³ãŒããæžãããšã§ãã³ãŒãã®ååŸãèªãŸãªããã°å€æã§ããªãã£ãèŠçŽ ããåå®çŸ©ãèŠãã ãã§ææ¡ã§ããããã«ãªããŸãã ãŸãšã AI ã³ãŒãã£ã³ã°ãæ®åããä»ãã³ãŒããæžãéãããããAI ãçæããã³ãŒããæ£ããæ€èšŒã§ãããããéèŠã«ãªã£ãŠããŸããBranded Types ãæ³šç®ãããŠããèæ¯ã«ã¯ããŸãã«ãã®å€åããããšèããŠããŸãã åå®çŸ©ã峿 Œã«ããŠããããšã§ãAI ãçæããã³ãŒããæå³éããã©ããããã³ãŒãã现ããèªãŸãªããŠãåãã§ãã¯ã®æ®µéã§æ€ç¥ã§ããããã«ãªããŸããã颿°ã®åŒæ°ã»æ»ãå€ã®åã峿 Œã«å®çŸ©ããããå¯äœçšãæãããªãããšãã£ãæ¹éãã¬ãã¥ãŒã³ã¹ãåæžã«ã€ãªããäºäŸãšããŠæãã£ãŠããäžã§ãBranded Types ã¯ããããæµããšç¹ã«çžæ§ã®è¯ãã¢ãããŒãã§ãã ãAI ã«å®è£
ãä»»ããæ©äŒãå¢ããããšæããŠããæ¹ã»ã©ãå°å
¥ãæ€èšãã䟡å€ããããšãããã§ãããã äŒæ¥ããŒã¹ ä»å¹Žã1æ¥ç®ã«ããªãã®æ°ãåãããŠããã ããŸããïŒ å»å¹Žãšã¯éããã¹ã¿ã³ãã©ãªãŒã¯äŒæ¥åå¥ã«åºåãããŠããããã©ã®ããŒã¹ã«è¡ã£ãŠãããã®é²æãå¿ããŠããŸãããšããã°ãã°ãããŸãã... (ä»å¹Žã¯ã©ã ãããšãŠãå€ãã£ãã§ããå¬ãã) ã»ãã·ã§ã³ææ³ã«åãå
¥ãéããŠãæåæ°ãããªãå€ããªã£ãŠããŸã£ãã®ã§ãä»åã¯1瀟ããã ãã®ç޹ä»ã«ãªããŸã... ãã€ã©ãŒæ ªåŒäŒç€Ÿ ãã€ã©ãŒæ ªåŒäŒç€Ÿã¯ãTSKaigiã«åå ãããŠããäŒæ¥ã®äžã§ç¹ã«å°è±¡ã«æ®ã£ãäŒç€Ÿã§ããTypeScriptã®ç¹åŸŽçãªäºæ¥æŽ»çšäºäŸãæã€äŒç€Ÿã§ããã®å
容ããšãŠãè峿·±ãã£ãã®ã§ã玹ä»ããŸãã å
·äœçã«ã¯ããšã³ã¿ãŒãã©ã€ãºåãã®å€§èŠæš¡ãªERPã10åã®éãã§æ§ç¯ã§ãããäžçåã®ãããã¬ã¹ERPãã©ãããã©ãŒã ãäºæ¥ãšããŠæäŸããŠããŸãã äŒç€ŸããŒãž ERPïŒEnterprise Resource PlanningïŒãšã¯ãäŒæ¥ã®åºå¹¹æ¥åïŒäŒèšã»åšåº«ã»äººäºã»è²©å£²ãªã©ïŒãäžå
管çããã·ã¹ãã ã®ããšã§ãMicrosoftãFreeeãªã©ã®ãµãŒãã¹ãæåã§ãã ãããããã®ãã©ãããã©ãŒã ã¯äŒç€Ÿç¬èªã®Reactã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ã§éçºãããŠããããã®ä¿å®éçšã¯ãã¡ãããå°éãšã³ãžãã¢ãšããŠéçºãµããŒããæ
ã£ãŠãããšã®ããšã§ããã ç¬èªãã¬ãŒã ã¯ãŒã¯ïŒapp-shellïŒã®ãªããžã㪠äŒç€Ÿã®äºæ¥ãšããŠç¬èªã®ãã¬ãŒã ã¯ãŒã¯ãéçºããã ãã§ãªãããã®éçºãµããŒããã€ãŸãããã¯ãªãŒãçãªããšãæ
ã£ãŠãããšããã®ã¯ããšã³ãžãã¢ãšããŠçŽç·ã«è§Šãããã®ããããŸããã TSKaigiã«åå ã㊠å»å¹ŽãããAIã®æŽ»çšãããããã»ãã·ã§ã³ããããŸãããããã以äžã«åå®çŸ©ã峿 Œã«ããBranded Typesãæè¿åºãŠããTanstack Startã«é¢ããå
容ãè€æ°ãã£ãã®ãé©ãã§ããã ç¹ã«Branded Typesã«é¢ããŠã¯AIã«å®è£
ãä»»ããããšãå€ããªã£ããããããåãã§ãã¯ãéããåè³ªã®æ
ä¿ã«æ³šç®ãããŠããã®ããªããšæããŠããŸãã å»å¹Žã«åŒãç¶ããã»ãã·ã§ã³ãäŒæ¥ããŒã¹ã§TypeScriptãããã³ããšã³ãã®æµè¡ãåŠã¶ããšãã§ãããšãŠã貎éãªçµéšã«ãªããŸããïŒ æ¥åã¯ãã¡ãããã©ã€ããŒãã§ã®éçºã¢ããã«ãç¹ãã£ãã®ã§ããããããéçºã«å±ãã§ããããæåã§ãã ããŸã å»å¹Žã«åŒãç¶ãããµãã©ã€åããšãŠãè¯ãã£ãã®ã§ã瀟å¡èšŒã«ä»ããããŠããã ããŠãŸãïŒ ä»å¹Žã¯å
端ãã«ã©ãã(?)ã«ãªã£ãŠãããä»ãããããªã£ãŠããŸãããããããšãããããŸãã ãŸãã1æ¥ç®ã®ãªãŒããã³ã°ãçµãã£ãçŽåŸãèŠèŠãã®ããããŒããŒããèŠãããŠã声ããããéãXã§äžæ¹çã«åãäžããŠãæã¢ããWeztermã®äººãšã話ãããããšãã§ããŸããïŒ ã¢ããã¿ãŒããã«ã«ã«ã¹ã¿ãã€ãºãããïŒWezTermïŒ ç¹åŸŽçãªããŒããŒãã¯ååºã«ãªããŸã() âWeztermã®æ¹ã®ããŒããŒãããç§ã®ããŒããŒãâ
ããã«ã¡ã¯ããšã¹ã»ãšã ã»ãšã¹ã§ã«ã€ãã±ã³ãã¯ãã®SREãããŠãã å°ç¬ åç¿å€ª ã§ãã 2026幎7æ10æ¥ã«éå¬ããã SRE NEXT 2026 ã®ã¹ãã³ãµãŒã»ãã·ã§ã³ã§ãã PRåäœã§äœ¿ãæšãŠãã«ã€ãã±ã³ãã¯ãã®previewç°å¢ã®èšèšãšéçš ããšããã¿ã€ãã«ã§çºè¡šããŸããã çºè¡šã¹ã©ã€ããå
¬éããŠããŸããããã£ããåãçµã¿ã«ã€ããŠæç« ããŸãšããã®ã§ããã¯ããã°ã«ãå±éããããšæãããŸãšãçŽãããã®ããã¡ãã®èšäºãšãªããŸããçºè¡šå
容ã«å ããŠãããŒã¹ã§å±ç€ºããŠããçŸåšã®previewç°å¢ã®ã¢ãŒããã¯ãã£ã«ã€ããŠã®è£è¶³èª¬æãå çããŠããã®ã§ããã¡ãã¯çºè¡šãšã®å·®åãšãªã£ãŠããŸãã ã¯ããã« å
šäœã®è©±ã¯ã²ãšããšã§ãããšã æ¢åãããã¯ãã«PRåäœã§äœ¿ãæšãŠãããpreviewç°å¢ãå°å
¥ãã1幎ééçšããŠãã話 ã§ãã ç®æ¬¡ ã¯ããã« ç®æ¬¡ ã«ã€ãã±ã³ãã¯ããšéçºãã§ãŒãº ã«ã€ãã±ã³ãã¯ããšã¯ ã·ã¹ãã ã¢ãŒããã¯ã㣠éçºãã§ãŒãº åœæã®ãªãªãŒã¹ãã㌠ãªãªãŒã¹ãã¬ã€ã³ã®èª²é¡ 1. ãªãªãŒã¹åšæãé·ã 2. QAç°å¢ã®å©çšãè©°ãŸã 3. æ
åœè
ã®è² æ
ã倧ãã 解決çïŒ æ€èšŒäœæ¥ãåé¢ããŠäžŠååãã previewç°å¢ãã©ãèšèšããã å¿
é èŠä»¶ ã€ã³ã¿ãŒãã§ãŒã¹èšèš ã¢ãŒããã¯ã㣠ãããã€ãã㌠ãµãŒãã¹æ§æ èšèšæã«èããããš éçšããŠã©ãã ã£ãã çãã©ãããªãªãŒã¹é »åºŠãé«ãããã æ®µéçã«æ¹åããªããè²ãŠã çµæçã«å©çšã䌞ã³ã éçšããŠããã£ãããš 1. è€è£œæ©æ§ã®å©çšæè¡ã«ã€ããŠããã£ãããš 2. è€è£œãã§ããªããå€éšãµãŒãã¹ãšã®ä»ãåãæ¹ãé£ãã 3. previewç°å¢ã®æ³å®å€ãªéèŠãèŠãã ãŸãšã ä»é²: çŸåšã®ã¢ãŒããã¯ãã£ã®çŽ¹ä» ã«ã€ãã±ã³ãã¯ããšéçºãã§ãŒãº ã«ã€ãã±ã³ãã¯ããšã¯ æåã«ãç§ãã¡ãæ±ã£ãŠããã·ã¹ãã ãã«ã€ãã±ã³ãã¯ããã¯ãä»è·/é害çŠç¥äºæ¥è
åãçµå¶æ¯æŽãè¡ãSaaSãããã¯ãã§ãã ã·ã¹ãã ã¢ãŒããã¯ã㣠ã«ã€ãã±ã³ãã¯ãã®ã·ã¹ãã ã¢ãŒããã¯ãã£ã¯ãæ¡åŒµæ§ãšç¬ç«æ§ãä¿ã€ãããã¡ã€ã³ããšã«ã¢ããªãšDBãåå²ããŠèšèšããŠããŸãã å©çšãããŠããæè¡ã¹ã¿ãã¯ãšæ¬çªç³»ã®åºç€æ§æã¯æ¬¡ã®ãšããã§ãã ã¬ã€ã€ãŒ æè¡ã¹ã¿ã㯠æ¬çªç³»ã®åºç€æ§æ ããã³ããšã³ã React / Next.jsã«ããSPA CloudFront + S3 ããã¯ãšã³ã Kotlin / Spring Boot / GraphQL ECS Fargateã§ãã¹ãã£ã³ã°ã5ã€ã®ã¿ã¹ã¯ã§GraphQL APIãæ§æ DB PostgreSQL RDS Aurora PostgreSQL ãŸããæ¬äœãµãŒãã¹ãšã¯å¥ã®è€æ°ã®ç€Ÿå
ãµãŒãã¹ãšã飿ºããŠãããããã¯ãšã³ãã®ã³ã³ããæ°ããèãããšäžèŠæš¡ãµã€ãºã®ã·ã¹ãã ãšæããŠããããšè¯ãããã§ãã éçºãã§ãŒãº ãããã¯ãã¯åæã®éçºãã§ãŒãºãå®äºãããããã¯ãã®äŸ¡å€ãæ¡å€§ãããæ©èœè¿œå ã»ãµãŒãã¹æ¡å€§ãã§ãŒãºããžç§»è¡ããããšããŠããã¿ã€ãã³ã°ã§ããã ãã®ããã ãããã¯ãéçºã®çç£æ§ãæ¯ããããã«æ©èœéçºãå éãããå¿
èŠããã£ã ãšããã®ãèæ¯ã§ãã åœæã®ãªãªãŒã¹ãã㌠ãã®ãããªéçºã®äºæ
ããããªãã§ãåœæã®ãªãªãŒã¹ãããŒã¯ä»¥äžã®ããã«ãªã£ãŠããŸããã åœæã®ãªãªãŒã¹ãã㌠ãããã€å
ã®AWSç°å¢ã¯Dev, QA, Staging, Productionã®4ã€çšæããŠãããã䜿ãåããŠããŸããã ãŸãéçºãã§ãŒãºã§ã¯ãéçºè
ãPRãçšæããŠãã¹ããéãã°mainã«ããŒãžããŠDevç°å¢ã«ãããã€ããŠããŸãããDevç°å¢ã¯éçºè
ãæåã«ãããã€ããAWSç°å¢ã§ãå°ãå£ããããã®ã§ããã¢ããªã®åäœæ€èšŒãåºç€ã®æ§æå€æŽã®æ€èšŒãè¡ãçšéã§å©çšãããŠããŸããã äžæ¹ã§ãæ¬çªç³»ãžã®ãªãªãŒã¹ãã§ãŒãºã§ã¯ããããšã¯å¥ã§ ãªãªãŒã¹æ
åœããªãªãŒã¹ãããžã£ãŒãäž»å°ããŠãããã€ããæ¹åŒ ãåã£ãŠããŸããã å
·äœçã«ã¯ä»¥äžã®æµãã§ãªãªãŒã¹ãè¡ãããŠããŸããã ãªãªãŒã¹æ
åœããªãªãŒã¹ããrevisionãæ±ºããŠã³ãŒãããªãŒãºãè¡ãããã®revisionã§QAç°å¢ãžãããã€ãã å
šQAã¡ã³ããŒãQAç°å¢ãå æããŠæ€èšŒäœæ¥ã宿œ ãªãªãŒã¹æ
åœããªãªãŒã¹ã¿ã°ãäœæããStagingç°å¢ãžãããã€ãã ãªãªãŒã¹æ
åœããã¹ãã©ã³ããŒã§E2Eãã¹ããå®è¡ãã ãªãªãŒã¹æ
åœããªãªãŒã¹ã¿ã°ãäœæããProductionç°å¢ãžãããã€ãã QAç°å¢ã¯ããŒãžã§ã³ãåºå®ããŠæ€èšŒãè¡ãããã®å°çšç°å¢ãStagingç°å¢ã¯E2Eãã¹ããå®è¡ããŠæå³ããªããã°ã¬ãçºçããªãããšãä¿èšŒããããã®ç°å¢ãšãã建ä»ãã§ããã ã€ãŸãããããã ãªãªãŒã¹ãã¬ã€ã³æ¹åŒã§ãªãªãŒã¹ ããŠããŸããã ãªãªãŒã¹ãã¬ã€ã³ã®èª²é¡ ãã®ãããžã§ã¯ãã«ããããªãªãŒã¹ãã¬ã€ã³ã«ã¯å€§ãã以äž3ã€ã®èª²é¡ããããŸããã 1. ãªãªãŒã¹åšæãé·ã æã倧ããªèª²é¡ã¯ãªãªãŒã¹åšæãé·ãããš ã§ãããã®ãããžã§ã¯ãã®ãªãªãŒã¹ãµã€ã¯ã«ã¯2é±éã«äžåºŠã§ããã éçºã¹ããŒãã«å¯ŸããŠãªãªãŒã¹ãµã€ã¯ã«ãé·ããããäŸ¡å€æäŸã®å€§ããªããã«ããã¯ã«ãªã£ãŠããŸããããŸããªãªãŒã¹æã«ã¯2é±éåã®å·®åããŸãšããŠæ¬çªãžåæ ãããŸãããã®ãããªãªãŒã¹ã®ã¿ã€ãã³ã°ã§äºæ
ãèµ·ãããããåé¡çºçæã®åãåããé£ããç¶æ
ã§ããã 2. QAç°å¢ã®å©çšãè©°ãŸã 次ã®èª²é¡ãšããŠã¯QAç°å¢ã®å©çšãè©°ãŸããšããåé¡ããããŸãããQAç°å¢ã¯æ€èšŒçšã®å æç°å¢ãšããŠå©çšãããã〠å
šQAã¡ã³ããŒãçŽåã«æ€èšŒäœæ¥ãè¡ãããã©ãããŠãé·æéããã¯ãããŠããŸããŸã ãçµæçã«æ€èšŒæéãé·åŒããåœæã¯1é±éã»ã©ç°å¢ã確ä¿ããããã«ãªã£ãŠããŸããã æ€èšŒäœæ¥ãå¹ççã«å®æœã§ããããã®éã¯æ°ãããªãªãŒã¹ããããã¯ãããæ§é ã«ãªã£ãŠããŸããã ãã®ããã ä»åŸéçºãå éãããããšãããšãã«ãããã®è©°ãŸãã«ãã£ãŠã¹ã±ãŒã«ã§ããªããªãããšã容æã«æ³åã§ããŸãã ã 3. æ
åœè
ã®è² æ
ã倧ãã ãªãªãŒã¹ãã¬ã€ã³ã®ãã1ã€ã®åé¡ãšããŠãåããŸãšããè¡ã人ã®è² æ
ã倧ãããšãã人çãªåé¡ããããŸããããªãªãŒã¹æ
åœããªãªãŒã¹ãããŒãžã£ãŒããªãªãŒã¹ãäž»å°ããå¿
èŠãããã®ã§ãããããã« éçšäœæ¥ãšãªã¹ã¯ç®¡çã®è² è·ãéäž ããŠããŸããã ãã¹ãé²ãããã®æåããã»ã¹ãæé ãå¢ããã¡ã§ãéçšãéåã«ãªã£ãŠããŸãããããã«ããªãªãŒã¹ãããå·®åã®ãã¹ãŠãææ¡ããããšãå°é£ã§ããããã®ãããåé¡çºçæã®å¯Ÿå¿ã«æéåã£ãããããŒã ããŸããã 調æŽã³ã¹ããå¢ãããããŠãæ
åœè
ãç²åŒãããŠããŸããã 解決çïŒ æ€èšŒäœæ¥ãåé¢ããŠäžŠååãã 解決çãšããŠèããã®ã¯ã ãªãªãŒã¹ãããŒããæ€èšŒäœæ¥ãåé¢ããŠäžŠååãã ãããšã§ãã 以äžã®å³ã¯æ€èšŒäœæ¥ãåé¢ã»äžŠååãããšãã®ãªãªãŒã¹ãããŒã®æŠå¿µå³ã§ãã æ€èšŒäœæ¥ãåé¢ã»äžŠååãããªãªãŒã¹ãã㌠ãããŸã§ãªãªãŒã¹ãã§ãŒãºã§è¡ã£ãŠãã QAç°å¢ã§ã®æ€èšŒäœæ¥ããã¹ãŠéçºãã§ãŒãºã«ç§»è¡ ããŠããŸãã éçºãã§ãŒãºã§éçºè
ãPRãäœæããããšã«å°çšã®æ€èšŒç°å¢ãç«ã¡äžããQAã¡ã³ããŒãPRããšã«æ€èšŒäœæ¥ã䞊åã§å®æœã§ããããã«ããŸãã ãããŠããªãªãŒã¹ãã§ãŒãºã§ã¯ãDevç°å¢ã«ãããã€ããåŸã¯æ¯æ¥å®æã«GitHub Actionsã®scheduled workflowãèµ·åããŸãããã®ãžã§ãã¯Stagingç°å¢ãžã®ãããã€ããE2Eãã¹ãã®å®è¡ãproductionç°å¢ãžã®ãããã€ãŸã§ãé£ç¶ããŠå®è¡ãã軜éãªã¯ãŒã¯ãããŒã§ãã ãŸãããªãªãŒã¹ãã©ã°ãå°å
¥ããããšã§ãPOïŒãããã¯ããªãŒããŒïŒãä»»æã®ã¿ã€ãã³ã°ã§æ°æ©èœããªãªãŒã¹ã§ããããã«ããŸãã ãã®æ¹åŒã«å€æŽããããšã§æ¬¡ã®å¹æãçããŸãã ãªãªãŒã¹ãæ¯æ¥ã§ãã ïŒéé±ããæ¯æ¥ãžãšé »åºŠãäžãããäŸ¡å€æäŸãé«éåããããã€ããšã®å€æŽå·®åãå°ãããªããåå ç¹å®ã容æã«ãªã QAã®ã·ããã¬ãããšäžŠåå ïŒæ€èšŒäœæ¥ãéçºãã§ãŒãºã«ç§»ãããšã§ãªãªãŒã¹ãå®å®åãããããŒã ãæ©èœããšã«æ€èšŒäœæ¥ã䞊ååããããšã§è©°ãŸããè§£æ¶ãã ããã»ã¹ã®è»œéå ïŒéåãªãªãªãŒã¹æé ã廿¢ãããªãªãŒã¹ãããŒãèªååã»è»œéåããããªãªãŒã¹ãã©ã°ãå°å
¥ããããšã§ãããã€ãšæ°æ©èœã®æå¹åïŒæ©èœãªãªãŒã¹ïŒãåé¢ãã å
ã»ã©ç޹ä»ãããªãªãŒã¹ãã¬ã€ã³ã®äž»èŠèª²é¡ããã¹ãŠè§£æ±ºã§ããããã«ãªã£ãŠããŸãã previewç°å¢ãã©ãèšèšããã å
ã»ã©è¿°ã¹ãããªãªãŒã¹æ¹åæœçå®çŸã«å¿
èŠãªæ§æèŠçŽ ã®1ã€ããæ€èšŒäœæ¥ãè¡ãããã®ç°å¢ïŒç§ãã¡ã¯ãããpreviewç°å¢ãšåœåïŒã§ããã ãã®ç« ã§ã¯ãã®previewç°å¢ãã©ãèšèšãããã«ã€ããŠèª¬æããŸãã å¿
é èŠä»¶ ãŸãQAããã»ã¹ã§å¿
èŠãªèŠä»¶ã¯ä»¥äž3ã€ã§ããã ååãªæ°ã®ç°å¢ã 容æã« äœããããš å©çšããŒã ã ä»»æã®ããŒãžã§ã³ããããã€ã§ãã ããš DBãäœ¿ãæšãŠã§ããããš ãŒããŒã¿ãæ±ããããšãæ°ã«ããå æããŠäœ¿ããããš ã€ã³ã¿ãŒãã§ãŒã¹èšè𠿬¡ã«å©çšè
ã®ã€ã³ã¿ãŒãã§ãŒã¹ã®èšèšã«ã€ããŠã§ããããã¡ãã¯Vercelçã®SaaSã®éçºè
äœéšãåèã«ããŠä»¥äžã®ããã«èšèšããŸããã GitHubã®ã€ãã³ããããªã¬ãŒ ã«ãpreviewç°å¢ãèªåã§æ§ç¯ã»æŽæ°ã»ç Žæ£ãã PRã®ã³ã¡ã³ãã«èªåã§ åçš®ã¢ã¯ã»ã¹æ
å ±ãä»äž ãã 以äžã¯previewç°å¢ãç«ãŠãPRã®ãµã³ãã«ã§ãã previewç°å¢ãç«ãŠãPRã®ãµã³ãã« PRã«ã©ãã«ãä»ãããšç°å¢æ§ç¯ãå§ãŸããå®äºãããšbotãã³ã¡ã³ãã§ã¢ã¯ã»ã¹æ¹æ³ãæ¡å
ããããšããéçºè
äœéšã«ãªã£ãŠããŸãã ãã®ããã«ã€ã³ã¿ãŒãã§ãŒã¹ãäœã£ãçç±ã¯ã以äžãçã£ãããã§ãã éçºè
ãšQAã®ã¹ã ãŒãºãªé£æº ïŒéçºè
ãPRã«å®è£
ããŸãšãããããQAæ
åœè
ãžæž¡ãããšã§ã¹ã ãŒãºã«æ€èšŒäœæ¥ã«ç§»ãããšãã§ãã ã©ã€ããµã€ã¯ã«ç®¡çã®ãããã ïŒç°å¢ãPRã«çŽã¥ããããäžèŠãªç°å¢ã®æ¶ãå¿ããé²ãã ããã¯ãªãŒã³ãªç°å¢ç®¡çãå¯èœã«ãªã ã¢ãŒããã¯ã㣠次ã«previewç°å¢ã®ã¢ãŒããã¯ãã£ã玹ä»ããŸããå
šäœåã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã previewç°å¢ã®ã¢ãŒããã¯ãã£å
šäœå³ ãããã€ãã㌠ãŸããpreviewç°å¢ã®ã©ã€ããµã€ã¯ã«ã¯GitHub Actionsã®ã¯ãŒã¯ãããŒã§ä»¥äžã®ããã«ç®¡çããŸãã PRã«previewã©ãã«ãä»äž : PRã®å
é ã®ã³ãããããã·ã¥ãå©çšããŠç°å¢ãæ§ç¯ãã PRã«ã³ããããããã·ã¥ : å·®åãå
¥ã£ãã³ã³ããŒãã³ãïŒFE/BE/DBïŒã®ã¿æŽæ°åŠçãè¡ã PRãããŒãžãã¯ããŒãºãŸãã¯previewã©ãã«ãå€ã : ç°å¢ãåé€ãã ãµãŒãã¹æ§æ 次ã«ãµãŒãã¹æ§æã§ããã previewç°å¢ããšã«ããã³ããšã³ã/API/DBã1ã»ãããã€çšæãã ããã«ãªã£ãŠããŸãã ãã¡ã€ã³ã¯ https://preview-N.kaipoke.com ïŒNã¯PRçªå·ïŒãç°å¢ããšã«æãåºããŠãããããããã¢ã¯ã»ã¹ã§ããŸãã ããã³ããšã³ãã¯SPAãªã®ã§ãã·ã³ãã«ã«CloudFrontãšS3ã§é
ä¿¡ããŠããŸãããªã¯ãšã¹ãã®ãã¹ãåã«å¿ããŠã¢ã»ãããåºãåããããã«LambdaïŒCloudFunctionïŒãæãã§ããŸãã APIãžã®ã¢ã¯ã»ã¹ã¯CloudFrontãšALBãä»ããŠmirage-ecsã³ã³ããã®proxyæ©èœã§ãã³ããªã³ã°ããããã¹ãåããšã«ãªã¯ãšã¹ããåç°å¢ã«æ¯ãåããŠããŸããç°å¢ããšã«ããã¯ãšã³ããšDBã1ã»ãããã€çšæãããŠãããããã¯ãšã³ãã®ECSã¿ã¹ã¯ã¯ mirage-ecs ã§ãDBã¯SaaSã® Neon ã§ããããæ§ç¯ã»ç®¡çããŠããŸãã ãªããããã¯ãšã³ãã¯äžç°å¢ãããECSã¿ã¹ã¯ãå
šéšã§5ååããŠãããå
éšã§GraphQLã®federationãçµãæ§æã§ãã ã¢ãã¿ãªã³ã°ã¯æ¬çªç³»ãšåããDataDogãå©çšããŠããã¬ãŒã¹ããã°ãåºç€ã®ã¡ããªã¯ã¹ã確èªã§ããããã«ããŠããŸãã ãã®ãããªä»çµã¿ã«ãã£ãŠã PRããšã®ç°å¢ãAPIãDBãŸã§ç¬ç«ãã圢ã§è€æ°åæºåã§ããããã«äœã£ãŠããŸã ã åèæ
å ±ã§ãããç°å¢ã®åææ§ç¯ã«ãããæéã¯2026/07/14æç¹ã§ 10åçšåºŠ ã§ãã èšèšæã«èããããš èšèšã«ããã£ãŠã¯ã以äž3ã€ã®ååãå®ãããã«ããŠããŸããã èŠä»¶ãäžæç¢ºãªãã¡ããäœã蟌ãŸãªã ïŒåææ®µéã§ã®éå°ãªèšèšãå®è£
ãé¿ãããã éçšã»éçºã®è² æ
ãå°ãªãæè¡ãéžã¶ ïŒåœæã¯ ã¢ããªéçºè
ã®ãªãœãŒã¹ãéŒè¿« ããŠãããéçºè
ã®è² æ
ãæ¥µåæããå¿
èŠããããŸãã æåããå®ç§ãç®æãã®ã§ã¯ãªãç¶ç¶çã«æäŸäŸ¡å€ãé«ããŠãã ïŒ ä»çµã¿äœãã«äœ¿ããSREã®ãªãœãŒã¹ãåœæå°ãªãã£ã ãããå°ããäœã£ãŠç¶ç¶çã«æäŸäŸ¡å€ãé«ããŠããæ¹éãæ¡çš éçšããŠã©ãã ã£ãã å®éã«1幎ã»ã©éçšããŠã©ãã ã£ãããæ¯ãè¿ã£ãŠãããŸãã çãã©ãããªãªãŒã¹é »åºŠãé«ãããã ãŸã åœåã®çãã«ããŠãããªãªãŒã¹é »åºŠãé«ããããšã«ã¯æå ããŸããã 以äžã¯æå¥ã®ãããã€åæ°ã®æšç§»ã衚ããã°ã©ãã§ãã æå¥ãããã€åæ°ã®æšç§» ãªãªãŒã¹æ¹åŒãåãæ¿ãã2025幎10æããããã æ2åã ã£ããããã€ãæ20åååŸãŸã§å¢ããŸãã ãå¶æ¥æ¥ã¯æ¯æ¥ãªãªãŒã¹ã§ããããã«ãªã£ãããšãããããŸãã ããã¯previewç°å¢ä»¥å€ã®æœçãšã®åããæã«ããææã§ã¯ãããŸããã ãµãŒãã¹æ¡å€§æã®éçºå¹çã®åäžã«è²¢ç®ã§ãã ãšèããŠããŸãã æ®µéçã«æ¹åããªããè²ãŠã ãããŠãèšèšæ¹éã«åŸã£ãŠpreviewç°å¢ã¯å°å
¥åŸã«èŠä»¶ãé©å®èŠçŽããªããæ¹åããŸããã 以äžã®ã°ã©ãã¯previewç°å¢ã«é¢ããPRã®æå¥ä»¶æ°æšç§»ã衚ããŠããŸãã previewç°å¢ã«é¢ããPRã®æå¥ä»¶æ° å
šäœã®ã¿ã¹ã¯éã¯å€ããPRç·æ°ãçµæçã« 200ä»¶è¶
ãšãªã£ãŠãã ã®ã§ããã察å¿ã段éçã«è¡ãããšã§å°äººæ°ïŒèšèšããå°å
¥åæãŸã§ã¯æ
åœäžäººïŒã§ãæ©æã«ä»çµã¿ãéçºã«å±éã§ãããã®åŸã®æ¹åãç¶ç¶ããããšãã§ããŸããã èšèšæã«çœ®ãããå°ããäœã£ãŠç¶ç¶çã«æ¹åããããšããååããããŸãæ©èœãã ãšæããŠããŸãã çµæçã«å©çšã䌞ã³ã çµæçã«previewç°å¢ã®å©çšæ°ã¯é 調ã«äŒžã³ãŸããã以äžã¯æå¥ã®previewç°å¢ãå©çšããPRã®ä»¶æ°æšç§»ã®ã°ã©ãã§ãã previewç°å¢ãå©çšããPRã®æå¥ä»¶æ° å°å
¥åœåã¯80ä»¶ã»ã©ã ã£ãå©çšä»¶æ°ã2026幎6æã¯160ä»¶çšåºŠãŸã§å©çšã䌞ã³ãŠãã ããšãããããŸãã ããšã§ãè§ŠããŸããããã¯åœåæ³å®ã®çšé以å€ã®å©çšãå¢ããããšãçç±ãšãªã£ãŠããŸãã éçšããŠããã£ãã㚠次ã«éçšããŠããã£ãããšãæ°ä»ãã«ã€ããŠå€§ãã3ã€ç޹ä»ããŸãã 1. è€è£œæ©æ§ã®å©çšæè¡ã«ã€ããŠããã£ãããš ä»åãããã¯ãšã³ãã®è€è£œã«ã¯ mirage-ecs ãšããã³ã³ãã管çã®è»œéãªOSSãDBã®è€è£œã«ã¯SaaSã® Neon ã䜿ããŸããã ãŸãmirage-ecsã¯ãæ¢åã®ECS Fargateæ§æãšãããã€ã®ä»çµã¿ïŒecspressoïŒã«ã¢ããªã³ãã圢ã§å°å
¥ã§ããŸãããecspressoã®äœè
ãäœã£ãããŒã«ã®ããã èŠªåæ§ãé«ããããã€ã®ä»çµã¿ããã®ãŸãŸç¶æããããšãã§ããŸãã ã ããŒã«å°å
¥ã§åŠç¿ãã¹ãæ°ããæŠå¿µãå°ãªããã¡ã³ããã³ã¹ãç°¡åã§ãéçºããŒã ãžã®è² æ
ãæå°éã«æããªããå°å
¥ã§ããã®ã¯éåžžã«ããã£ãã§ããçŸåšãŸã§ãä»ãœãªã¥ãŒã·ã§ã³ãžã®çœ®ãæãæ€èšãå¿
èŠãšãªãåé¡ãåºãŠããããå®å®ããŠéçšã§ããŠããŸãã æ¬¡ã«Neonã§ãããçŽæçã§æ±ããããWeb UIãé«éãªãã©ã³ãæ©èœãåçš®ç®¡çæ©èœãå
å®ããŠããã DBè€è£œæ©èœã®åæå°å
¥ã«ãããå·¥æ°ã倧å¹
ã«åæžã§ãã ã®ã¯è¯ãã£ãã§ãã äžæ¹ã§ããµãŒãé
眮å
ã®å¶çŽã«ããæ§èœèª²é¡ããããŸãããDBã®é
眮å
ã¯æå¯ãã§ãSingaporeãªãŒãžã§ã³ã®ãããSQLå®è¡æã®ã¬ã€ãã³ã·ãŒã倧ãããªãã çµæãšããŠäžéšã®ããŒãžã§è¡šç€ºã«æéãèŠããç¹ã課é¡ãšããŠæ®ã£ãŠããŸããŸãã ã æ©èœæ€èšŒã«ãããŠã¯ç¡èŠããŠãåé¡ãªããšããããšã§ãã°ããã¯ãã®ãŸãŸå©çšããŠããŸããããåäœããã£ããããã®ã§ãªããšãããããšãã声ãå€ãåºãç¶æ³ã§ããã ãã®ãããçŸåšã¯tokyoãªãŒãžã§ã³ã«ç«ãŠãAurora Serverless v2ïŒRDSïŒãå©çšããæ¹åŒãã¡ã€ã³ã«éçšããŠããŸããä»é²ã«ãŠãã¡ãã®ã¢ãŒããã¯ãã£ã«ã€ããŠã¯è£è¶³ããŸãã 2. è€è£œãã§ããªããå€éšãµãŒãã¹ãšã®ä»ãåãæ¹ãé£ãã 2ã€ç®ã®æ°ã¥ãã§ããéçšããŠã¿ãŠå®æããã®ã¯ã ãããã¯ãæ¬äœã®è€è£œããããè€è£œã§ããªãå€éšãµãŒãã¹ã®æ±ããé£ãã ããšããããšã§ãã æ¬äœã®è€è£œã¯éçºããŒã ã§ã³ã³ãããŒã«ã§ããã®ã§ãããå©çšããŠããå€éšãµãŒãã¹ïŒé£æºãã瀟å
ãµãŒãã¹å«ãïŒã«ã¯æ§ã
ãªå¶çŽããããããããåŠ¥åæ¡ãäœã£ãŠéçšããŠããå¿
èŠããããŸããã äŸãã°èªèšŒåºç€ã«ã€ããŠã¯å¥çŽãã©ã³ã®å¶çŽã§ããã³ããæ°èŠäœæã§ããªãã£ããããæ¢åããã³ãã«çžä¹ããã圢ã§å¯Ÿå¿ããŸããã çµæçã«ïŒç¹ã«äžäŸ¿ãªãéçšã§ããŠãããã®ã®ïŒDevç°å¢ã®DBãã³ããŒããæ¹åŒãéžæããããåŸãªããªããŸãã ã ãã瀟å
ãµãŒãã¹ã§ã¯ã¢ãŒããã¯ãã£äžã®å¶çŽã«ãããç°å¢è€è£œã®é£æåºŠãé«ãããã«ã¯å®çŸã§ããŸããã§ããã çµæçã«æ¢åç°å¢ã«çžä¹ãããpreviewç°å¢åãã®ããŒã¿ãèå¥ã§ããããã«ã¢ããªãæ¹ä¿®ããŠããããéçšã§ã«ããŒãã圢ã«ãªããŸãã ã ãŸãä»ã®ç€Ÿå
ãµãŒãã¹ã§ã¯ãå¥çŽãã©ã³ãäºç®ç®¡çäžã®å¶çŽãããããç°å¢ã®è€è£œãã§ããªããããç¹å®ã®previewç°å¢ã«ã®ã¿æééå®ã§é£æºãããšãããããªéçšã«ãªããŸããã ãããã®å€éšãµãŒãã¹ã«å
±éãã課é¡ã¯2ã€ãããŸãã1ã€ã¯ã 飿ºãå¢ãããã³ã«éçšã®åãæ±ºãã調æŽãåå¥ã«è¡ãå¿
èŠãããã察å¿ã³ã¹ãã®å¢å ã«ã€ãªãã ç¹ã§ãããã1ã€ã¯ã èªããŒã ã ãã§ã¯ã³ã³ãããŒã«ã»è§£æ±ºã§ããªãä»éšçœ²ã»ä»ããŒã ã®ä»æ§ãäºç®å¶çŽã絡ãã±ãŒã¹ãå€ããé£æåºŠãåŒãäžããŠããç¹ ã§ãã previewç°å¢ãæçšãªç¶æ
ã§ç¶æããããã«ã¯å€éšã®ãµãŒãã¹ãããŸãæ€èšŒçšéã§åããç¶ããããã®å·¥å€«ãšãããæè¡ä»¥å€ã®èª²é¡ãã¯ãªã¢ããŠããå¿
èŠãããç¹ã«æ³šæãå¿
èŠã ãšåŒ·ãæããŸããã 3. previewç°å¢ã®æ³å®å€ãªéèŠãèŠãã 3ã€ç®ã®æ°ã¥ãã¯previewç°å¢ã®æ³å®å€ãªéèŠãèŠããããšã§ãã åœåã¯QAããã»ã¹ã§ã®å©çšãæ³å®ããŠããã®ã§ãããå®é㯠å
šäœã®8å²ãéçºããŒã ã®èªäž»çãªåäœç¢ºèªã»æ€èšŒç®çã§å©çš ãããŠããŸãããQAåŒãæž¡ãã§ã®å©çšã¯äºæ³ã«åããŠå
šäœã®20%ã«ãšã©ãŸã£ãŠããã®ã§ãã éçºè
ã®ãŠãŒã¹ã±ãŒã¹ã«ã¯äŸãã°ä»¥äžããããŸããã ãªã¹ã¯åé¿ ïŒDevç°å¢ãžã®ãããã€åã®æ©æãªã¹ã¯æ€ç¥ DB migrationã®ç¢ºèª ïŒDB migrationã®ç°¡åã§å®å
šãªæ€èšŒã«å©çš AIãæŽ»çšãã䞊åéçº ïŒè€æ°PRãäºãã«åœ±é¿ãããåæã«æ€èšŒ ããŒã«ã«ä»£æ¿ ïŒäžæçã«ããŒã«ã«ãããŸãèµ·åã§ããªãå Žåãªã©ã«ä»£æ¿ã®æ€èšŒç°å¢ã«å©çš ã€ãŸã ã容æã«ç«ãŠãããæ€èšŒç°å¢ãã®ååšèªäœããéçºäœéšïŒDXïŒã«ãšã£ãŠå®ã¯å€§ããªäŸ¡å€ã«ãªã£ãŠãã ããšãéçšããŠããåããŠããããŸãããèšèšæã¯å®éã«ã©ã®ããã䜿ããããèŠããŠããããããã¯éçšåŸã®äžçªå€§ããªæ°ä»ãã§ããã ãŸãšã æ¢åãããã¯ãã«previewç°å¢ãå°å
¥ã»éçšããŠèŠããŠããããšã¯ã次ã®3ç¹ã§ãã ç°å¢éçšã®å®çŸæ§ ïŒä»åã®æè¡ã¹ã¿ãã¯ã§ããäžèŠæš¡ã·ã¹ãã ã®previewç°å¢ã¯ååã«éçšã§ããããšãããããŸãããå°äººæ°ã§éçšã§ããéçºè² æ
ãå°ããæããããšãã§ããŸãã å€éšé£æºã®èª²é¡ ïŒæ¬äœã®è€è£œä»¥äžã«ãè€è£œã§ããªãå€éšãµãŒãã¹ãšã®é£æºèšèšãéèŠã«ãªãããšãããããŸãã å°å
¥åŸã®é²åã倧å ïŒä»åã®ããã«å°å
¥ããŠããæ¹åããŠããã¢ãããŒãã§ã¯ãéçšã«ä¹ã£ãŠããã®ç¶ç¶çãªæ¹åãããæ¬çªãšãªããŸãããããã¯ãã®æé·ã«åãããŠè²ãŠãŠããããšãéèŠã§ã previewç°å¢ãšããã³ã³ã»ããèªäœã¯ç®æ°ãããããŸããããæ¢åãããã¯ããžå°å
¥ããŠ1幎ééçšããŠããç¥èŠããèªãã§ããã ããæ¹ã®åèã«ãªãã°å¬ããã§ãã ãªããçºè¡šè³æã¯ Speaker Deck ã§å
¬éããŠããŸãã®ã§ãã¡ããé©å®åç
§ããŠãã ããã ä»é²: çŸåšã®ã¢ãŒããã¯ãã£ã®çŽ¹ä» åœæ¥ã®çºè¡šã¹ã©ã€ãã§ã¯ãèŠãã§ããªãã£ãã®ã§ãããããŒã¹ã§å±ç€ºã»ç޹ä»ããŠããçŸåšã®ã¢ãŒããã¯ãã£ã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã çŸåšã®ã¢ãŒããã¯ãã£å
šäœå³ å
ã«ç޹ä»ããã¢ãŒããã¯ãã£ãšã®éã㯠DBã®è€è£œæ©æ§ãNeonããAurora Serverless v2ïŒRDSïŒãå©çšãã圢ã«å€ãã£ãŠãã ãšããã§ãã ãµãŒãã¹ããšã«1ã€ã€ã³ã¹ã¿ã³ã¹ãçšæããpreviewç°å¢ããšã«å
éšçã«PostgreSQLã®ããŒã¿ããŒã¹ãäœããdump/restoreã§Devç°å¢ã®ããŒã¿ãæµã蟌ãã§äœã£ãŠããŸãã Neonã§å©çšè
ã«ãã䜿ãããŠããWeb UIã«ã€ããŠã¯ãèªäœããŠæäŸããŠããŸãã Web UIã®ç»é¢ãµã³ãã«ïŒæ¥ç¶ããŒãžïŒ Web UIã®ç»é¢ãµã³ãã«ïŒããŒãã«ãã¥ãŒïŒ ããŒã¿ããŒã¹ã®äžèº«ãæ°è»œã«é²èЧããããããŒãã«ã®å€ãGUIã§ç·šéãããSQLãå®è¡ãããªã©ã®æ©èœãæã£ã軜éãªDBã®wrapperããŒã«ãšãªã£ãŠããŸãã以åã¯èªåã§ãã®ãããªããŒã«ãäœãã®ã¯å·¥æ°çã«é£ããã£ãã®ã§ãããçæAIã®åãåããããšã§èŠä»¶ã®ç·©ã瀟å
ããŒã«ã§ããã°æ°æ¥ã§äœæã§ããããã«ãªã£ãŠããŠå€§å€ãããããéãã§ãã ãªããRDSæ¹åŒã¯Neonãšæ¯èŒãããšæ°ããããŒã¿ããŒã¹ãäœãã®ã«ãããæéã¯å°ã倧ãããªã£ãŠããŸããããã¯dump/restoreã§è€è£œãè¡ã£ãŠããããã§ãçŸç¶ã¯æå€§4åçšåºŠããã£ãŠããŸããããŒã¿éãå¢ãããšCopy on Writeæ¹åŒã§ã¯ããŒã³ããNeonã«åªäœæ§ãåºãå¯èœæ§ãããããã®ãããã¯å©çšå®äœã確èªããªããéœåºŠèª¿æŽããŠããå¿
èŠããããšèããŠããŸãã
ããã«ã¡ã¯ããã€ãã¹ Tech Officeã§ãã ãã€ãã¹æ ªåŒäŒç€Ÿã®ããã¯ããŒã ãçŽè¿ã§éçºããæ©èœãçŸå Žã®ãšã³ãžãã¢ããå
±æãããMIIDAS Tech LIVEãã 第14åç®ã®éå¬ãšãªãä»åã¯2ã€ã®ãªãªãŒã¹æ
å ±ããå±ãããŸããã æ¡çšãããã³ã°ãµãŒãã¹ããã€ãã¹ãã¯ãç¬èªã®èšºæããŒã«ã§æ¡çšã®ãã¹ããããæžããäžéæ¡çšãµãŒãã¹ã§ããã¡ã€ã³ã®æ¡çšé¢é£ã®æ©èœã«å ãã蚺æãç ä¿®ãçµç¹ãµãŒãã€ã®æ¯æŽéã®æ€çŽ¢æ©èœãªã©ãå¹
åºãæ©èœéçºãè¡ãããŠããŸãã MIIDAS Tech LIVE #14 (2026/06/24 12:00ã) ## ð¢ æŠèŠ MIIDAS Tech LIVEã§ã¯ããã€ãã¹æ ªåŒäŒç€Ÿã®ããã¯ããŒã ãçŽè¿ã§éçºããæ©èœãçŸå Žã®ãšã³ãžã miidas-tech.connpass.com
åç»
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã










