
- TOP
- ã¿ã°äžèЧ
- ãœãããŠã§ã¢ãã¹ã
ãœãããŠã§ã¢ãã¹ã
ã€ãã³ã
ãã¬ãžã³
æè¡ããã°
ããã«ã¡ã¯ãLINEã€ããŒã®æ°žåã§ãã5æ8æ¥ïŒéïŒããLINEã€ã㌠Development with Agents Meetup #3ããéå¬ããŸãããä»åã®Meetupã§ã¯ãOrchestrat...
ã¯ããã« ããã«ã¡ã¯ãZOZOTOWNéçº1éšiOSãããã¯ã®è»éã§ãïŒ @juginon ïŒã ã¿ãªããã«æ¥ã
䜿ã£ãŠããã ããŠããZOZOTOWN iOSã¢ããªã®ããŒã ç»é¢ã§ãããå®ã¯2024幎ç§ãã2026幎ã®å¹ŽåãŸã§çŽ1幎åãæ°Žé¢äžã§ãªã¢ãŒããã¯ãã£ãè¡ã£ãŠããŸããã ãªã¢ãŒããã¯ãã£ã«çæããåã®åœæã®ç§ã¯ã¢ãŒããã¯ãã£èšèšãžã®çè§£ããŸã æµ
ãããå®éã«æãåãããªãã身ã«ã€ãããããšããåæ©ã§ãã®ãªã¢ãŒããã¯ãã£ãäž»å°ããŸãããèªåã«ãšã£ãŠã¯ãã£ã¬ã³ãžã³ã°ãªåãçµã¿ã§ãã¢ãŒããã¯ãã£èšèšããã¹ãèšèšãžã®çè§£ãå®è·µãéããŠå€§ããæ·±ãŸã£ããããžã§ã¯ãã«ãªããŸããã æ¬èšäºã§ã¯ããã®ãªã¢ãŒããã¯ãã£ã®ãã¹ãŠã®è»è·¡ãšãããã§åŸãåŠã³ããäŒãããŸãã ãªããæ¬èšäºã§ç޹ä»ããããŒã ç»é¢ãªãã¡ã¯ã¿ãªã³ã°ã¯ãiOSããŒã å
šäœã§åãçµãã§ããã¢ãŒããã¯ãã£å·æ°ã®å
·äœçãªäºäŸã®1ã€ã§ããããŸããããŒã ãšããŠã®åãçµã¿ãç¥èå
±æã®ä»çµã¿ã«ã€ããŠã¯ ZOZOTOWNã®iOSã¢ãŒããã¯ãã£ãšããŒã é²åã®è»è·¡ ã«ããŸãšããŠããŸããæ¬èšäºãšåãããŠèªããšãåã
ã®åãçµã¿ãšããŒã å
šäœã®æèãããç«äœçã«çè§£ã§ããŸãã ç®æ¬¡ ã¯ããã« ç®æ¬¡ ããŒã ç»é¢ã«ã€ã㊠ã¿ã ã¢ãžã¥ãŒã« ããŒã ç»é¢ãæ±ããŠããèª²é¡ åœåã®èšèšãšããã®åŸã®éçšå®æ
ã®ä¹é¢ ç¶æ¿æ§é ãäžèŠã«ãªã£ã ãã°ç®¡çã®è€éå MVCã«ããViewControllerãžã®è²¬åéäž é«ãæ¹ä¿®é »åºŠ ãªãã¡ã¯ã¿ãªã³ã°ã®èšèšæ¹é æ¹é1: 圱é¿ç¯å²ãæå°åããªããæ®µéçã«é²ãã æ¹é2: 段éçã«è²¬åãåé¢ãã Step1: Objective-Cã¬ã¬ã·ãŒåãžã®äŸåãå¥ãã Step2: æãç¬ç«æ§ã®é«ãAPIã察象ã«ãViewModel/UseCaseãéšåå°å
¥ãã å°ããå§ããããšã®éèŠæ§ Step3: MallHomeViewControllerå
šäœã«ViewModel/UseCaseãå°å
¥ãã åé¡1. Swift Concurrencyãžã®ç§»è¡ åé¡2. ã¢ãžã¥ãŒã«æ§ç¯ã¡ãœããã®æŽç Step3å®äºåŸã«ãã°ã«é¢ãããã°ãçºèŠ ãã°ãåŒãèµ·ãããåå Step3-ex: åœåæŽçãšãŠããããã¹ãã®è¿œå åœåã®æŽç ãŠããããã¹ãã®è¿œå äžç¢ºããã«æ°ã¥ããæç¹ã§ãã¹ããæžã Step4: HomeViewControllerã«ViewModel/UseCaseãå°å
¥ãã TDDã«ããèšèšã®å
±æ ãªã³ããŒãã£ã³ã°åšãã®ç¶æ
管ç ãªãã¡ã¯ã¿ãªã³ã°åã®èª²é¡ ã¹ããŒããã·ã³ã«ããåèšèš é·æãªãã¡ã¯ã¿ãªã³ã°ãé²ããäžã§ã®ãã€ã³ã ãããã« ããŒã ç»é¢ã«ã€ã㊠ZOZOTOWN iOSã¢ããªã®ããŒã ç»é¢ã¯ä»¥äžã®ããã«ãäž»ã«ã¿ããšã¢ãžã¥ãŒã«ã«ãã£ãŠæ§æãããŠããŸãã ã¿ã ç»é¢äžéšã«è¡šç€ºãããŠããããã¹ãŠããã³ã¹ã¡ãéšåãæããŸããã¿ãã¯åãæ¿ããå¯èœã§ããã¹ãŠã¿ãã§ã¯ã¢ãã¬ã«ã»ã·ã¥ãŒãºã»ã³ã¹ã¡çãã¹ãŠã®ååããã³ã¹ã¡ã¿ãã§ã¯ã³ã¹ã¡ååç¹åã®ç»é¢è¡šç€ºã«ãªããŸãã å®è£
äžã¯ä»¥äžã®2çš®é¡ã®ViewControllerã§æ§æãããŠããŸãã HomeViewController : ããŒã ã¿ãã®ã«ãŒãç»é¢ãšãªãç»é¢å
šäœã管çããViewController ããããŒãæ€çŽ¢çªãªã©ãäž¡æ¹ã®ã¿ãã§å
±éããŠè¡šç€ºããéšåãããŒã ç»é¢å
šäœã®ç®¡çãæ
ã MallHomeViewController : ãã¹ãŠã¿ã/ã³ã¹ã¡ã¿ãã®ã³ã³ãã³ãã管çããViewController ããããã®ã¿ãã§è¡šç€ºãå€ããéšåã®ç®¡çãæ
ã ã¢ãžã¥ãŒã« åã¿ãã®ã³ã³ãã³ãã¯ãè€æ°ã®ãã¢ãžã¥ãŒã«ããšåŒã°ãããããã¯ã瞊ã«äžŠãã æ§æã§ããã¢ãžã¥ãŒã«ãšã¯ãæ§å¥éžæã»ãããŒã»ãã§ãã¯ããã¢ã€ãã ãšãã£ããåã
ã®ã³ã³ãã³ãåäœã®ããšã§ãã ãŠãŒã¶ãŒãããŒã ç»é¢ãã¹ã¯ããŒã«ãããšããããã®ã¢ãžã¥ãŒã«ãé çªã«è¡šç€ºãããŸãã ããŒã ç»é¢ãæ±ããŠããèª²é¡ åœåã®èšèšãšããã®åŸã®éçšå®æ
ã®ä¹é¢ ããŒã ç»é¢ã®è€éããçè§£ããã«ã¯ã2021幎ã®ãã«ãªãã¥ãŒã¢ã«æã®èæ¯ãç¥ãå¿
èŠããããŸãã 2021幎3æã®ZOZOTOWNãã«ãªãã¥ãŒã¢ã«ã§åããŠã¿ãæ§æãå°å
¥ãããŸãããåœæã¯3ã€ã®ã¿ããããã MallHomeViewController ãåºåºã¯ã©ã¹ãšãã3ã€ã®ãµãã¯ã©ã¹ã«ããç¶æ¿æ§æãæ¡çšããŸãããåã¿ãã§åºæã®åŠçãçºçããããšãèŠè¶ããèšèšã§ãã åœæã®åãçµã¿ã«ã€ããŠã¯ ZOZOTOWNã¢ã㪠Homeç»é¢ã®ãªãã¥ãŒã¢ã«ã«ãããã¢ãŒããã¯ãã£åèšèš ã§ã詳ãã玹ä»ãããŠããŸãã ãããããã«ãªãã¥ãŒã¢ã«ãã3幎以äžãçµéããéçšãéããäžã§åœåã®èšèšåæãå€ãã£ãŠãããŸããã ç¶æ¿æ§é ãäžèŠã«ãªã£ã åŸæ¥ã§ã¯ MallHomeViewController ãç¶æ¿ããåã¿ãã®ã¯ã©ã¹ãäœæããŠããŸããããåã¿ãã§åºæã®åŠçã¯å®éã«ã¯ã»ãšãã©çºçããŸããã§ããã ã¿ãã®çš®é¡ãä¿æããã ãã§ååãªç¶æ
ã§ãåã¿ãã§å°çšã®ã¯ã©ã¹ãäœæããæ§é ã¯ããã£ãŠå
šäœåã®ææ¡ãé£ããããŠããŸããã ãã°ç®¡çã®è€éå ãªãã¥ãŒã¢ã«åœåã¯GAïŒGoogle AnalyticsïŒã®ã¿ã ã£ããã°éä¿¡ãå°çšã®Loggerã¯ã©ã¹ã管çããŠããŸãããããããã®åŸã瀟å
åæçšãã°ãªã©è€æ°çš®å¥ã®ãã°ã远å ãããŠããäžã§ãLoggerèªèº«ãè€éãªç¶æ
管çãæ
ãããã«ãªã£ãŠãããŸããã è€æ°ã®ãã©ã°ãLoggerã®å
éšã«ç©ã¿éãªãã MallHomeViewController ãæã€ç¶æ
ãšåžžã«åæãããå¿
èŠãçããŸããããŸãããã°ã«é¢ãã責ååé¢ãé©åã«è¡ãããŠããªãéšåãããããããã£ãæ§é ãã³ãŒããèªãéã®ã³ã¹ããé«ããèŠå ã®1ã€ã«ãªã£ãŠãããŸããã MVCã«ããViewControllerãžã®è²¬åéäž 2021å¹Žåœæã¯MVCã¢ãŒããã¯ãã£ãæ¡çšããŠãããããAPIåŒã³åºãã»UIç¶æ
管çã»ããžãã¹ããžãã¯ã®èª¿æŽã MallHomeViewController ã«éäžããŠããŸãããåè¿°ã®Loggerã¯ã©ã¹ãšã®ç¶æ
åæãVCãçŽæ¥æ
ã£ãŠãããæ¹ä¿®ãå ãããã³ã«VCã»Loggeråæ¹ãžã®åœ±é¿ãèæ
®ããªããã°ãªããŸããã§ãããããããç©ã¿éãã§è¡æ°ã¯åã³1000è¡ãè¶
ãããŸã§ã«èšããã§ããŸã£ãŠããŸããã ç¹ã«åé¡ã ã£ãã®ã¯ãUICollectionViewãžã®ããŒã¿æ§ç¯ãšååæŒäžæã®ãã°ããŒã¿äœæãæ··åšãã500è¡åŒ±ã®å·šå€§ãªã¡ãœããã§ããã©ããè§Šãã°äœãå€ããã®ãææ¡ããã ãã§å€§ããªã³ã¹ãããããç¶æ
ã§ããã é«ãæ¹ä¿®é »åºŠ ZOZOTOWNã®ããŒã ç»é¢ã¯å¹³åæ1ããŒã¹ã§æ¹ä¿®æ¡ä»¶ãå
¥ããå€ãææã«ã¯3æ¡ä»¶ãåæäžŠè¡ã§èµ°ãããšããããŸãã ãã®ãªã¢ãŒããã¯ãã£ãéå§ããŠããçŸåšãŸã§ã§ããããŒã ç»é¢ã®ã¢ãžã¥ãŒã«ãç¡éã¹ã¯ããŒã«ã§ããæ©èœããã¢ãžã¥ãŒã«å
ã®ã¢ã€ãã ã§åç»ã衚瀺ããæ©èœãªã©ãèŠæš¡ã®å€§ããªæ¡ä»¶ããªãªãŒã¹ãããŠããŸãã 圱é¿ç¯å²ã®ææ¡ãå°é£ãªFat ViewControllerã¯ãæ¹ä¿®ã®ãã³ã«ãªã¹ã¯ã䌎ããããŒã ã®éçºé床ãäžããåå ã«ãªã£ãŠããŸããã ãªãã¡ã¯ã¿ãªã³ã°ã®èšèšæ¹é 課é¡ã¯æç¢ºã§ãããã1000è¡è¶
ã®VCãäžæ°ã«æžãæããã®ã¯ãªã¹ã¯ãé«ãããŸããããã§ä»¥äžã®æ¹éãç«ãŠãŸããã ãªãããã®ãªãã¡ã¯ã¿ãªã³ã°ã¯éåžžã®æ©èœéçºãšäžŠè¡ããŠé²ããŠããã皌åã®çŽ2å²ããã®åãçµã¿ã«å
ãŠãªããé²ããŠããŸããã1幎åãšããæéã¯ãã®ããã§ãã æ¹é1: 圱é¿ç¯å²ãæå°åããªããæ®µéçã«é²ãã åã¹ãããã®åœ±é¿ç¯å²ãå°ããä¿ã€ããšã§ãåé¡çºçæã®ä¿®æ£ã³ã¹ããæããããPRã®å€æŽéãå°ãªããªãã¬ãã¥ãŒã®è² æ
ãæžãããŸãããŸãåã¹ããããç¬ç«ããŠãªãªãŒã¹å¯èœãªåäœãšããããšã§ã仿¡ä»¶ã®é²è¡ããããã¯ããŸããã 以äžã®ã¡ãªãããæèããªãã以äžã®ã¹ãããã§é²ããèšç»ãç«ãŠãŸããïŒåœåã¯4ã¹ããããçµæãšããŠ5ã¹ãããã«ãªããŸããïŒã ã¹ããã å
容 Step1 Objective-Cã¬ã¬ã·ãŒåãžã®äŸåãå¥ãã Step2 æãç¬ç«æ§ã®é«ãAPIã察象ã«ãViewModel/UseCaseãéšåå°å
¥ãã Step3 MallHomeViewControllerå
šäœã«ViewModel/UseCaseãå°å
¥ãã Step3-ex Step3å®äºåŸã«ãã°ãçºèŠããåœåæŽçãšãŠããããã¹ãã远å Step4 HomeViewControllerã«ViewModel/UseCaseãå°å
¥ããã ã¹ããããèšèšããäžã§ã®ãã€ã³ãã3ç¹ç޹ä»ããŸãã Step1ãæåã«è¡ã£ãçç± MallHomeViewController ã«ã¯Objective-Cã®ã¬ã¬ã·ãŒãªåãžã®äŸåããããŸãããMVVMåãå
ã«é²ãããšãViewModel/UseCaseã¯ObjCã®åãæ±ãèšèšã«ãªããŸãããã®åŸObjCäŸåãé€å»ãããšãViewModel/UseCaseã®èšèšå€æŽãå¿
èŠã«ãªãææ»ããçºçããŸãããã®ãããMVVMåã®å段éãšããŠäŸåã®é€å»ãæåã®ã¹ããããšããŸããã MallHomeViewControllerããå
ã«çæããçç± ã¿ãã®äžèº«ã管çããŠãã MallHomeViewController ã¯ãçæéå§ããéããªãåŸç¶æ¡ä»¶ã®æ¹ä¿®ãå
¥ãäºå®ã§ããããã®ãããããããåã«MVVMåãå®éãããããšãåªå
ããŸããã Step2ãšStep3ãåããçç± ããŒã ç»é¢ã§ã¯è€æ°ã®APIãåŒã³åºããŠãããæåããå
šAPIã察象ãšãããšMVVMåã®åœ±é¿ç¯å²ã倧ãããªããããŸãããŸãç¬ç«æ§ã®é«ãäžéšã®APIã«çµã£ãŠViewModel/UseCaseãå°å
¥ããããšã§ãã¢ãŒããã¯ãã£ã®å
šäœåãå°ããªå€æŽã§ç¢ºèªã§ããåé¡ãçºçããéã®ä¿®æ£ã³ã¹ããæããããŸãã æ¹é2: 段éçã«è²¬åãåé¢ãã UseCase â ViewModel â ViewControllerã®é ã§è²¬åãåé¢ããŠãããæçµçã«ä»¥äžã®æ§æãç®æããŸãããåœæã®ã¢ãŒããã¯ãã£ã¬ã€ãã©ã€ã³ã§ã¯UseCaseã®æ¡çšãå®ããããŠããŸããããŸãAPIãªã¯ãšã¹ãã»ãã°éä¿¡ã»ããžãã¹ããžãã¯ãè€åçã«çµ¡ãããŒã ç»é¢ã®èŠæš¡æã«ãããŠããViewModelã®è¥å€§åãé²ãããã§é©åãªèšèšå€æã§ããã ããã§ç޹ä»ããŠãã倧ãŸããªå
šäœæ¹éã¯ã以åããŒã ã¡ã³ããŒã® ãªãã㌠ãããè¡ã£ã åå詳现ç»é¢ã®ãªã¢ãŒããã¯ãã£ã«ãããé²ãæ¹ ãåèã«ããŠããŸãã Step1: Objective-Cã¬ã¬ã·ãŒåãžã®äŸåãå¥ãã MallHomeViewController ã§ã¯ãååæ
å ±ã衚瀺ããéšåãObjective-Cã§æžãããã¬ã¬ã·ãŒãªåã«äŸåããŠãããAPIã¬ã¹ãã³ã¹ããã¬ã¬ã·ãŒãªåãžå€æããäžèŠãªäŸåããããŸããããã®ãããæåã®ã¹ãããã¯MVVMåã§ãªã äžèŠãªäŸåã®é€å» ããå§ããŸããã 以äžã®3段éã§äŸåãå¥ãããŸããã ååã®æ
å ±è¡šç€ºã«ãããŠå¿
èŠãªæ
å ±ãæã€UIModelãäœæ APIã¬ã¹ãã³ã¹ããã®UIModelã«å€æããTranslatorãäœæ Translatorã¯å€éšAPIã®ã¬ã¹ãã³ã¹åãUIModelã®åã«å€æãã責åãæã€ å€éšAPIã®åå®çŸ©ã倿ŽãããŠãViewModelãVCãžçŽæ¥åœ±é¿ããªãæ§é ã«ãªã ã¬ã¬ã·ãŒãªåã䜿ããªãæ°ããã»ã«ãå®è£
ããç§»è¡ æçµçã« MallHomeViewController ããObjective-Cã¬ã¬ã·ãŒåãžã®äŸåãå®å
šã«é€å»ããŸããã Step2: æãç¬ç«æ§ã®é«ãAPIã察象ã«ãViewModel/UseCaseãéšåå°å
¥ãã Step1ã§ã¯ãªãŒã³ãªåºç€ãã§ãããããããããMVVMåã«çæããŸããèšèšèšç»ã§ãæãç¬ç«æ§ãé«ãããšå€æãã äžä»£å¥ã©ã³ãã³ã°ã¢ãžã¥ãŒã« ããå§ããŸããã äžä»£å¥ã©ã³ãã³ã°ã¢ãžã¥ãŒã«ãšã¯ããŠãŒã¶ãŒãäžä»£ïŒ~10代ã20代ãªã©ïŒãéžæãããšããã®äžä»£ã®äººæ°ã¢ã€ãã ãã©ã³ãã³ã°åœ¢åŒã§è¡šç€ºãããã¢ãžã¥ãŒã«ã§ãã ããããŒã®äžä»£éžæãã¿ã³ãã¿ããããŠåãæ¿ãããšã察å¿ããã©ã³ãã³ã°ãåååŸã»å衚瀺ãããŸãã 以äžã®ç¹åŸŽããã£ããããããŒã ç»é¢ã®MVVMåã«ãããæåã®ã¹ããããšããŠå·¥æ°ããããããã¢ãŒããã¯ãã£ã®å
šäœåãå®è£
ããªããçè§£ã§ããæé©ãªé¡æãšå€æããçæããŸããã äžä»£å¥ã©ã³ãã³ã°å°çšã®ç¬ç«ããAPIãæã€ ãŠãŒã¶ãŒãäžä»£ãéžæãããšãã ãæŽæ°ããã ä»ã®ã¢ãžã¥ãŒã«ã®æŽæ°ãšç¬ç«ããŠåäœãã å°ããå§ããããšã®éèŠæ§ Step2ã¯å
šéšã§7ã€ã®PRãäœæããŸãããUseCaseäœæâUIModeläœæâViewModeläœæâViewControllerããUseCase/ViewModelãžåŠçãç§»åããæµãã§ä¿®æ£ãå ããŠãããŸããã 巚倧ãªViewControllerãäžæ°ã«æžãæããããšãããšã倿Žã倧ãããªããããŠã¬ãã¥ãŒãå°é£ã«ãªãããã°æ··å
¥ãªã¹ã¯ãé«ãŸããŸããStep2ã§Openãã7ã€ã®PRã®ã»ãšãã©ã100è¡æªæºã®ã³ãŒã远å ã«åãŸã£ãŠãããã¬ãã¥ãŒã§ã®ææãã»ãšãã©ãªãã¹ã ãŒãºã«ããŒãžã§ããŸããã ãŸããStep2ãéã㊠PRã®å岿¹æ³ ã 倿Žãå ããã¬ã€ã€ãŒã®é çª ãæç¢ºã«ãªããæ¬¡ã®ã¹ãããã§ããã¢ãžã¥ãŒã«æŽæ°å
šäœã®ãªã¢ãŒããã¯ãã£ãžã®èªä¿¡ãã€ããŸãããå€§èŠæš¡ãªãªãã¡ã¯ã¿ãªã³ã°ã«çæããéã¯ãæãç¬ç«æ§ã®é«ãéšåããå§ããããšã§ãã¬ãã¥ãŒã§ã®å顿€ç¥ããã°æ··å
¥ã®é²æ¢ã«çŽçµããŸããæåã®å°ããªã¹ããããéããŠPRã®å岿¹æ³ã倿Žãå ããã¬ã€ã€ãŒã®é çªãææ¡ããŠãããšãåŸç¶ã®å€§ããªã¹ããããããèªä¿¡ãæã£ãŠé²ããããŸãã Step3: MallHomeViewControllerå
šäœã«ViewModel/UseCaseãå°å
¥ãã ããŒã ç»é¢ã§ã¯ãäžä»£å¥ã©ã³ãã³ã°ã¢ãžã¥ãŒã«ã®ååŸAPI以å€ã«åèš4ã€ã®APIã䞊è¡ããŠåŒã³åºããŠããŸããStep3ã§ã¯ãããã®äž»èŠAPIãåŒã³åºããŠããéšåãã¹ãŠã«ViewModel/UseCaseãå°å
¥ããŸãããStep3ã¯Step2ã®ããã«ã¹ã ãŒãºã«ã¯è¡ãããããã€ãã®åé¡ã«çŽé¢ããŸããã代衚çãªåé¡ã玹ä»ããŸãã åé¡1. Swift Concurrencyãžã®ç§»è¡ åœæã® MallHomeViewController ã§ã¯ãäžéšåã®APIåŒã³åºãã« BrightFutures ã䜿ã£ãŠããŸããããã®ã©ã€ãã©ãªã¯2022幎ã«EOLãšãªã£ãŠãããããŒã å
ã§ãæ°èŠå®è£
ã§ã¯éæšå¥šãšããŠããããããã®ã¿ã€ãã³ã°ã§Swift Concurrencyãžç§»è¡ããŸããã Swift Concurrency察å¿ã«é¢ããŠããã®ãšããåããŠã®çµéšã§ããã®äžã§è²ã
ãšåŠã³ããããŸããã 䞊è¡åŠçã«ãããã¥ãŒè¡šç€ºæã®è¡šç€ºé æ
ä¿ ã¯ããŒãžã£ããŒã¹ã®ã³ãŒãã§ã¯ãè€æ°ã®ã¢ãžã¥ãŒã«ååŸAPIãçŽåã§åŒã³åºããŠããããã¹ãŠã®ã¬ã¹ãã³ã¹ãæã£ãŠããäžæ¬ã§æç»ããŠããŸãããSwift Concurrencyãžç§»è¡ããŠäžŠè¡åŒã³åºãã«ããããšã§ãã©ã®APIã¬ã¹ãã³ã¹ãå
ã«è¿ã£ãŠããããäžå®ã«ãªããŸããã¬ã¹ãã³ã¹ãåãåã£ãé ã«UIModelãç©ãã§ããå®è£
ã®ãŸãŸã§ã¯è¡šç€ºé ãå€ãã£ãŠããŸããŸãããå®è£
åœåã¯ãã®åé¡ã«æ°ã¥ããŠããŸããã§ããã UIModelã®é
åã«åžžã«æ±ºãŸã£ãé åºã§æ ŒçŽããå®è£
ã«ä¿®æ£ããããšã§è§£æ±ºããŸããããã¹ãŠã®APIã¬ã¹ãã³ã¹ãæã£ãŠããæ£ããé åºã§ãŸãšããŠæç»ãããšããåºæ¬çãªæµãã¯å€ãããã䞊è¡ååŸã«ããé床æ¹åãšè¡šç€ºé ã®ä¿èšŒãäž¡ç«ããŠããŸãã withCheckedThrowingContinuation ã«ãã£ã³ã»ã«ãäŒæããªãã£ã ç¹å®ã®APIåŒã³åºãã«ã¯ã¿ã€ã ã¢ãŠãåŠçãå¿
èŠã§ããã withThrowingTaskGroup ã䜿ãã ããŒã¿ååŸã¿ã¹ã¯ ãš äžå®æéåŸã«ã¿ã€ã ã¢ãŠããšã©ãŒãæããã¿ã¹ã¯ ã䞊走ãããŸãããã©ã¡ãããå®äºããã group.cancelAll() ã§ããäžæ¹ããã£ã³ã»ã«ããå®è£
ãæ¡çšããŠããŸããã ãããå®éã«ã¯ãã£ã³ã»ã«ãæ£ããæ©èœããŠããŸããã§ãããéä¿¡ãåæãããç¶æ
ã§ãªããŒããç¹°ãè¿ããšãã¿ã€ã ã¢ãŠããçºçã㊠group.cancelAll() ãåŒã³åºãããŠããã«ãããããããããŒãã£ã³ã°ãæ°žé ã«ç¶ãäžå
·åãçºçããŠããŸããã åå ã¯ãã³ãŒã«ããã¯åã®ãµãŒãããŒãã£SDKã withCheckedThrowingContinuation ã§ããªããžããŠããéšåã«ãããŸããããã®SDKã¯éä¿¡åææã«ã³ãŒã«ããã¯ãåŒã³åºããªãå ŽåããããŸããã¿ã¹ã¯ã°ã«ãŒãã®ãã£ã³ã»ã«ã¯ withCheckedThrowingContinuation å
ã«ã¯èªåã§äŒæããŸãããã³ãŒã«ããã¯ãåŒã°ããªãéããcontinuationã¯è§£æ±ºãããªããŸãŸãšãªããŸãã // ä¿®æ£å: ãã£ã³ã»ã«ã continuation ã«äŒæããªã func fetchData () async throws -> Response { try await withCheckedThrowingContinuation { continuation in legacySDK.fetch { result in // éä¿¡åææã¯ãããåŒã°ããªãå Žåããã // group.cancelAll() ãããŠã continuation 㯠resolve ãããªããŸãŸ continuation.resume(with : result ) } } } // ä¿®æ£åŸ: withTaskCancellationHandler ã远å ãããã£ã³ã»ã«æã« continuation ã resolve ãã func fetchData () async throws -> Response { let holder = ContinuationHolder() return try await withTaskCancellationHandler { try await withCheckedThrowingContinuation { continuation in holder.continuation = continuation legacySDK.fetch { result in holder.continuation?.resume(with : result ) } } } onCancel : { // ã¿ã¹ã¯ããã£ã³ã»ã«ããããšããonCancel ã§ãšã©ãŒãæã㊠continuation ã解決ãã holder.continuation?.resume(throwing : APIError.cancelled ) } } å¯Ÿå¿æ¹æ³ã¯ withTaskCancellationHandler ã远å ããããšã§ãããã¿ã¹ã¯ããã£ã³ã»ã«ããããš onCancel ã¯ããŒãžã£ãåŒã°ããããã§continuationã«ãšã©ãŒãæããããšã§ãã³ãŒã«ããã¯ãè¿ã£ãŠããªãç¶æ
ã§ãã¿ã¹ã¯ãçµäºã§ããŸããcontinuationãžã®åç
§ã class ã§ä¿æããŠããã®ã¯ã onCancel ã¯ããŒãžã£ãå¥ã³ã³ããã¹ãã§å®è¡ãããããã§ãã var ã§ã¯Swift Concurrencyã®èŠåãåºãŸãã withCheckedThrowingContinuation ã¯ã³ãŒã«ããã¯åAPIã async/await ã«å€æããææ®µãšããŠæå¹ã§ãããã¿ã¹ã¯ãã£ã³ã»ã«ã¯èªåã§ã¯äŒæããŸããããã£ã³ã»ã«ã«å¯Ÿå¿ãããã«ã¯ withTaskCancellationHandler ãšçµã¿åãããŠã onCancel æã«æç€ºçã«continuationã解決ããå¿
èŠããããŸãã åé¡2. ã¢ãžã¥ãŒã«æ§ç¯ã¡ãœããã®æŽç Step3ã®çµç€ã§ã¯ãViewControllerã«çœ®ãããŠãã500è¡åŒ±ã®å·šå€§ãªã¢ãžã¥ãŒã«æ§ç¯ã¡ãœãããæŽçããŸããã ãã®ã¡ãœããã«ã¯2ã€ã®è²¬åãæ··åšããŠããŸããã UICollectionViewã«è¡šç€ºããããŒã¿ãœãŒã¹ã®äœæïŒVCåŽã®è²¬åïŒ ååæŒäžæã®ãã°éä¿¡ã«å¿
èŠãªã¢ãžã¥ãŒã«å
äœçœ®æ
å ±ã®èšç®ïŒVMåŽã®è²¬åïŒ åŸè
ãViewModelãžç§»åããåã¢ãžã¥ãŒã«ã®åäžæ§æ¯èŒãå¯èœãªæ§é ãšããããšã§ãäœçœ®æ
å ±ãé©åã«ååŸã§ããããã«ããŸããã ããããšèªäœã¯äžæã§æžããããã«ãšãŠãã·ã³ãã«ãªãã®ã§ããå®è£
åœæã®èªåã®èªèãåæ§ã§ããã®æŽçã«é¢ããŠã¯ã¹ã ãŒãºã«é²ã¿ããã®ãŸãŸStep3ããªãªãŒã¹ããŸããã ããããããã§ä»åã®ãªã¢ãŒããã¯ãã£ã«ãããæå€§ã®å£ã«ã¶ã€ãã£ãŠããŸããŸãã Step3å®äºåŸã«ãã°ã«é¢ãããã°ãçºèŠ Step3ã®ãªãªãŒã¹åŸãã¢ãžã¥ãŒã«ã管çããŠããããŒã ãããã«ã«ãŒã»ã«ãããŒã®ã¿ãããã°ã§ããããŒã®äœçœ®ãæ£åžžã«éãããŠããªãããšããåãåãããå±ããŸããã 調æ»ã®çµæãã«ã«ãŒã»ã«ãããŒã®ã¿ããæã®ãã°ã«å«ãŸããããããŒã®äœçœ®ããšããŠã ããŒã ç»é¢å
šäœã«ãããã»ã¯ã·ã§ã³ã®è¡šç€ºäœçœ® ã誀ã£ãŠéä¿¡ããŠããããšã倿ããŸãããæ¬æ¥éãã¹ãå€ã¯ ã«ã«ãŒã»ã«å
ã®ãããŒã®äœçœ®ïŒäœæç®ã®ãããŒãïŒ ã§ããã ãã°ãåŒãèµ·ãããåå ã¢ãžã¥ãŒã«/ã»ã¯ã·ã§ã³/ã€ã³ããã¯ã¹ãªã©ã®äœçœ®ã«é¢ããåœåã®ææ§ã ããŒã ç»é¢ã¯è€æ°ã®ã³ã³ãã³ãã瞊ã«äžŠã¹ãæ§æã§ãããç»é¢äžã®è¡šç€ºé ïŒã»ã¯ã·ã§ã³äœçœ®ïŒããšãåã³ã³ãã³ãå
ã®äœçœ®ïŒã€ã³ããã¯ã¹ïŒããšãã2çš®é¡ã®"äœçœ®"ãååšããŸãããã³ãŒãäžã§ããããåºå¥ããåœåãäžæç¢ºã§ããã APIããååŸããã¬ã¹ãã³ã¹å/ãã°éä¿¡çšãã©ã¡ãŒã¿ãŒå/å
éšã§äœ¿çšããŠãã倿°åã®ããããã®äœ¿ãåããææ§ãªãŸãŸå®è£
ãç©ã¿éããŠãããã³ãŒããèªãéã«æ··åããããç¶æ
ã§ããã ãã°ã®å€ã®æ£ããããã¹ãã§æ€èšŒã§ããŠããªãã£ã ããã°ãéä¿¡ãããããšãã¯æå確èªã§æ€èšŒããŠããŸãããããéä¿¡ããããã°ã®å€ã®æ£ããããŸã§æ€èšŒã§ããŠããŸããã§ããã åœæã¯ãŠããããã¹ããæŽåãããŠããªãã£ããããã³ãŒãã¬ãã¥ãŒã ãã§ã¯é²ããããŸããã§ããããŠããããã¹ããããã°ããã®ãã°ã¯ãªãªãŒã¹åã«æ€ç¥ã§ããã¯ãã§ãã ããããæ€ç¥ã§ããªãã£ãèæ¯ãšããŠãSwift Concurrency察å¿ã§ã®æ³å®å€ã®å·¥æ°ã«ããçŠããšããã°ã®éèŠåºŠãçãèŠç©ãã£ãŠããããšãæããããŸãã Step3ã®çµç€ã®PRã¯Step2ãšã¯æã£ãŠå€ãã£ãŠ500è¡ãè¶
ãã倧ããªPRã«ãªã£ãŠããŸããã¬ãã¥ã¢ã«ã倧ããªè² æ
ããããŠããŸããŸããããå°ããåå²ããŠé²ããããšããåœåã®æ¹éã貫ããªãã£ãç¹ãåçã®1ã€ã§ãã Step3-ex: åœåæŽçãšãŠããããã¹ãã®è¿œå ãã°ãè¿
éã«ä¿®æ£ããåŸãStep3ã®å»¶é·ãšããŠåœåã®æŽçãšãŠããããã¹ãã远å ããŸããã åœåã®æŽç Step3ã§ã®ãã°åå ã®1ã€ãããã°éä¿¡ã³ãŒãã®èªã¿ã«ãããã«ãã£ãããããŸãåœåãæŽçããŠãããã¹ããæžããšããé åºãéžã³ãŸããã ã¢ãžã¥ãŒã«ã»ã»ã¯ã·ã§ã³åœåã®çµ±äž UICollectionViewäžã®æŠå¿µã®åŒã³æ¹ãšå€æ°ã®åãæŽçãããã¢ãžã¥ãŒã«ããšãã»ã¯ã·ã§ã³ãã®äœ¿ãåãã«ãŒã«ãæç¢ºã«ããŸããã ãã°éä¿¡ã®äœçœ®æ
å ±ã«é¢ããåœåçµ±äž ã»ã¯ã·ã§ã³ã®è¡šç€ºäœçœ®ãšã»ã¯ã·ã§ã³å
ã®ååäœçœ®ã衚ã倿°åããããããæç¢ºã«åºå¥ã§ããååã«çµ±äžããŸããã ãŠããããã¹ãã®è¿œå ãã°ãåŒãèµ·ãããŠããŸã£ããã°éä¿¡æã®ã»ã¯ã·ã§ã³äœçœ®ã«é¢ãããã¹ããã¯ãããšããŠãã¢ãžã¥ãŒã«ã®ååŸãæ§å¥å€æŽãç»é¢é·ç§»ãã©ã€ããµã€ã¯ã«ã€ãã³ããªã©å€æ°ã®ã·ããªãªãã«ããŒããŸãããStep2, Step3ã§UseCaseããããã³ã«ã§DIã§ããæ§é ã«ãªã£ãŠãããããMockã䜿ã£ããã¹ããæžããããã«ãªã£ãŠããŸãã ãŠããããã¹ããæ°èŠã§æžããŠããã®ãåããŠã®çµéšã ã£ãããããã¹ãã«é¢ããç¥èãè±å¯ãªããŒã ã¡ã³ããŒã«ã¢ãã¬ãã¥ãŒãè¡ã£ãŠããããŸããã åœåæŽçãšãã¹ã远å ãçµããæç¹ã§ãMallHomeViewModelã®ãã¹ãã«ãã¬ããžã¯38ïŒ
ãã99ïŒ
ã«åäžããŸããã äžç¢ºããã«æ°ã¥ããæç¹ã§ãã¹ããæžã Step3ã§ã¯ãã¢ãŒããã¯ãã£ãæŽåããŠãããã¹ããæžãã°ããããšããèããããã°ãåŒãèµ·ãããŠããŸãããã®èãã®å±ããã宿ããŸããããã°ãäžç¢ºããã«æ°ã¥ããã¿ã€ãã³ã°ã§ãã¹ããæžãããšã§ãçµæçã«æ¬¡ã®ã¹ããããå®å¿ããŠé²ããåã«ãªããŸãã Step4: HomeViewControllerã«ViewModel/UseCaseãå°å
¥ãã æçµã¹ãããã®Step4ã§ã¯ããŒã ç»é¢å
šäœã管çããŠãã HomeViewController ã®ãªã¢ãŒããã¯ãã£ãè¡ããŸããããã®ã¹ãããã§ã¯ãStep3ãŸã§ã®å€±æãšåŠã³ã掻ãã㊠TDDïŒãã¹ãé§åéçºïŒ ãæ¡çšããŸããããŸããStep3ã§ã®PRåå²ã®ç²åºŠãã¹ãèžãŸããã¬ãã¥ãŒããããç²åºŠã§PRãäœæãã¬ãã¥ã¢ãžã®è² æ
ãèæ
®ããPRæŠç¥ãåããŸããã TDDã«ããèšèšã®å
±æ Step4ã§ç¹çãã¹ãã¯ã UseCase/ViewModelã®ãã¹ãã±ãŒã¹ãProtocol/å®è£
ããå
ã«äœæãã ããšã§ããUseCase/ViewModelã®ãã¹ãéåœ¢äœæ â ãã¹ãã±ãŒã¹ã®äœæ â UseCase/ViewModelãšProtocolã®äœæ â å®è£
ããšããé çªã§é²ããŸããã ãã®TDDã¢ãããŒããç¹ã«åšåãçºæ®ããã®ãã ãã°éä¿¡åšãã®ä»æ§æŽç ã§ããã HomeViewController ã®ãã°éä¿¡ããžãã¯ã¯è€éã§ãèµ·åçµè·¯ïŒéåžžèµ·åã»ããã·ã¥éç¥ã»DeeplinkïŒãã¿ãåãæ¿ãã«å¿ããŠã©ã®ãã°ãã©ã®ã¿ã€ãã³ã°ã§éãããå€ãããŸãããŸããåãç»é¢é·ç§»ã§ãè€æ°ã®ã©ã€ããµã€ã¯ã«ã€ãã³ããé£ç¶ããŠçºç«ããããããã°ã®äºééä¿¡ã鲿¢ããå¶åŸ¡ãå¿
èŠã§ãããã®ãããªä»æ§ã§ã¯å®è£
è
ããšã«è§£éãåããããããStep3ãšåãèœãèžãå¯èœæ§ããããŸããã ããã§å®è£
ã«å
ç«ã¡ãèµ·åçµè·¯ããšã®ãã°éä¿¡ãããŒãããã¥ã¡ã³ããšããŠæŽçãã ããŒã ã§ä»æ§ãåæããäžã§ãã¹ãã±ãŒã¹ãèšèšãã ãšããããã»ã¹ãèžã¿ãŸãããããã¥ã¡ã³ãã«ã¯ ã©ã®åç·ã§ã©ã®ãã°ãäœåéãããã¹ãã ãç¶²çŸ
çã«èšè¿°ããããããã®ãŸãŸãã¹ãã®ä»æ§ãšããŠå
±æããŸããã ãã¹ãèšèšã«ãããŠéèŠãªæ¹éãšããŠã å
éšã®ãã©ã°ç¶æ
ã§ã¯ãªããŠãŒã¶ãŒã®åç·åäœã§ãã¹ããèšè¿°ãã ããšãæ¡çšããŸãããäŸãã°ä»¥äžã®ãããªã·ããªãªããã®ãŸãŸãã¹ãåãšããŠèšè¿°ããŠããŸãã éåžžã®ã¢ããªèµ·åã§ããŒã ç»é¢ã衚瀺ãããšãããã°ã1床ã ãéä¿¡ãããããš ããã·ã¥éç¥ã§ã¢ããªãèµ·åãããšããç¹å®ã®ãã°ã¯éä¿¡ããªãããš Deeplinkã§ããŒã ç»é¢ã«é·ç§»ãããšããviewWillAppearã§ã®ãã°éä¿¡ã¯ã¹ãããããããš ãã©ã®åç·ã§äœãèµ·ããã¹ããããšãã圢ã§ãã¹ããæžãããšã§ããã¹ãã仿§æžãšããŠæ©èœããããã«ãªããŸããå
éšå®è£
ããªãã¡ã¯ã¿ãªã³ã°ã§å€ãã£ãŠããåç·ããŒã¹ã®ãã¹ãã¯ãã®ãŸãŸç¶æã§ãããããä¿å®æ§ãé«ãŸããŸããã ãã¹ããå
ã«æžãããšã§ãããã®UseCaseã¯äœããã¹ããããããŒã ã§è°è«ããªããèšèšãé²ããããšãã§ããŸãããStep3ã§ããžãã¯ã®æŒãããã°ã«ã€ãªãã£ããšããåçããããã§æŽ»ããŠããŸãã ãªã³ããŒãã£ã³ã°åšãã®ç¶æ
管ç HomeViewController 㯠ãªã³ããŒãã£ã³ã° ïŒååèµ·åæã®æ¡å
ãããŒïŒåšãã®ç¶æ
管çãè€éã§ãã ãªãã¡ã¯ã¿ãªã³ã°åã®èª²é¡ åããŠZOZOTOWNã¢ããªãã€ã³ã¹ããŒã«ãããŠãŒã¶ãŒã¯ãããŒã ç»é¢ã衚瀺ããããŸã§ã«è€æ°ã®æ¡å
ç»é¢ãçµç±ããŸãã åé¡ã¯ããã®äžé£ã®ãããŒã管çããããã« 5ã€ä»¥äžã®Boolãã©ã° ãè€æ°ã®ãã¡ã€ã«ã«ãŸããã£ãŠæ£åšããŠããããšã§ãããäŸãã°ããã°ã€ã³ç»é¢ã®è¡šç€ºãå®äºãããããããã·ã¥éç¥èš±è«Ÿã衚瀺ããããã蚎æ±ãããŒã®è¡šç€ºãå¿
èŠãããšãã£ããã©ã°ãåæã«åæ£ããŠããŸãããããããçµã¿åãããæ¡ä»¶åå²ã«ãã£ãŠæ¬¡ã®è¡šç€ºå
å®¹ãæ±ºãŸãæ§é ã«ãªã£ãŠããŸãããããã«ããããä»ã©ã®ãã©ã°ãã©ã®ç¶æ
ã®ãšãäœãèµ·ããã®ãããææ¡ããã ãã§ãããªãã®ã³ã¹ããããã£ãŠããŸããã ãã®ãããªè€éããåå ã®1ã€ãšãªãããªã³ããŒãã£ã³ã°ã«é¢ããäžå
·åãçºçããããšããããŸããã ã¹ããŒããã·ã³ã«ããåèšèš Step4ã§ã¯ãã®ãªã³ããŒãã£ã³ã°ãããŒãã¹ããŒããã·ã³ãšããŠåèšèšããŸããã ãªã³ããŒãã£ã³ã°ã¯ä»¥äžã®4ã€ã®ç¶æ
ïŒStateïŒãšããããããé·ç§»ãããã€ãã³ãïŒEventïŒã«ãã£ãŠã¢ãã«åãããŸãã ViewModelã¯ãã®ç¶æ
ã賌èªããç¶æ
ã«å¿ããŠã©ã®ç»é¢ã衚瀺ãããã宣èšçã«èšè¿°ããŸãã ãã®èšèšã«ããããçŸåšã®ãããŒã®ã©ãã«ãããããç¶æ
ãšããŠäžç¹ã«éçŽãããé·ç§»ã®ããªã¬ãŒãšãªãã€ãã³ããæç€ºçã«ãªããŸããããããŸã§ã®ãã©ã°ã®çµã¿åããã«ããæé»çãªç¶æ
管çããè±åŽããã³ãŒããèªãã ãã§ãªã³ããŒãã£ã³ã°ãããŒã®å
šäœåãææ¡ã§ããããã«ãªããŸããã ãŸãããã©ã®ã€ãã³ãã§ã©ã®ç¶æ
ã«é·ç§»ããããããã¹ãã§çŽæ¥æ€èšŒã§ããããã«ãªããŸãããå°æ¥çã«ãªã³ããŒãã£ã³ã°ã®ã¹ãããã远å ã»å€æŽãããŠããç¶æ
é·ç§»ã®å®çŸ©ãä¿®æ£ããã ãã§å¯Ÿå¿ã§ããŸãã ããããŠãçŽ1幎5ãæã«ãããããŒã ç»é¢ãªã¢ãŒããã¯ãã£ãå®äºããŸãããStep4ã«é¢ããŠã¯ãããŒã ç»é¢ã«èµ·å ããé害ãåãåããã¯çºçããŸããã§ããã Step3ã§äœéšãããã°ãšããã®åŸæ®µéçã«æŽåãããã¹ãããå®éã®å質ä¿èšŒãšããŠæ©èœããŠããçµæã ãšæããŠããŸãã ããŒã ç»é¢ãªã¢ãŒããã¯ãã£å®äºåŸãåŸç¶æ¡ä»¶ã§ããŒã ç»é¢ãè§Šã£ãä»ã®ã¡ã³ããŒãããå®è£
ãæ¥œã«ãªã£ãããšãããã£ãŒãããã¯ãããããŸãããããã¯ã責åãé©åã«åå²ãããããšã§æ¹ä¿®ã®åœ±é¿ç¯å²ãææ¡ãããããªã£ãããšã瀺ããŠããŸãã ãŸãããã°åšãã®ä¿®æ£ãå
¥ã£ããšããããã¹ãã§æåãæ
ä¿ã§ããããã«ãªã£ãããšãã声ããããŸãããStep3ã§äœéšãããã°ã«å¯ŸããŠãStep3-ex以éã§æ§ç¯ãããã¹ããå®éã«æ©èœããŠããç¬éã§ããã é·æãªãã¡ã¯ã¿ãªã³ã°ãé²ããäžã§ã®ãã€ã³ã ä»åã®ãªã¢ãŒããã¯ãã£ãéããŠã®åŠã³ããã€ã³ãã¯åã¹ãããã§ç޹ä»ããŸããããå
šäœãéããŠç¹ã«éèŠã ãšæããç¹ãšããŠã èšèšããã¥ã¡ã³ãã®ç¶ç¶çãªæŽå ãæããŸãã èšèšèšç»ïŒæ®µéçãªã¹ãããèšç»ãã€ã³ã¿ãã§ãŒã¹èšèšïŒãææžåããŠããããšã¯ãé·æã«ããããããžã§ã¯ããããŒã ã§å
±æããåå°ã«ãªããŸããããªããã®èšèšã«ãããããæ®ã£ãŠããããšã§ãåŸç¶ã®ã¹ãããã§ãäžè²«ãã倿ãã§ããŸãããŸããAIãæŽ»çšããã³ãŒãã£ã³ã°ãäžè¬çã«ãªã£ãçŸåšã§ã¯ãèšèšæ¹éãææžåãããŠããããšã¯ããäžå±€éèŠã§ããAIãžã®æç€ºã®ç²ŸåºŠãäžããã ãã§ãªããçæãããã³ãŒãããããžã§ã¯ãã®èšèšæå³ãšäžèŽããŠãããã®æ€èšŒã«ã圹ç«ã¡ãŸãã ãããã« ãã®ãªã¢ãŒããã¯ãã£ãæ¯ãè¿ããšãæåã¯ãã¢ãŒããã¯ãã£ã«ã€ããŠã®çè§£ãæ·±ãããããšããåæ©ããå§ãŸããŸããããããå®éã«ã¯ãããã¹ãã®éèŠæ§ããæ®µéçãªå€æŽã®äŸ¡å€ãã倱æãæ¬¡ã«æŽ»ããããšããšãããããæ¬è³ªçãªããšãåŠãã ãããžã§ã¯ãã«ãªããŸããã ç¹ã«ãStep3åŸã®ãã°çºèŠâStep3-exã®ãã¹ã远å âStep4ã§ã®TDDæ¡çšã§ãã°0ãéæã§ããããšã¯ãèªåã®æé·ã匷ã宿ã§ãããã€ã³ãã§ããã ZOZOTOWN iOSã¢ããªã®ãªã¢ãŒããã¯ãã£ã¯ãŸã ç¶ããŠããŸãããã®ããŒã ç»é¢ã§ã®çµéšãããŒã ã®è³ç£ãšããŠç©ã¿äžããªãããããè¯ãã¢ããªãäœãç¶ããŠãããããšæããŸãã ZOZOã§ã¯ãäžç·ã«ãµãŒãã¹ãäœãäžããŠãããæ¹ãåéäžã§ãããèå³ã®ããæ¹ã¯ã以äžã®ãªã³ã¯ãããã²ãå¿åãã ããã corp.zozo.com
Orchestration Guildã¡ã³ããŒã®çŠå±±ã§ããæ®æ®µã¯LINEã¬ã¹ãã©ã³ãã©ã¹ãšãããµãŒãã¹ã§ãããã³ããšã³ãéçºãæ
åœããŠããŸãããã®èšäºã¯ãOrchestration Developme...





















