ããŸããŸãªã¢ãããŒããšå®è£ æ¹æ³ã«æéãåããWEBéçºã æè¡ã¹ã¿ãã¯ã¯å€æ§æ§ã«å¯ãã§ãããããŒã«ã®éžæã«ããããããžã§ã¯ãã®éçºã¹ã¿ã€ã«ãã¢ãžã¥ãŒã«æ§ããŸãã¯éªšåã決ãŸããŸãã
次åã¯é»è©±ãã©ãããã©ãŒã ã«ã€ããŠæžããŸãã VoIPåºæã®åŒ·ãåãã¯ãäž»èŠãªãã®ãã€ãŸãææ°ã®SPAã¢ããªã±ãŒã·ã§ã³ã®éçºæ¹æ³ãã泚æããããã§ãããã
ãã®èšäºã§ã¯ããµãŒãããŒãã£ã®ãµãŒãã¹ãæ¢åã®äœæ¥ç°å¢ã«å°å ¥ããããã»ã¹ã«ã€ããŠèª¬æããŸãã
ä»æ¥ã¯ã Zabbix-APIã§éãã§ã¿ãŸãããã

ã©ã€ããã¢

誰ãèå³ãæã¡ãŸã
10幎åã«ãµãŒããŒåŽã§CGIã¹ã¯ãªããã䜿çšããŠWEBã€ã³ã¿ã©ã¯ãã£ããå®è£ ããææ°ã®ã¢ãããŒããç解ããã人ã ç¬èªã®APIãçºæããªããã°ãªããªãå Žåãäœãèµ·ãã£ãã®ããææžåããããã«ã解決çã以äžã«ç€ºããŸãã
ã¿ã¹ã¯ãèšå®ããŸã
Zabbixã®åæèšå®ã¯ãçµ±åãããWEBã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠè¡ãããŸãã éåžžãã«ãŒãã³ã¯åã«ãã¹ããã°ã«ãŒãã«è¿œå ããã ãã§ãã
èªç€Ÿã®ã·ã¹ãã ã®æ©åšã®èšé²ïŒãã¹ãã®è¿œå ïŒãäŒæ¥ã®Webãµã€ãã«ä¿ç®¡ããŠããŸãã
- Zabbixã®æ¥åžžçãªã¿ã¹ã¯ãæ¢åã®äŒèšç°å¢ã«çµ±åããããšã¯çŽ æŽãããããšã§ãã ãã©ã¡ãŒã¿ãŒã®æ°ãæå°éã«æãããçæ³çã«ã¯1ã€ã®ãè¿œå ããã¿ã³
éåžžãäŒæ¥ã·ã¹ãã ã®éçºã¯å¥ã®ããŒã ã«ãã£ãŠè¡ãããŸãã
- æ¢è£œã®ã¢ãžã¥ãŒã«ã®åœ¢ã§æ©èœãæäŸããããšã¯çŽ æŽãããããšã§ãã çæ³çã«ã¯ãæ°è¡ã®ã³ãŒããimport ...ããšãrender ...ã
- ææ°ã®æè¡ã¹ã¿ãã¯ãã§ããã°æšæºã®å¯Ÿè©±ã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠã¿ãŠãã ãã
æè¡ã¹ã¿ãã¯
ReactJS
ãŠãŒã¶ãŒãšã®å¯Ÿè©±ã¯ã MVCäœæ¥ã¹ããŒã ãšãã®ããªãšãŒã·ã§ã³ã«ãã£ãŠå€å žçã«èª¬æãããŠããŸãã ææã®ç 究ã«ã¯ã Vue ã Ember ã Meteor ã Angular ã ReactJSã®åè£è ãããŸãã ã
ã»ãšãã©ã®ãã¬ãŒã ã¯ãŒã¯/ã©ã€ãã©ãªã¯ã ããã³ããšã³ãããã³ããã¯ãšã³ãã®å®è£ ãåããå®å šãªMVCãšã³ã·ã¹ãã ãå®è£ ããããšããŠããããšãç解ãããããã«ãªãããããããã«ã¹ã¿ãã¯ããšåŒã³ãŸãã
Reactã¯ãMVCãã®ãVãã§ãã ç§ã¯ä»ã®äººã®çæ ç³»ã«é£ã³èŸŒã¿ãããããŸããã§ããããã·ã³ãã«ãªåŒãåºãããšãŠãæ°ã«å ¥ããŸããã WebãIOSãAndroidçšã®1ã€ã®ã³ãŒãã§ããReact Nativeã«é£ã³èŸŒãããšãã§ããã®ã§ãèŠèŸŒã¿é¡§å®¢ã¯åãã§ããŸããã ãããŠReduxãæ¥ç¶ããããšã«ãããå®å šãªã¹ã¿ãã¯ãååŸããå¿ èŠããããŸãã å¥ã«JSXããã©ãŒæ©èœIMHOã«æºè¶³ããŠããŸãã
Jsx
React JSXéçºè ãã¬ã€ã³ã¯ããã©ãŠã¶ãŒã®DOMèŠçŽ ã®æäœãèŠèŠçã«ç°¡çŽ åããJavaScriptã®æ§æã¢ããªã³ã§ãã
ç±å¿ãªWebéçºè ã¯ãHTMLããŒã¯ã¢ãããšJavaScriptã³ãŒããæ··åããããšã§åœŒãscããŸããã ç§ã¯ããã©ã³ã®éçºè ã§ã¯ãªããJSXã¯çŽ æŽããããœãªã¥ãŒã·ã§ã³ã ãšèããŠããŸãã
NodeJS
æåã¯ãããã©ãŠã¶ãJavaScriptã§èšè¿°ããã®ã䟿å©ã«æããŸããã 確ãã«ããããžã§ã¯ããã¢ãžã¥ãŒã«ã«åå²ããŠå¿ èŠãªã¢ãžã¥ãŒã«ãããŒãããã®ã¯äžäŸ¿ã§ãã ãã®åé¡ã¯Bowerããã±ãŒãžãããŒãžã£ãŒã«ãã£ãŠè§£æ±ºãããŸããã Bowerã«ã¯ç¬èªã®å²åŠããããã¢ãžã¥ãŒã«ã®ããŒãžã§ã³ãäºãã«ç«¶åããªãããã«æ³šæããŠããŸãã
å®éã«ã¯ãå¿ èŠãªãã¹ãŠã®ããŒã«ãnpmããã±ãŒãžãšããŠå©çšå¯èœã§ããããšãå€æããŸããã ç®çã®ã¢ãžã¥ãŒã«ãnpmããã±ãŒãžãšããŠå©çšã§ããªãå Žåã¯ãBowerãè¿œå ããããšããå§ãããŸãã
çµæã Nodeã«æžã蟌ã¿ãnpmããã±ãŒãžãããŒãžã£ãŒã䜿çšããŸãã
Browserify
NodeJSã¯ããã©ãŠã¶ããŒã¹ã§ã¯ãªãããµãŒããŒåŽã®JavaScriptã§ãã åè¯ãªäººã ã¯ã Nodeifyã³ãŒãããã©ãŠã¶ãŒããŒãžã§ã³ã«ãªã¡ã€ã¯ããBrowserify ãã©ã³ã¹ããŒã¿ãŒã æãä»ããŸããã
ããã«
ãã©ãŠã¶ã«ã¯ãçµã¿èŸŒã¿JavaScriptãšã³ãžã³ã®æŽæ°é床ãé«ããããŸããã ç§ã¯ãææ°ã®JavasScriptã®ãã¹ãŠã®ãç ç³ããã€ãŸãå¥ã®ããŒã«-Babelã䜿çšããããšæããŸãã ECMAScriptã®ææ°ããŒãžã§ã³ã§åäœãããã©ã³ã¹ããŒã¿ãŒã ããã§ããJSXæ§æãèªèããã®ã¯åœŒã§ãã
ã¬ã«ã
JavaScriptã§ã®äœæ¥ã«å ããŠãææ°ã®WEBããŒãžã¯CSSãå€çšããŠããŸãããããã¯æ°ããã¬ãã«ã®SASSæœè±¡åã«ç§»è¡ããŸããã ç¬èªã®ãã©ã³ããšç»åãããŒããããŸãã HTMLããã¹ãã¯ããŸããŸãªãã¡ã€ã«ã«æ£åšããå¯èœæ§ããããŸãã ãã®çµæãæçµãããžã§ã¯ãã®æ§ç¯ã¯ãããŸããŸãªæ¹æ³ã§ãã¡ã€ã«ã·ã¹ãã ã«æ£åšããããŸããŸãªãã¡ã€ã«ã«å¯Ÿãã10ã®ã¢ã¯ã·ã§ã³ã«ãªããŸãã
Gulpã¯ã³ã¬ã¯ã¿ãŒã§ãã å®éãããã¯éåžžã®Nodeã¹ã¯ãªããã§ããããããžã§ã¯ãã®ãœãŒã¹ãã¡ã€ã«ãåŠçããã¢ã¯ã·ã§ã³ãèªååãããŠããŸãã
ç§ã¯GulpãéžæããŸããããã€ãŠããã®åŠçã®ååãæ°ã«å ¥ã£ãŠããŸãããã¹ããªãŒã åŠçãé«éã§ãã 圌㯠Gruntãç Žã ã Insaytã®èšäºãå ¥æããŸãããããã«åºã¥ããŠgulpfile.jsãäœæããŸãã ã
ãããã¯ã webpackãæ€èšããããšã¯çã«ããªã£ãŠããŸã ãç§ã¯è©ŠããŸããã§ããã
ããã§æ³šç®ã«å€ãã-ããã³ããšã³ããéçºããããã®äž»èŠãªããŒã«ããªã¹ãããŸããã ä»åºŠã¯ããã¯ãšã³ãã®çªã§ãã
ããããæåã«ãå°æ¥ã®Reactã³ã³ããŒãã³ããšZabbix-APIã®åäœåçãå®åŒåããŸãã
ç®ç
- ããã³ãããã¯ã®ããåããåçŽãªRESTãªã¯ãšã¹ãã«æžãã
- ZabbixãµãŒããŒãšã®ããåãã®ãã¹ãŠã®ããžãã¯ãããã¯ãšã³ãã«éäžããããã
- åªå æšæºã€ã³ã¿ãŒãã§ãŒã¹+ããã¥ã¡ã³ã
ããã³ããšã³ãã§ãã¹ãŠã®ããžãã¯ãç©ã¿éããããšã¯å¯èœã§ãããããã¯æªãããšã§ãïŒ
- Zabbix-APIã¯ããã¹ãŠã®ã¯ã©ã€ã¢ã³ããã©ãŠã¶ã«å¯ŸããŠéãããŠããå¿ èŠããããŸãã ã¢ã¯ã·ã§ã³ã®ã»ãããå¶éãããŠããå¥ã®ãªãœãŒã¹ãéãæ¹ãå®å šã§ã
- SNMPã»ã³ãµãŒãtelnetã»ãã·ã§ã³ããµãŒããŒOSãªãœãŒã¹ãªã©ãæ ¹æ¬çã«ç°ãªãã·ã¹ãã ã§æ©èœããäžè¬çãªãœãªã¥ãŒã·ã§ã³ãäœæããŸãã ïŒZabbixã¯å®è£ ã®1ã€ã«ãããŸããïŒã ãã©ãŠã¶ã«ã¯ãã®æ©èœããããŸãã
çµæã ç¬èªã®APIãåãããã¹ããŒããããã¯ãšã³ããå¿ èŠã§ãã
ããå°ãã®æè¡
Openapi
é»è©±ãã©ãããã©ãŒã ã«çµ±åãããšãæåã®ãã¬ãŒãããå®æããŸããã ç§èªèº«ã®APIãµãŒããŒãäœæãããŸããã 圌ã¯åããã ãœããã¹ã€ããã®ãã¹ãã¢ãªã³ã°ãã«æåããæ¬è³ªçã«RESTã§ã¯ãªãRESTèŠæ±ãåãå ¥ããŸããã ãªã¯ãšã¹ãã®åœ¢åŒãæ¹æ³ããã©ã¡ãŒã¿ã«é¢ããããã¥ã¡ã³ãã¯ãããŸããã§ããã
ãã®ç¶æ³ã«é¢å¿ãå¯ããããŸããããããã¥ã¡ã³ããèªåçã«çæãããããã«ãäœããã®åœ¢ã§APIã圢åŒåããããšã¯å¯èœã§ããïŒ OpenAPIã®ã¢ãããŒããæ°ã«å ¥ããŸããã
äžçªäžã®è¡ã¯ãæåã«ãã¹ãŠã®ã¡ãœããããã£ãŒã«ããå¿ç圢åŒãªã©ãèšè¿°ãããä»æ§ãã¡ã€ã«ãæžãå¿ èŠããããšããããšã§ãã 次ã«ããã®ãã¡ã€ã«ã«åºã¥ããŠãæ¢è£œã®APIãµãŒããŒãçæã§ããŸãã èšèªã®ãªã¹ãã¯å°è±¡çã§ããNodeJSã§è¡ããŸãã
ä»æ§ãã¡ã€ã«ã¯æšæºã§ããããã Swagger ã ReDoc ã OA Viewerãªã©ã®ããŒã«ãæ¢ã«èæ¡ãããŠããŸã ã ããã¥ã¡ã³ãã®åé¡ã¯èªåçã«è§£æ±ºãããŸã-ããã¯ä»æ§ãã¡ã€ã«ã§ãã
Docker
ããã«å®è¡å¯èœãªã³ãŒããæžãå§ããŸãã ã¹ã¯ãªããã¯NodeJSã«ãããŸãã ã©ã®èšèªãé²åããããŒãžã§ã³ãå€åããŸããç°ãªãããŒãžã§ã³ã®èšèªã§çµæãè©ŠããŠã¿ããšããã§ãããã åèšèªã«ã¯ãããžã£ã°ãªã³ã°ãããŒãžã§ã³çšã®ç¹å¥ãªããŒã«ããããŸãã
ç§ã¯ããæ ¹æ¬çã«è¡åããŸãã Linuxã«ãŒãã«ã¬ãã«ã§éåžžã«ç°¡åãªä»®æ³åãæäŸããåªããLXCãã¯ãããžãŒããããŸãã ããã䜿ããªãã®ã¯çœªã§ãã ä»ã®OSã®å Žåãç¹æ®æ§ããããéçºè ã¯ãã¥ã¢ã³ã¹ãèæ ®ããŠDocker補åãäœæããŸããã
å¿ èŠãªDockerã³ã³ããã«å¿ èŠãªéçºç°å¢ãæ§ç¯ããŸãã
ããå§ããŸããã
ãã®ãããžã§ã¯ãã¯Githubã§å ¥æã§ããŸãã
git clone https://github.com/ars-anosov/zabbix-react.git
zabbix-reactor-node
ããã¯ãšã³ããµãŒããŒããzabbix-reactor-nodeããšåŒã³ãŸãã ä»æ§ãã¡ã€ã«ã調ã¹ãŸãã ãã¹ããã£ãŒã«ãã確èªããŠãã ããã
less zabbix-react/node-back/api/zabbix-api.yaml
ãµãŒããŒããã·ã³ã«ãããã€ããå Žå
host: 'localhost:8002'
ãµãŒããŒã¯ããzabbix-api.yamlãã«åºã¥ããswagger ãšãã£ã¿ãŒã䜿çšããŠæ§ç¯ãããŸãã æ§é ã¯æ¬¡ã®ãšããã§ãã
index.js-èµ·åã¹ã¯ãªãã
var app = require('connect')() var swaggerTools = require('swagger-tools') var http = require('http')
- http -WEBãµãŒããŒ
- ããã«ãŠã§ã¢swagger-toolsãšæ¥ç¶ -èŠæ±åŠç
// Route validated requests to appropriate controller app.use(middleware.swaggerRouter(options)); // Serve the Swagger documents and Swagger UI app.use(middleware.swaggerUi({ apiDocs: '/spec/swagger.json', swaggerUi: '/spec-ui'
æ¹æ³
- middleware.swaggerRouter-zabbix-react / node-back / controllersãã£ã¬ã¯ããªå ã®é©åãªã³ã³ãããŒã©ãŒã«ãªã¯ãšã¹ãã転éããã«ãŒã¿ãŒ
- middleware.swaggerUiã¯SwaggerUIããŒã«ã§ãã ããã¯APIããã¥ã¡ã³ãã§ããããã¹ãRESTãªã¯ãšã¹ããå®è¡ã§ããŸãã
ã³ã³ãããŒã©ãŒ/ -APIèŠæ±ã®åŠçãæ åœããã¹ã¯ãªãã
Configuration.js Data.js config_host_del.js config_host_get.js config_host_post.js config_host_put.js config_hostgroup_get.js data_hostlink_get.js
ããã¯ãZabbix-APIãšã®ããåããããžãã¯ã§æºããããŠããå Žæã§ãã
ãããŒãããã¯ããã£ã¬ã¯ããªã¯ãDockerã³ã³ããã«ã¹ã¯ããŒã«ãããŸãïŒããã«ç§»åããŸãã
cd zabbix-react/node-back/
ãzabbix-reactor-nodeããèµ·åããŸãã ç°å¢å€æ°ZX_URLãZX_USERãZX_PASSãã³ã³ãããŒã«æž¡ããŸã-ç¬èªã®Zabbixãããå Žåã¯ãç¬èªã«é§åããŸãã äŸãšããŠãç§ã®ãã¹ãZabbixã䜿çšã§ããŸãã
docker run \ --name zabbix-reactor-node \ -v $PWD:/zabbix-reactor-node \ -w /zabbix-reactor-node \ --publish=8002:8002 \ --env="ZX_URL=http://zabbix-server.react.com.ru/api_jsonrpc.php" \ --env="ZX_USER=guest" \ --env="ZX_PASS=" \ -it \ node:8 bash
zabbixã®å€ãããŒãžã§ã³ã¯ãç°ãªãURLã§ãªã¯ãšã¹ããåãå ¥ããããšãã§ããŸãã Zabbixã®ããã¥ã¡ã³ããã芧ãã ããã
次ã«ãã³ã³ããå ã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã
npm install node index.js $ZX_URL $ZX_USER $ZX_PASS
ã³ã³ããããé£ã³åºãïŒCtrl + P + Q
å¯çšæ§ã®ç¢ºèªSwaggerUI- httpïŒ// localhostïŒ8002 / spec-ui /
ãããŒã¯ã³ããã£ãŒã«ãã«ããã¹ãããšå ¥åããŸãã èªèšŒããŒã¯ã³ããããnode-back / sub_modules / aaa_handle.jsã¹ã¯ãªãããæ€èšŒã«é¢äžããŸãã
Zabbixèšå®
Zabbixã®ç¹å®ã®ãã¹ãã°ã«ãŒãã®ã¿ã«ã¢ã¯ã»ã¹ãèš±å¯ããŸãã ãããè¡ãã«ã¯ãå¥ã®ãŠãŒã¶ãŒreact_userãäœæããŸãã
- 管ç/ãŠãŒã¶ãŒã°ã«ãŒã-ãŠãŒã¶ãŒã°ã«ãŒããreact_user_groupããè¿œå ããŸã
- 管ç/ãŠãŒã¶ãŒã°ã«ãŒã/æš©é-react_userã®äœ¿çšãèš±å¯ãããã¹ãã°ã«ãŒããè¿œå ããŸãã èªã¿æžããå ¬éããŸãã
- 管ç/ãŠãŒã¶ãŒ-ãŠãŒã¶ãŒãè¿œå ãã段èœ1ã§äœæãããŠãŒã¶ãŒã°ã«ãŒãã«å«ããŸã
- 管ç/ãŠãŒã¶ãŒ/ã¢ã¯ã»ã¹èš±å¯-ãŠãŒã¶ãŒã¿ã€ãã»ãããZabbix Adminã
zabbix-react-front
éçºç°å¢ãæ§ç¯ããŠããzabbix-react-frontããšåŒã³ãŸãããã
ãweb-frontããã£ã¬ã¯ããªã¯Dockerã³ã³ããã«ã¹ã¯ããŒã«ãããŸãïŒããã«è¡ããŸãã
cd zabbix-react/web-front/
zabbix-react-frontãå®è¡ããŸãã
docker run \ --name zabbix-react-front \ -v $PWD:/web-front \ -w /web-front \ --publish=8003:8003 \ -it \ node:8 bash
次ã«ãã³ã³ããå ã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã
# gulp-cli npm install -g gulp-cli # (, , ) npm install
ã³ã³ããŒãã³ãã¯web-front / src / js / componentsãã£ã¬ã¯ããªã«ãããç¬èªã®äŸåé¢ä¿ããããŸãã
ã€ã³ã¹ããŒã«ïŒ
npm run install-components
ãããžã§ã¯ããweb-front / buildãã£ã¬ã¯ããªã«åéããŸã
gulp
ã³ã³ããããé£ã³åºãïŒCtrl + P + Q
ã³ã³ããŒãã³ãã®åäœã確èªããŸã-httpïŒ// localhostïŒ8003 /
zabbix-react-component
ãã®ãããã³ã³ããŒãã³ãã䜿çšããå¿ èŠããããŸããã ä»äœãå®è¡ãããŠããã®ãèŠãŠã¿ãŸãããã
- zabbix-reactor-node-OpenAPIãµãŒããŒã http㧠RESTãªã¯ãšã¹ããåä¿¡ããããã«éããŸãïŒ// localhostïŒ8002 / ...
- zabbix-react-front-Reactã³ã³ããŒãã³ãã衚瀺ããããã®livereload-webãµãŒããŒã httpã§æç»ïŒ// localhostïŒ8003 /
次ã®ãã¡ã€ã«æ§é ã䜿çšããŸãã
web-front / src / index.jsx-ã³ã³ããŒãã³ããå«ãJSXã¹ã¯ãªãã
import React from 'react'; import ReactDOM from 'react-dom' import { OpenApiSwagger, HostConfig, HostGraph } from './components/zabbix-react-component' window.localStorage.setItem('token', 'test') const specUrl = 'http://localhost:8002/spec/swagger.json' const swg = new OpenApiSwagger(specUrl) swg.connect((client, err) => { if (err) { ReactDOM.render( <div className='std-win'>no spec - <a href={specUrl}>{specUrl}</a> !</div>, document.getElementById('root') ) } else { ReactDOM.render( <div> <HostConfig swgClient={client} /> <HostGraph swgClient={client} /> </div>, document.getElementById('root') ) } })
- specUrl-zabbix-reactor-nodeã®ä»æ§ãã¡ã€ã«ãžã®ãã¹
web-front / src / components / -ã³ã³ããŒãã³ãã®ãããã£ã¬ã¯ããª
web-front / src / components / zabbix-react-component.js-ãšã¯ã¹ããŒããããã¯ã©ã¹ã npm zabbix-react-componentããã±ãŒãžãšããŠå©çšå¯èœã
export { OpenApiSwagger } from './OpenApiSwagger.js' export { HostConfig } from './HostConfig.jsx' export { HostGraph } from './HostGraph.jsx'
ãã®å Žæãããã³ã³ããŒãã³ããå®å šã«ã¹ã«ã«ããããæ©èœãåäžãããããšãã§ããŸãã
äŸãšããŠã Nagiosã«ãããZabbixã«ã¯ãªãããŒã«ãæ·»ä»ããŸããã ãããã¯ãŒã¯èŠçŽ ã®èšè¿°å ã®ãœãŒã¹-ã¿ãŒã²ããã¡ã¿æ å ±ã«åºã¥ãããããã¯ãŒã¯ãããã®èªåæ§ç¯ã
ã³ã³ããŒãã³ãHostGraphãèŠãŠãã ããã Zabbixãã¹ãã¿ãã®ããã¹ãã€ã³ãã³ããªããã£ãŒã«ããã¡ã¢ãã§äœ¿çšããæ å ±ãä¿åããŸãã ããã§ãJSON圢åŒã§ããsource-targetãèŠçŽ ã®ãã³ãã«ãå ¥åããŸãã èŠèŠåã«ã¯ã d3ãããžã§ã¯ã-Force -Directed Graphã䜿çšããŸããã
ãããã«
ããã§ãéçºç°å¢ãããã³ããšã³ãããã³ããã¯ãšã³ããæã«å ¥ããŸããã JavaScriptã®ç¥èãšNodeJSã®ä»æ§ã§ååã§ãã
APIã¯ææžåãããŠããããµãŒãããŒãã£ã®ããã³ããšã³ãéçºè ã«ãããã¹ãã«å©çšã§ããŸãã APIãµãŒããŒã¯ãZabbixã«ç¹ã«é¢é£ä»ããããŠããŸãããããã¯äžè¬çãªãœãªã¥ãŒã·ã§ã³ã§ãã ä»»æã®ã·ã¹ãã ãžã®çµ±åãå¯èœã§ãã
æšæºã®CRUDæ©èœãå®è¡ããæ¢è£œã®Reactã³ã³ããŒãã³ããã³ã³ãã€ã«ãããŸãã ã³ã³ããŒãã³ãã¯ãçµ±åã·ã¹ãã ãšã®å¯Ÿè©±ã®è€éããã解æŸããããããã³ã°ã®ã¿ãè¡ãããŸãã