{"id":220,"date":"2022-02-11T20:25:09","date_gmt":"2022-02-11T11:25:09","guid":{"rendered":"https:\/\/software.satoshis.jp\/?p=220"},"modified":"2022-02-11T16:44:51","modified_gmt":"2022-02-11T07:44:51","slug":"vue-js-%e3%81%a8-spring-boot-%e3%81%a7web%e3%82%a2%e3%83%97%e3%83%aa%e3%82%92%e4%bd%9c%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b","status":"publish","type":"post","link":"https:\/\/software.satoshis.jp\/?p=220","title":{"rendered":"vue.js \u3068 Spring boot \u3067Web\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u307f\u308b"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/vuejs-logo-300x180.png\" alt=\"\" width=\"300\" height=\"180\" class=\"alignnone size-medium wp-image-221\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/vuejs-logo-300x180.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/vuejs-logo.png 500w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>\u6700\u8fd1\u6d41\u884c\u308a\u306e vue.js \u3092 Spring boot \u3068\u7d44\u307f\u5408\u308f\u305b\u3066Web\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u307f\u307e\u3059\u3002<\/p>\n<p>\u53c2\u8003\u3057\u305f\u30b5\u30a4\u30c8\u306f\u3053\u3061\u3089\u3002<\/p>\n<p>\u226b <a href=\"https:\/\/www.bezkoder.com\/spring-boot-vue-js-crud-example\/\" target=\"_blank\" rel=\"noopener\">[Full-stack] Spring Boot + Vue.js: CRUD example<\/a><\/p>\n<p>\u53c2\u8003\u306b\u3057\u305f\u30b5\u30a4\u30c8\u3067\u306f Tutorial \u3092\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u306b\u3057\u3066\u307e\u3059\u304c\u3001\u3053\u3053\u3067\u306f Book \u3092\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u3068\u3059\u308b bookshelf \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p>\u307e\u305a\u306f\u3001Spring boot\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304b\u3089\u4f5c\u6210\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<h2>Spring boot\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3059\u308b<\/h2>\n<p>\u30d5\u30a1\u30a4\u30eb\u30e1\u30cb\u30e5\u30fc\u304b\u3089\u300c\u65b0\u898fSpring\u30b9\u30bf\u30fc\u30bf\u30fc\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u300d\u3092\u9078\u629e\u3057\u3066\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/eclipse-create-project-300x166.png\" alt=\"\" width=\"300\" height=\"166\" class=\"alignnone size-medium wp-image-223\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/eclipse-create-project-300x166.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/eclipse-create-project.png 582w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>\u4f9d\u5b58\u95a2\u4fc2\u306f\u3001Spring Data JPA \u3068 H2 Database \u3068 Spring Web \u3092\u9078\u629e\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/eclipse-create-project-dependency-300x223.png\" alt=\"\" width=\"300\" height=\"223\" class=\"alignnone size-medium wp-image-224\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/eclipse-create-project-dependency-300x223.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/eclipse-create-project-dependency.png 584w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>\u4f9d\u5b58\u3057\u3066\u3044\u308b\u30e9\u30a4\u30d6\u30e9\u30ea\u304c\u81ea\u52d5\u7684\u306b\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3055\u308c\u308b\u307e\u3067\u3001\u3057\u3070\u3089\u304f\u5f85\u3061\u307e\u3059\u3002<\/p>\n<p>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30fb\u30a8\u30af\u30b9\u30d7\u30ed\u30fc\u30e9\u30fc\u306e\u8868\u793a\u304c\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u5909\u5316\u3057\u305f\u3089\u6e96\u5099\u5b8c\u4e86\u3067\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/eclipse-project-explorer-300x245.png\" alt=\"\" width=\"300\" height=\"245\" class=\"alignnone size-medium wp-image-225\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/eclipse-project-explorer-300x245.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/eclipse-project-explorer.png 361w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>src\/main\/resources \u306b\u3042\u308b application.properties \u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304d\u3001H2\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306e\u8a2d\u5b9a\u3092\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nspring.datasource.url=jdbc:h2:mem:testdb\r\nspring.datasource.driverClassName=org.h2.Driver\r\nspring.datasource.username=sa\r\nspring.datasource.password=\r\nspring.jpa.show-sql=true\r\nspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect\r\nspring.jpa.hibernate.ddl-auto=update\r\nspring.h2.console.enabled=true\r\n<\/pre>\n<h2>Book\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u3092\u4f5c\u6210\u3059\u308b<\/h2>\n<p>\u65b0\u898f-\u30af\u30e9\u30b9\u3067Book\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage jp.bookshelf;\r\n\r\nimport javax.persistence.Column;\r\nimport javax.persistence.Entity;\r\nimport javax.persistence.GeneratedValue;\r\nimport javax.persistence.GenerationType;\r\nimport javax.persistence.Id;\r\n\r\n@Entity\r\npublic class Book {\r\n\t@Id\r\n\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n\tprivate long id;\r\n\t\r\n\t@Column\r\n\tprivate String title;\r\n\t\r\n\t@Column\r\n\tprivate String author;\r\n\r\n\tpublic long getId() {\r\n\t\treturn id;\r\n\t}\r\n\r\n\tpublic void setId(long id) {\r\n\t\tthis.id = id;\r\n\t}\r\n\r\n\tpublic String getTitle() {\r\n\t\treturn title;\r\n\t}\r\n\r\n\tpublic void setTitle(String title) {\r\n\t\tthis.title = title;\r\n\t}\r\n\r\n\tpublic String getAuthor() {\r\n\t\treturn author;\r\n\t}\r\n\r\n\tpublic void setAuthor(String author) {\r\n\t\tthis.author = author;\r\n\t}\r\n}\r\n<\/pre>\n<h2>BookRepository\u3092\u4f5c\u6210\u3059\u308b<\/h2>\n<p>\u6b21\u306b\u30ea\u30dd\u30b8\u30c8\u30ea\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3092\u4f5c\u308a\u307e\u3059\u3002<\/p>\n<p>\u65b0\u898f-\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3067BookRepository\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<br \/>\n\u62e1\u5f35\u30a4\u30f3\u30bf\u30d5\u30a7\u30fc\u30b9\u3067 JpaRepository<Book, Long> \u3092\u6307\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage jp.bookshelf;\r\n\r\nimport java.util.List;\r\n\r\nimport org.springframework.data.jpa.repository.JpaRepository;\r\n\r\npublic interface BookRepository extends JpaRepository&lt;Book, Long&gt; {\r\n\tList&lt;Book&gt; findByTitle(String title);\r\n\tList&lt;Book&gt; findByAuthor(String author);\r\n}\r\n<\/pre>\n<h2>BookController\u3092\u4f5c\u6210\u3059\u308b<\/h2>\n<p>\u65b0\u898f-\u30af\u30e9\u30b9\u3067BookController\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage jp.bookshelf;\r\n\r\nimport java.util.List;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport org.springframework.http.HttpStatus;\r\nimport org.springframework.http.ResponseEntity;\r\nimport org.springframework.web.bind.annotation.DeleteMapping;\r\nimport org.springframework.web.bind.annotation.GetMapping;\r\nimport org.springframework.web.bind.annotation.PathVariable;\r\nimport org.springframework.web.bind.annotation.PostMapping;\r\nimport org.springframework.web.bind.annotation.RequestBody;\r\nimport org.springframework.web.bind.annotation.RequestMapping;\r\nimport org.springframework.web.bind.annotation.RequestParam;\r\nimport org.springframework.web.bind.annotation.RestController;\r\n\r\n@CrossOrigin(origins = &quot;http:\/\/localhost:8081&quot;)\r\n@RestController\r\n@RequestMapping(&quot;\/api&quot;)\r\npublic class BookController {\r\n\t@Autowired\r\n\tBookRepository bookRepository;\r\n\t\r\n\t@GetMapping(&quot;\/books&quot;)\r\n\tpublic ResponseEntity&lt;List&lt;Book&gt;&gt; getBooks(@RequestParam(required = false) String title) {\r\n\t\tList&lt;Book&gt; list = bookRepository.findByTitle(title);\r\n\t\treturn new ResponseEntity&lt;List&lt;Book&gt;&gt;(list, HttpStatus.OK);\r\n\t}\r\n\t\r\n\t@GetMapping(&quot;\/books\/{id}&quot;)\r\n\tpublic ResponseEntity&lt;Book&gt; getBookById(@PathVariable(&quot;id&quot;) Long id) {\r\n\t\tOptional&lt;Book&gt; data = bookRepository.findById(id);\r\n\t\tif (data.isPresent()) {\r\n\t\t\treturn new ResponseEntity&lt;Book&gt;(data.get(), HttpStatus.OK);\r\n\t\t}\r\n\t\treturn new ResponseEntity&lt;Book&gt;(HttpStatus.NOT_FOUND);\r\n\t}\r\n\r\n\t@PostMapping(&quot;\/books&quot;)\r\n\tpublic ResponseEntity&lt;Book&gt; createBook(@RequestBody Book book) {\r\n\t\tBook b = bookRepository.saveAndFlush(book);\r\n\t\treturn new ResponseEntity&lt;Book&gt;(b, HttpStatus.OK);\r\n\t}\r\n\t\r\n\t@PutMapping(&quot;\/books\/{id}&quot;)\r\n\tpublic ResponseEntity&lt;Book&gt; updateBook(@RequestBody Book book) {\r\n\t\tbook = bookRepository.saveAndFlush(book);\r\n\t\treturn new ResponseEntity&lt;Book&gt;(book, HttpStatus.OK);\r\n\t}\r\n\t\r\n\t@DeleteMapping(&quot;\/books&quot;)\r\n\tpublic ResponseEntity&lt;HttpStatus&gt; deleteBook(@PathVariable(&quot;id&quot;) long id) {\r\n\t\tbookRepository.deleteById(id);\r\n\t\treturn new ResponseEntity&lt;HttpStatus&gt;(HttpStatus.OK);\r\n\t}\r\n}\r\n<\/pre>\n<h2>\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3092 vue.js \u3067\u4f5c\u6210\u3059\u308b<\/h2>\n<p>\u6b21\u306f\u3001\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u3092 vue.js \u3067\u4f5c\u3063\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>\u53c2\u8003\u30b5\u30a4\u30c8\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3067 vue \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u308c\u3068\u8a00\u3063\u3066\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% vue create vue-js-client-crud\r\n<\/pre>\n<p>\u3053\u308c\u306f\u3001vue CLI \u3060\u305d\u3046\u3067\u3059\u3002<br \/>\n\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u3088\u3046\u3067\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% npm install -g vue-cli\r\nnpm WARN deprecated har-validator@5.1.5: this library is no longer supported\r\nnpm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https:\/\/v8.dev\/blog\/math-random for details.\r\nnpm WARN deprecated request@2.88.2: request has been deprecated, see https:\/\/github.com\/request\/request\/issues\/3142\r\nnpm WARN deprecated coffee-script@1.12.7: CoffeeScript on NPM has moved to &quot;coffeescript&quot; (no hyphen)\r\nnpm WARN deprecated vue-cli@2.9.6: This package has been deprecated in favour of @vue\/cli\r\n\r\nadded 245 packages, and audited 246 packages in 18s\r\n\r\n10 packages are looking for funding\r\n  run `npm fund` for details\r\n\r\n4 moderate severity vulnerabilities\r\n\r\nTo address all issues (including breaking changes), run:\r\n  npm audit fix --force\r\n\r\nRun `npm audit` for details.\r\nnpm notice\r\nnpm notice New minor version of npm available! 8.3.1 -&gt; 8.4.1\r\nnpm notice Changelog: https:\/\/github.com\/npm\/cli\/releases\/tag\/v8.4.1\r\nnpm notice Run npm install -g npm@8.4.1 to update!\r\nnpm notice\r\n<\/pre>\n<p>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u305f\u304b\u3001\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% vue --version\r\n2.9.6\r\n<\/pre>\n<p>\u5927\u4e08\u592b\u307f\u305f\u3044\u3067\u3059\u3002<\/p>\n<p>vue\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3057\u3087\u3046\u3002<br \/>\nSpring boot \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u76f4\u4e0b\u306b vjs \u3068\u3044\u3046\u540d\u524d\u3067\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u308a\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% vue create vjs\r\n\r\n  vue create is a Vue CLI 3 only command and you are using Vue CLI 2.9.6.\r\n  You may want to run the following to upgrade to Vue CLI 3:\r\n\r\n  npm uninstall -g vue-cli\r\n  npm install -g @vue\/cli\r\n<\/pre>\n<p>\u306a\u3093\u304b\u3001\u6012\u3089\u308c\u305f\u611f\u3058\u3067\u3059\u3002<\/p>\n<p>\u63d0\u793a\u3055\u308c\u305f\u3075\u305f\u3064\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% npm uninstall -g vue-cli\r\n\r\nremoved 245 packages, and audited 1 package in 2s\r\n\r\nfound 0 vulnerabilities\r\n% npm install -g @vue\/cli\r\nnpm WARN deprecated har-validator@5.1.5: this library is no longer supported\r\nnpm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https:\/\/v8.dev\/blog\/math-random for details.\r\nnpm WARN deprecated uuid@3.4.0: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https:\/\/v8.dev\/blog\/math-random for details.\r\nnpm WARN deprecated urix@0.1.0: Please see https:\/\/github.com\/lydell\/urix#deprecated\r\nnpm WARN deprecated source-map-url@0.4.1: See https:\/\/github.com\/lydell\/source-map-url#deprecated\r\nnpm WARN deprecated request@2.88.2: request has been deprecated, see https:\/\/github.com\/request\/request\/issues\/3142\r\nnpm WARN deprecated resolve-url@0.2.1: https:\/\/github.com\/lydell\/resolve-url#deprecated\r\nnpm WARN deprecated source-map-resolve@0.5.3: See https:\/\/github.com\/lydell\/source-map-resolve#deprecated\r\nnpm WARN deprecated apollo-tracing@0.15.0: The `apollo-tracing` package is no longer part of Apollo Server 3. See https:\/\/www.apollographql.com\/docs\/apollo-server\/migration\/#tracing for details\r\nnpm WARN deprecated graphql-extensions@0.15.0: The `graphql-extensions` API has been removed from Apollo Server 3. Use the plugin API instead: https:\/\/www.apollographql.com\/docs\/apollo-server\/integrations\/plugins\/\r\nnpm WARN deprecated apollo-cache-control@0.14.0: The functionality provided by the `apollo-cache-control` package is built in to `apollo-server-core` starting with Apollo Server 3. See https:\/\/www.apollographql.com\/docs\/apollo-server\/migration\/#cachecontrol for details.\r\nnpm WARN deprecated @hapi\/topo@3.1.6: This version has been deprecated and is no longer supported or maintained\r\nnpm WARN deprecated @hapi\/hoek@8.5.1: This version has been deprecated and is no longer supported or maintained\r\nnpm WARN deprecated @hapi\/bourne@1.3.2: This version has been deprecated and is no longer supported or maintained\r\nnpm WARN deprecated @hapi\/address@2.1.4: Moved to 'npm install @sideway\/address'\r\nnpm WARN deprecated @hapi\/joi@15.1.1: Switch to 'npm install joi'\r\nnpm WARN deprecated graphql-tools@4.0.8: This package has been deprecated and now it only exports makeExecutableSchema.\\nAnd it will no longer receive updates.\\nWe recommend you to migrate to scoped packages such as @graphql-tools\/schema, @graphql-tools\/utils and etc.\\nCheck out https:\/\/www.graphql-tools.com to learn what package you should use instead\r\n\r\nadded 945 packages, and audited 946 packages in 1m\r\n\r\n68 packages are looking for funding\r\n  run `npm fund` for details\r\n\r\n13 vulnerabilities (6 moderate, 7 high)\r\n\r\nSome issues need review, and may require choosing\r\na different dependency.\r\n\r\nRun `npm audit` for details.\r\n<\/pre>\n<p>\u6c17\u3092\u53d6\u308a\u76f4\u3057\u3066\u3082\u3046\u4e00\u5ea6create\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% vue create vjs\r\nVue CLI v4.5.15\r\n? Please pick a preset: (Use arrow keys)\r\n\u276f Default (&#x5B;Vue 2] babel, eslint)\r\n  Default (Vue 3) (&#x5B;Vue 3] babel, eslint)\r\n  Manually select features\r\n<\/pre>\n<p>\u4f55\u304b\u9078\u629e\u3057\u308d\u3063\u3066\u8a00\u308f\u308c\u3066\u307e\u3059\u306e\u3067\u3001\u3068\u308a\u3042\u3048\u305a\u3001\u305d\u306e\u307e\u307e\u3067Enter\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nVue CLI v4.5.15\r\n? Please pick a preset: Default (&#x5B;Vue 2] babel, eslint)\r\n\r\n\r\nVue CLI v4.5.15\r\n\u2728  Creating project in \/Users\/satoshis\/Documents\/workspace\/bookshelf\/vjs.\r\n\ud83d\uddc3  Initializing git repository...\r\n\u2699\ufe0f  Installing CLI plugins. This might take a while...\r\n\r\n\r\nadded 1285 packages, and audited 1286 packages in 1m\r\n\r\n86 packages are looking for funding\r\n  run `npm fund` for details\r\n\r\n70 vulnerabilities (2 low, 57 moderate, 11 high)\r\n\r\nTo address issues that do not require attention, run:\r\n  npm audit fix\r\n\r\nTo address all issues (including breaking changes), run:\r\n  npm audit fix --force\r\n\r\nRun `npm audit` for details.\r\n\ud83d\ude80  Invoking generators...\r\n\ud83d\udce6  Installing additional dependencies...\r\n\r\n\r\nadded 55 packages, and audited 1341 packages in 5s\r\n\r\n91 packages are looking for funding\r\n  run `npm fund` for details\r\n\r\n72 vulnerabilities (2 low, 59 moderate, 11 high)\r\n\r\nTo address issues that do not require attention, run:\r\n  npm audit fix\r\n\r\nTo address all issues (including breaking changes), run:\r\n  npm audit fix --force\r\n\r\nRun `npm audit` for details.\r\n\u2693  Running completion hooks...\r\n\r\n\ud83d\udcc4  Generating README.md...\r\n\r\n\ud83c\udf89  Successfully created project vjs.\r\n\ud83d\udc49  Get started with the following commands:\r\n\r\n $ cd vjs\r\n $ npm run serve\r\n<\/pre>\n<p>Eclipse\u3067\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u30ea\u30d5\u30ec\u30c3\u30b7\u30e5\u3059\u308b\u3068\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u69cb\u6210\u3067\u4f5c\u3089\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/eclipse-vjs-300x256.png\" alt=\"\" width=\"300\" height=\"256\" class=\"alignnone size-medium wp-image-227\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/eclipse-vjs-300x256.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/eclipse-vjs.png 358w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<h2>Spring boot \u4e0a\u3067\u52d5\u304b\u3057\u3066\u307f\u308b<\/h2>\n<p>Spring boot \u4e0a\u3067 Vue \u3092\u52d5\u304b\u3059\u306b\u306f\u3001vue \u3092\u30d3\u30eb\u30c9\u3057\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u3089\u3057\u3044\u3067\u3059\u3002<br \/>\n\u305f\u3060\u3057\u3001\u30d3\u30eb\u30c9\u3057\u305f JavaScript \u30d5\u30a1\u30a4\u30eb\u3092 Spring boot \u3067\u52d5\u304b\u3059\u305f\u3081\u306b\u306f\u3001src\/main\/resources\/static \u306b\u914d\u7f6e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\npackage.json \u3092\u5909\u66f4\u3057\u307e\u3059\u3002<\/p>\n<p>[json]<br \/>\n{<br \/>\n  &#8220;name&#8221;: &#8220;web&#8221;,<br \/>\n  &#8220;version&#8221;: &#8220;0.1.0&#8221;,<br \/>\n  &#8220;private&#8221;: true,<br \/>\n  &#8220;scripts&#8221;: {<br \/>\n    &#8220;serve&#8221;: &#8220;vue-cli-service serve&#8221;,<br \/>\n    &#8220;build&#8221;: &#8220;vue-cli-service build &#8211;dest ..\/src\/main\/resources\/static\/&#8221;,<br \/>\n    &#8220;lint&#8221;: &#8220;vue-cli-service lint&#8221;<br \/>\n  },<br \/>\n[\/json]<\/p>\n<p>\u30d3\u30eb\u30c9\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% npm run build\r\n\r\n&gt; vjs@0.1.0 build \/Users\/satoshis\/Documents\/workspace\/bookshelf\/vjs\r\n&gt; vue-cli-service build --dest ..\/src\/main\/resources\/static\/\r\n\r\n\r\n\u2827  Building for production...\r\n\r\n WARNING  Compiled with 17 warnings                                                                                          19:40:46\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'computed' was not found in 'vue'\r\n\r\n warning  in .\/src\/router.js\r\n\r\n&quot;export 'default' (imported as 'Router') was not found in 'vue-router'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'defineComponent' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'getCurrentInstance' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'h' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'inject' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'nextTick' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'onActivated' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'onDeactivated' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'onUnmounted' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'provide' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'reactive' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'ref' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'shallowRef' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'unref' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'watch' was not found in 'vue'\r\n\r\n warning  in ..\/node_modules\/vue-router\/dist\/vue-router.esm-bundler.js\r\n\r\n&quot;export 'watchEffect' was not found in 'vue'\r\n\r\n  File                                                          Size                             Gzipped\r\n\r\n  ..\/src\/main\/resources\/static\/js\/chunk-vendors.0a90606c.js     100.24 KiB                       35.94 KiB\r\n  ..\/src\/main\/resources\/static\/js\/chunk-a020b95a.5f445348.js    23.58 KiB                        8.18 KiB\r\n  ..\/src\/main\/resources\/static\/js\/app.3b3d464e.js               3.62 KiB                         1.73 KiB\r\n  ..\/src\/main\/resources\/static\/js\/chunk-2d21767c.356128dc.js    2.12 KiB                         0.82 KiB\r\n  ..\/src\/main\/resources\/static\/js\/chunk-2d0ba6fb.906a32b7.js    1.89 KiB                         0.85 KiB\r\n  ..\/src\/main\/resources\/static\/js\/chunk-2d0bd7a8.7172d8bc.js    1.68 KiB                         0.73 KiB\r\n  ..\/src\/main\/resources\/static\/css\/app.d40fc157.css             0.16 KiB                         0.14 KiB\r\n\r\n  Images and other types of assets omitted.\r\n\r\n DONE  Build complete. The ..\/src\/main\/resources\/static directory is ready to be deployed.\r\n INFO  Check out deployment instructions at https:\/\/cli.vuejs.org\/guide\/deployment.html\r\n<\/pre>\n<p>\u306a\u3093\u304b\u3001\u3044\u3063\u3071\u3044 Warning \u304c\u51fa\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u3002<br \/>\n\u3050\u3050\u3063\u3066\u307f\u308b\u3068\u3001node.js \u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u3088\u308d\u3057\u304f\u306a\u3044\u307f\u305f\u3044\u3067\u3059\u3002<\/p>\n<p>node.js \u3092 latest \u3067\u306f\u306a\u304f stable \u306b\u5909\u3048\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% nodebrew install-binary stable\r\nFetching: https:\/\/nodejs.org\/dist\/v16.13.2\/node-v16.13.2-darwin-x64.tar.gz\r\n############################################################################################################################## 100.0%\r\nInstalled successfully\r\n% nodebrew ls\r\nv16.13.2\r\nv17.4.0\r\n\r\ncurrent: v17.4.0\r\n% nodebrew use 16.13.2\r\nuse v16.13.2\r\n<\/pre>\n<p>\u30d3\u30eb\u30c9\u3057\u306a\u304a\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% npm run build\r\n\r\n&gt; web@0.1.0 build\r\n&gt; vue-cli-service build\r\n\r\n\r\n\u2819  Building for production...\r\n\r\n DONE  Compiled successfully in 2214ms                                                                                       23:51:49\r\n\r\n  File                                 Size                                          Gzipped\r\n\r\n  dist\/js\/chunk-vendors.e4229be5.js    95.12 KiB                                     34.05 KiB\r\n  dist\/js\/app.6a32d4e9.js              4.58 KiB                                      1.63 KiB\r\n  dist\/css\/app.fb0c6e1c.css            0.33 KiB                                      0.23 KiB\r\n\r\n  Images and other types of assets omitted.\r\n\r\n DONE  Build complete. The dist directory is ready to be deployed.\r\n INFO  Check out deployment instructions at https:\/\/cli.vuejs.org\/guide\/deployment.html\r\n<\/pre>\n<p>\u4eca\u5ea6\u306f\u3001Warning\u306a\u3069\u51fa\u306a\u3044\u3067\u3001\u6b63\u5e38\u306b\u30d3\u30eb\u30c9\u3067\u304d\u305f\u3088\u3046\u3067\u3059\u3002<br \/>\nSpring boot \u3092\u8d77\u52d5\u3057\u3066\u30a2\u30af\u30bb\u30b9\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p>\u52d5\u304d\u307e\u3057\u305f\uff01<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-hello-247x300.png\" alt=\"\" width=\"247\" height=\"300\" class=\"alignnone size-medium wp-image-230\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-hello-247x300.png 247w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-hello-843x1024.png 843w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-hello-768x933.png 768w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-hello.png 1258w\" sizes=\"auto, (max-width: 247px) 100vw, 247px\" \/><\/p>\n<p>\u52d5\u3044\u305f\u3068\u3053\u308d\u3067\u3001\u6b21\u306f\u53c2\u8003\u30b5\u30a4\u30c8\u306b\u5408\u308f\u305b\u305f\u611f\u3058\u3067\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<h2>\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\u4f5c\u6210\u3059\u308b<\/h2>\n<p>\u53c2\u8003\u30b5\u30a4\u30c8\u3067\u306f\u3001\u5510\u7a81\u306b\u3001\u6b21\u306e\u3088\u3046\u306b\u66f8\u304b\u308c\u3066\u307e\u3059\u3002<\/p>\n<blockquote><p>After the process is done. We create new folders and files like the following tree:<\/p><\/blockquote>\n<p>\u3044\u304d\u306a\u308a\u3001AddTutorial.vue\u30fbTutorial.vue\u30fbTutorialList.vue\u30fbTutorialDataService.js \u306e4\u3064\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u51fa\u73fe\u3057\u307e\u3059\u3002<br \/>\n\u3057\u304b\u3057\u3001\u30d5\u30a1\u30a4\u30eb\u306e\u5185\u5bb9\u306b\u3064\u3044\u3066\u306f\u307e\u3063\u305f\u304f\u89e6\u308c\u3089\u308c\u3066\u306a\u3044\u306e\u3067\u3059\u3002<\/p>\n<p>\u3050\u3050\u3063\u3066\u307f\u305f\u3089\u3001Github\u306b\u305d\u308c\u3063\u307d\u3044\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u304c\u51fa\u3066\u307e\u3057\u305f\u306e\u3067\u3001\u305d\u3061\u3089\u3092\u53c2\u8003\u306b\u30b3\u30fc\u30c9\u3092\u66f8\u3044\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<p>\u226b <a href=\"https:\/\/github.com\/danielcgithub\/vue-getting-started\" target=\"_blank\" rel=\"noopener\">Github &#8211; danielcgithub\/vue-getting-started<\/a><\/p>\n<p>AddBook.vue<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;template&gt;\r\n\t&lt;div class=&quot;submit-form&quot;&gt;\r\n\t\t&lt;div v-if=&quot;!submitted&quot;&gt;\r\n\t\t\t&lt;div class=&quot;form-group&quot;&gt;\r\n\t\t\t\t&lt;label for=&quot;title&quot;&gt;Title&lt;\/label&gt;\r\n\t\t\t\t&lt;input type=&quot;text&quot; name=&quot;title&quot; class=&quot;form-control&quot;\r\n\t\t\t\t\tid=&quot;title&quot; required v-model=&quot;book.title&quot;\r\n\t\t\t\t\/&gt;\r\n\t\t\t&lt;\/div&gt;\r\n\t\t\t&lt;div class=&quot;form-group&quot;&gt;\r\n\t\t\t\t&lt;label for=&quot;author&quot;&gt;Author&lt;\/label&gt;\r\n\t\t\t\t&lt;input type=&quot;text&quot; name=&quot;author&quot; class=&quot;form-control&quot;\r\n\t\t\t\t\tid=&quot;author&quot; required v-model=&quot;book.author&quot;\r\n\t\t\t\t\/&gt;\r\n\t\t\t&lt;\/div&gt;\r\n\t\t\t&lt;button @click=&quot;saveBook&quot; class=&quot;btn btn-success&quot;&gt;Submit&lt;\/button&gt;\r\n\t\t&lt;\/div&gt;\r\n\t\t&lt;div v-else&gt;\r\n\t\t\t&lt;p&gt;Submit successed!&lt;\/p&gt;\r\n\t\t\t&lt;button class=&quot;btn btn-success&quot; @click=&quot;newBook&quot;&gt;Add&lt;\/button&gt;\r\n\t\t&lt;\/div&gt;\r\n\t&lt;\/div&gt;\r\n&lt;\/template&gt;\r\n\r\n&lt;script&gt;\r\nimport BookDataService from &quot;..\/services\/BookDataService&quot;;\r\n\r\nexport default {\r\n\tname: &quot;add-book&quot;,\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tbook: {\r\n\t\t\t\tid: null,\r\n\t\t\t\ttitle: &quot;&quot;,\r\n\t\t\t\tauthor: &quot;&quot;\r\n\t\t\t},\r\n\t\t\tsubmitted: false\r\n\t\t};\r\n\t},\r\n\tmethods: {\r\n\t\tsaveBook() {\r\n\t\t\tvar data = {\r\n\t\t\t\ttitle: this.book.title,\r\n\t\t\t\tauthor: this.book.author\r\n\t\t\t};\r\n\t\t\tBookDataService.create(data)\r\n\t\t\t.then(response =&gt; {\r\n\t\t\t\tthis.book.id = response.data.id;\r\n\r\n\t\t\t})\r\n\t\t\t.catch(e =&gt; {\r\n\t\t\t\tconsole.log(e);\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tnewBook() {\r\n\t\t\tthis.submitted = false;\r\n\t\t\tthis.book = {}\r\n\t\t}\r\n\t}\r\n};\r\n&lt;\/script&gt;\r\n<\/pre>\n<p>Book.vue<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;template&gt;\r\n\t&lt;div v-if=&quot;currentBook&quot; class=&quot;edit-form&quot;&gt;\r\n\t\t&lt;h4&gt;Book&lt;\/h4&gt;\r\n\t\t&lt;form&gt;\r\n\t\t\t&lt;div class=&quot;form-group&quot;&gt;\r\n\t\t\t\t&lt;label for=&quot;title&quot;&gt;Title&lt;\/label&gt;\r\n\t\t\t\t&lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;title&quot; v-model=&quot;currentBook.title&quot;\/&gt;\r\n\t\t\t&lt;\/div&gt;\r\n\t\t\t&lt;div class=&quot;form-group&quot;&gt;\r\n\t\t\t\t&lt;label for=&quot;author&quot;&gt;Author&lt;\/label&gt;\r\n\t\t\t\t&lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;author&quot; v-model=&quot;currentBook.author&quot; \/&gt;\r\n\t\t\t&lt;\/div&gt;\r\n\t\t&lt;\/form&gt;\r\n\t\t&lt;button class=&quot;badge badge-primary mr-2&quot; @click=&quot;deleteBook&quot;&gt;Delete&lt;\/button&gt;\r\n\t\t&lt;button type=&quot;submit&quot; class=&quot;badge badge-success&quot; @click=&quot;updateBook&quot;&gt;Update&lt;\/button&gt;\r\n\t\t&lt;p&gt;{{ message }}&lt;\/p&gt;\r\n\t&lt;\/div&gt;\r\n\t&lt;div v-else&gt;\r\n\t\t&lt;br \/&gt;\r\n\t\t&lt;p&gt;Click Book&lt;\/p&gt;\r\n\t&lt;\/div&gt;\r\n&lt;\/template&gt;\r\n\r\n&lt;script&gt;\r\nimport BookDataService from &quot;..\/services\/BookDataService&quot;;\r\n\r\nexport default {\r\n\tname: &quot;book&quot;,\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tcurrentBook: null,\r\n\t\t\tmessage: ''\r\n\t\t};\r\n\t},\r\n\tmethods: {\r\n\t\tgetBook(id) {\r\n\t\t\tBookDataService.get(id)\r\n\t\t\t.then(response =&gt; {\r\n\t\t\t\tthis.currentBook = response.data;\r\n\t\t\t\tconsole.log(response.data);\r\n\t\t\t})\r\n\t\t\t.catch(e =&gt; {\r\n\t\t\t\tconsole.log(e);\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tupdateBook() {\r\n\t\t\tBookDataService.update(this.currentBook.id, this.currentBook)\r\n\t\t\t.then(response =&gt; {\r\n\t\t\t\tconsole.log(response.data);\r\n\t\t\t\tthis.message = 'The book updated.';\r\n\t\t\t})\r\n\t\t\t.catch(e =&gt; {\r\n\t\t\t\tconsole.log(e);\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tdeleteBook() {\r\n\t\t\tBookDataService.delete(this.currentBook.id)\r\n\t\t\t.then(response =&gt; {\r\n\t\t\t\tconsole.log(response.data);\r\n\t\t\t\tthis.$router.push({ name: &quot;books&quot; });\r\n\t\t\t})\r\n\t\t\t.catch(e =&gt; {\r\n\t\t\t\tconsole.log(e);\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\tmounted() {\r\n\t\tthis.message = '';\r\n\t\tthis.getBook(this.$route.params.id);\r\n\t}\r\n};\r\n&lt;\/script&gt;\r\n<\/pre>\n<p>BookList.vue<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;template&gt;\r\n\t&lt;div class=&quot;list row&quot;&gt;\r\n\t\t&lt;div class=&quot;col-md-8&quot;&gt;\r\n\t\t\t&lt;input type=&quot;text&quot; class=&quot;form-control&quot; placeholder=&quot;Search by title&quot; v-model=&quot;title&quot; \/&gt;\r\n\t\t\t&lt;div class=&quot;input-group-append&quot;&gt;\r\n\t\t\t\t&lt;button class=&quot;btn btn-outline-secondary&quot; type=&quot;button&quot; @click=&quot;searchTitle&quot;&gt;Search&lt;\/button&gt;\r\n\t\t\t&lt;\/div&gt;\r\n\t\t&lt;\/div&gt;\r\n\t\t&lt;div class=&quot;col-md-6&quot;&gt;\r\n\t\t\t&lt;h4&gt;Book List&lt;\/h4&gt;\r\n\t\t\t&lt;ul class=&quot;list-group&quot;&gt;\r\n\t\t\t\t&lt;li class=&quot;list-group-item&quot; :class=&quot;{ active: index == currentIndex }&quot;\r\n\t\t\t\t\tv-for=&quot;(book, index) in books&quot; :key=&quot;index&quot;\r\n\t\t\t\t\t@click=&quot;setActiveBook(book, index)&quot;&gt;{{ book.title }}\r\n\t\t\t\t&lt;\/li&gt;\r\n\t\t\t&lt;\/ul&gt;\r\n\t\t&lt;\/div&gt;\r\n\t\t&lt;div class=&quot;col-md-6&quot;&gt;\r\n\t\t\t&lt;div v-if=&quot;currentBook&quot;&gt;\r\n\t\t\t\t&lt;h4&gt;Book&lt;\/h4&gt;\r\n\t\t\t\t&lt;div&gt;{{ currentBook.title }}&lt;\/div&gt;\r\n\t\t\t\t&lt;div&gt;{{ currentBook.author }}&lt;\/div&gt;\r\n\t\t\t\t&lt;a class=&quot;badge badge-warning&quot; :href=&quot;'\/books' + currentBook.id&quot;&gt;Edit&lt;\/a&gt;\r\n\t\t\t&lt;\/div&gt;\r\n\t\t&lt;\/div&gt;\r\n\t&lt;\/div&gt;\r\n&lt;\/template&gt;\r\n\r\n&lt;script&gt;\r\nimport BookDataService from &quot;..\/services\/BookDataService&quot;;\r\n\r\nexport default {\r\n\tname: &quot;books-list&quot;,\r\n\tdata() {\r\n\t\treturn {\r\n\t\t\tbooks: &#x5B;],\r\n\t\t\tcurrentBook: null,\r\n\t\t\tcurrentIndex: -1,\r\n\t\t\ttitle: &quot;&quot;\r\n\t\t};\r\n\t},\r\n\tmethods: {\r\n\t\tretrieveBooks() {\r\n\t\t\tBookDataService.getAll()\r\n\t\t\t.then(response =&gt; {\r\n\t\t\t\tthis.books = response.data;\r\n\t\t\t\tconsole.log(response.data);\r\n\t\t\t})\r\n\t\t\t.catch(e =&gt; {\r\n\t\t\t\tconsole.log(e);\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tsetActiveBook(book, index) {\r\n\t\t\tthis.currentBook = book;\r\n\t\t\tthis.currentIndex = index;\r\n\t\t},\r\n\r\n\t\tsearchTitle() {\r\n\t\t\tBookDataService.findByTitle(this.title)\r\n\t\t\t.then(response =&gt; {\r\n\t\t\t\tthis.books = response.data;\r\n\t\t\t\tconsole.log(response.data);\r\n\t\t\t})\r\n\t\t\t.catch(e =&gt; {\r\n\t\t\t\tconsole.log(e);\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\tmounted() {\r\n\t\tthis.retrieveBooks();\r\n\t}\r\n}\r\n&lt;\/script&gt;\r\n<\/pre>\n<p>BookDataService.js<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport http from &quot;..\/http-common&quot;;\r\n\r\nclass BookDataService {\r\n\tgetAll() {\r\n\t\treturn http.get(&quot;\/books&quot;);\r\n\t}\r\n\r\n\tget(id) {\r\n\t\treturn http.get(`\/books\/${id}`);\r\n\t}\r\n\r\n\tcreate(data) {\r\n\t\treturn http.post(&quot;\/books&quot;, data);\r\n\t}\r\n\r\n\tupdate(id, data) {\r\n\t\treturn http.put(`\/books\/${id}`, data);\r\n\t}\r\n\r\n\tdelete(id) {\r\n\t\treturn http.delete(`\/books\/${id}`);\r\n\t}\r\n\r\n\tfindByTitle(title) {\r\n\t\treturn http.get(`\/books?title=${title}`);\r\n\t}\r\n}\r\n\r\nexport default new BookDataService();\r\n<\/pre>\n<h2>Vue Router \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/h2>\n<p>\u3068\u308a\u3042\u3048\u305a\u3001Vue Router \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u307f\u305f\u3044\u3067\u3059\u3002<br \/>\n\u8a73\u3057\u304f\u306f\u8abf\u3079\u3066\u306a\u3044\u3093\u3067\u3059\u304c\u3001\u305d\u3046\u3089\u3057\u3044\u3067\u3059\u3002<br \/>\n\u307e\u3042\u3001\u3068\u308a\u3042\u3048\u305a\u306f\u52d5\u304b\u3057\u3066\u307f\u308b\u3053\u3068\u306b\u5c02\u5ff5\u3057\u3066\u3001\u3042\u3068\u3067\u8abf\u3079\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u306f\u3001SPA\u3092\u69cb\u7bc9\u3059\u308b\u305f\u3081\u3068\u66f8\u304b\u308c\u3066\u307e\u3059\u306e\u3067\u3001SPA\u3067\u306a\u3051\u308c\u3070\u4e0d\u8981\u306a\u306e\u304b\u3082\uff1f<br \/>\n\u3088\u304f\u308f\u304b\u3089\u306a\u3044\u3067\u3059\u304c\u3001\u53c2\u8003\u30b5\u30a4\u30c8\u3067\u3082\u4f7f\u308f\u308c\u3066\u3044\u308b\u306e\u3067\u3001\u3042\u307e\u308a\u8003\u3048\u305a\u306b\u4f7f\u3046\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% npm install vue-router\r\n\r\nadded 23 packages, and audited 24 packages in 6s\r\n\r\n1 package is looking for funding\r\n  run `npm fund` for details\r\n\r\nfound 0 vulnerabilities\r\n<\/pre>\n<h2>router.js\u3092\u4f5c\u6210\u3059\u308b<\/h2>\n<p>vjs\/src \u306b\u3001router.js \u3092\u4f5c\u308c\u3070\u3044\u3044\u3088\u3046\u3067\u3059\u3002<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport Vue from &quot;vue&quot;;\r\nimport Router from &quot;vue-router&quot;;\r\nVue.use(Router);\r\nexport default new Router({\r\n  mode: &quot;history&quot;,\r\n  routes: &#x5B;\r\n    {\r\n      path: &quot;\/&quot;,\r\n      alias: &quot;\/books&quot;,\r\n      name: &quot;books&quot;,\r\n      component: () =&gt; import(&quot;.\/components\/BooksList&quot;)\r\n    },\r\n    {\r\n      path: &quot;\/books\/:id&quot;,\r\n      name: &quot;book-details&quot;,\r\n      component: () =&gt; import(&quot;.\/components\/Book&quot;)\r\n    },\r\n    {\r\n      path: &quot;\/add&quot;,\r\n      name: &quot;add&quot;,\r\n      component: () =&gt; import(&quot;.\/components\/AddBook&quot;)\r\n    }\r\n  ]\r\n});\r\n<\/pre>\n<h2>main.js \u3092\u5909\u66f4\u3059\u308b<\/h2>\n<p>main.js \u306b\u4f5c\u6210\u3057\u305f router \u3092\u8ffd\u52a0\u3059\u308c\u3070\u3044\u3044\u307f\u305f\u3044\u3067\u3059\u3002<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport Vue from 'vue'\r\nimport App from '.\/App.vue'\r\nimport router from '.\/router'\r\n\r\nVue.config.productionTip = false\r\n\r\nnew Vue({\r\n  router,\r\n  render: h =&gt; h(App),\r\n}).$mount('#app')\r\n<\/pre>\n<h2>App.vue \u3092\u5909\u66f4\u3059\u308b<\/h2>\n<p>\u53c2\u8003\u30b5\u30a4\u30c8\u3067\u306f\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u306a\u3069\u3092\u8ffd\u52a0\u3057\u3066\u307e\u3059\u304c\u3001\u3053\u3053\u3067\u306f\u7701\u7565\u3057\u307e\u3059\u3002<br \/>\nHelloWorld\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3084style\u306f\u3001\u3068\u308a\u3042\u3048\u305a\u6b8b\u3057\u305f\u307e\u307e\u306b\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;template&gt;\r\n  &lt;div id=&quot;app&quot;&gt;\r\n    &lt;img alt=&quot;Vue logo&quot; src=&quot;.\/assets\/logo.png&quot;&gt;\r\n    &lt;HelloWorld msg=&quot;Welcome to Your Vue.js App&quot;\/&gt;\r\n    &lt;div class=&quot;container mt-3&quot;&gt;\r\n      &lt;router-view \/&gt;\r\n    &lt;\/div&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/template&gt;\r\n\r\n&lt;script&gt;\r\nimport HelloWorld from '.\/components\/HelloWorld.vue'\r\n\r\nexport default {\r\n  name: 'App',\r\n  components: {\r\n    HelloWorld\r\n  }\r\n}\r\n&lt;\/script&gt;\r\n\r\n&lt;style&gt;\r\n#app {\r\n  font-family: Avenir, Helvetica, Arial, sans-serif;\r\n  -webkit-font-smoothing: antialiased;\r\n  -moz-osx-font-smoothing: grayscale;\r\n  text-align: center;\r\n  color: #2c3e50;\r\n  margin-top: 60px;\r\n}\r\n&lt;\/style&gt;\r\n<\/pre>\n<h2>axios\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b<\/h2>\n<p>axios\u306f\u3001HTTP\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3060\u305d\u3046\u3067\u3059\u3002<\/p>\n<p>\u226b <a href=\"https:\/\/github.com\/axios\/axios\">Github &#8211; axios\/axios<\/a><\/p>\n<blockquote><p>Promise based HTTP client for the browser and node.js<\/p><\/blockquote>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% npm install axios\r\n\r\nup to date, audited 1342 packages in 21s\r\n\r\n91 packages are looking for funding\r\n  run `npm fund` for details\r\n\r\n73 vulnerabilities (2 low, 60 moderate, 11 high)\r\n\r\nTo address issues that do not require attention, run:\r\n  npm audit fix\r\n\r\nTo address all issues (including breaking changes), run:\r\n  npm audit fix --force\r\n\r\nRun `npm audit` for details.\r\n<\/pre>\n<blockquote><p>73 vulnerabilities (2 low, 60 moderate, 11 high)<\/p><\/blockquote>\n<p>\u3048\u3048\u3048\uff1f<br \/>\n\u5927\u4e08\u592b\u306a\u306e\uff1f<\/p>\n<p>\u307e\u3042\u3001\u30c6\u30b9\u30c8\u7684\u306b\u4f5c\u3063\u3066\u898b\u308b\u3060\u3051\u306a\u306e\u3067\u3001\u6c17\u306b\u3057\u306a\u3044\u3053\u3068\u306b\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<h2>http-common.js\u3092\u4f5c\u6210\u3059\u308b<\/h2>\n<p>src\u306e\u4e0b\u306b\u3001http-common.js \u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport axios from &quot;axios&quot;;\r\n\r\nexport default axios.create({\r\n\tbaseURL: &quot;http:\/\/localhost:8080\/api&quot;,\r\n\theaders: {\r\n\t\t&quot;Content-type&quot;: &quot;application\/json&quot;\r\n\t}\r\n});\r\n<\/pre>\n<p>\u3053\u3053\u307e\u3067\u4f5c\u308c\u3070\u3088\u3055\u305d\u3046\u306a\u96f0\u56f2\u6c17\u306a\u306e\u3067\u3001\u30d3\u30eb\u30c9\u3057\u306a\u304a\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% npm run build\r\n\r\n&gt; web@0.1.0 build\r\n&gt; vue-cli-service build --dest ..\/src\/main\/resources\/static\/\r\n\r\n\r\n\u2826  Building for production...\r\n\r\n DONE  Compiled successfully in 5084ms                                                                                       16:41:44\r\n\r\n  File                                                          Size                             Gzipped\r\n\r\n  ..\/src\/main\/resources\/static\/js\/chunk-vendors.2909625e.js     121.46 KiB                       43.05 KiB\r\n  ..\/src\/main\/resources\/static\/js\/chunk-a020b95a.5f445348.js    23.58 KiB                        8.18 KiB\r\n  ..\/src\/main\/resources\/static\/js\/app.9e87135a.js               6.06 KiB                         2.28 KiB\r\n  ..\/src\/main\/resources\/static\/js\/chunk-2d21767c.6e9e2cc9.js    2.12 KiB                         0.82 KiB\r\n  ..\/src\/main\/resources\/static\/js\/chunk-2d0ba6fb.8c20d7cb.js    1.89 KiB                         0.85 KiB\r\n  ..\/src\/main\/resources\/static\/js\/chunk-2d0bd7a8.2c780f7e.js    1.68 KiB                         0.73 KiB\r\n  ..\/src\/main\/resources\/static\/css\/app.fb0c6e1c.css             0.33 KiB                         0.23 KiB\r\n\r\n  Images and other types of assets omitted.\r\n\r\n DONE  Build complete. The ..\/src\/main\/resources\/static directory is ready to be deployed.\r\n INFO  Check out deployment instructions at https:\/\/cli.vuejs.org\/guide\/deployment.html\r\n\r\n<\/pre>\n<p>\u6210\u529f\u3057\u307e\u3057\u305f\uff01<\/p>\n<p>Spring boot\u3092\u8d77\u52d5\u3057\u3066\u30a2\u30af\u30bb\u30b9\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-226x300.png\" alt=\"\" width=\"226\" height=\"300\" class=\"alignnone size-medium wp-image-232\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-226x300.png 226w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-772x1024.png 772w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-768x1018.png 768w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-1159x1536.png 1159w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue.png 1246w\" sizes=\"auto, (max-width: 226px) 100vw, 226px\" \/><\/p>\n<p>\u306a\u3093\u304b\u51fa\u307e\u3057\u305f\u3002<\/p>\n<p>\u3067\u3082\u3001\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306e\u30ea\u30f3\u30af\u304c\u5b58\u5728\u3057\u306a\u3044\u306e\u3067\u3001\u3069\u3046\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u305b\u3093\u3002<\/p>\n<p>HelloWorld\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3068\u30ed\u30b4\u306e\u753b\u50cf\u306f\u306a\u304f\u3066\u3082\u3044\u3044\u306e\u3067\u3001\u307e\u305a\u3053\u308c\u3092\u6d88\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;template&gt;\r\n  &lt;div id=&quot;app&quot;&gt;\r\n    &lt;div class=&quot;container mt-3&quot;&gt;\r\n      &lt;router-view \/&gt;\r\n    &lt;\/div&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/template&gt;\r\n\r\n&lt;script&gt;\r\n\r\nexport default {\r\n  name: 'App',\r\n}\r\n&lt;\/script&gt;\r\n\r\n&lt;style&gt;\r\n#app {\r\n  font-family: Avenir, Helvetica, Arial, sans-serif;\r\n  -webkit-font-smoothing: antialiased;\r\n  -moz-osx-font-smoothing: grayscale;\r\n  text-align: center;\r\n  color: #2c3e50;\r\n  margin-top: 60px;\r\n}\r\n&lt;\/style&gt;\r\n<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-1-300x122.png\" alt=\"\" width=\"300\" height=\"122\" class=\"alignnone size-medium wp-image-233\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-1-300x122.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-1-1024x418.png 1024w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-1-768x314.png 768w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-1.png 1210w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>\u53c2\u8003\u30b5\u30a4\u30c8\u3067\u306f\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u306b\u30ea\u30f3\u30af\u304c\u3042\u308a\u307e\u3057\u305f\u304c\u3001\u3053\u3053\u3067\u306f\u30b7\u30f3\u30d7\u30eb\u306b\u30ea\u30f3\u30af\u3092\u8ffd\u52a0\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&lt;template&gt;\r\n  &lt;div id=&quot;app&quot;&gt;\r\n    &lt;div&gt;\r\n      &lt;ul&gt;\r\n        &lt;li&gt;&lt;a href=&quot;\/&quot;&gt;HOME&lt;\/a&gt;&lt;\/li&gt;\r\n        &lt;li&gt;&lt;a href=&quot;\/books&quot;&gt;Books&lt;\/a&gt;&lt;\/li&gt;\r\n        &lt;li&gt;&lt;a href=&quot;\/add&quot;&gt;Add Book&lt;\/a&gt;&lt;\/li&gt;\r\n      &lt;\/ul&gt;\r\n    &lt;\/div&gt;\r\n    &lt;div class=&quot;container mt-3&quot;&gt;\r\n      &lt;router-view \/&gt;\r\n    &lt;\/div&gt;\r\n  &lt;\/div&gt;\r\n&lt;\/template&gt;\r\n\r\n&lt;script&gt;\r\n\r\nexport default {\r\n  name: 'App',\r\n}\r\n&lt;\/script&gt;\r\n\r\n&lt;style&gt;\r\n#app {\r\n  font-family: Avenir, Helvetica, Arial, sans-serif;\r\n  -webkit-font-smoothing: antialiased;\r\n  -moz-osx-font-smoothing: grayscale;\r\n  text-align: center;\r\n  color: #2c3e50;\r\n  margin-top: 60px;\r\n}\r\nul {\r\n  list-style-type: none;\r\n}\r\n&lt;\/style&gt;\r\n<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-2-300x128.png\" alt=\"\" width=\"300\" height=\"128\" class=\"alignnone size-medium wp-image-234\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-2-300x128.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-2-1024x436.png 1024w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-2-768x327.png 768w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-2.png 1058w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Books \u3092\u3000\/books \u306b\u3001Add Book \u3092 \/add \u306b\u30ea\u30f3\u30af\u3057\u3066\u3044\u308b\u306e\u3067\u3059\u304c\u3001Spring boot\u304c\u30a2\u30af\u30bb\u30b9\u3092\u62fe\u3063\u3066 Whitelabel Error Page \u306b\u98db\u3070\u3055\u308c\u3066\u3057\u307e\u3044\u307e\u3059\u3002<\/p>\n<p>\u226b <a href=\"https:\/\/github.com\/danielcgithub\/vue-getting-started\" target=\"_blank\" rel=\"noopener\">Github &#8211; danielcgithub\/vue-getting-started<\/a><\/p>\n<p>\u3053\u3061\u3089\u3092\u898b\u3066\u3082\u3001Vue \u306f\u3000npm run serve \u3067\u52d5\u304b\u3057\u3066\u3001Spring boot\u306f\u5225\u3067\u52d5\u304b\u3057\u3066\u3044\u308b\u306e\u3067\u3001Spring boot \u5185\u306b\u914d\u7f6e\u3057\u305f Vue \u3092\u52d5\u304b\u3059\u3053\u3068\u306f\u8003\u3048\u3066\u306a\u3044\u307f\u305f\u3044\u3067\u3059\u3002<\/p>\n<p>Spring boot \u306e Controller \u306b\u3082\u3001@CrossOrigin \u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u304c\u3064\u3051\u3089\u308c\u3066\u3044\u308b\u306e\u3067\u3001\u5225\u30db\u30b9\u30c8\u3067\u52d5\u304b\u3059\u524d\u63d0\u306e\u3088\u3046\u3067\u3059\u3002<\/p>\n<p>\u3050\u3050\u3063\u3066\u307f\u305f\u3068\u3053\u308d\u3001Spring boot \u5185\u306b\u307e\u3068\u3081\u308b\u306e\u306f\u7c21\u5358\u306b\u306f\u3067\u304d\u306a\u3055\u305d\u3046\u3067\u3059\u3002<br \/>\nVue \u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u3001npm run serve \u3067 Vue \u3092\u8d77\u52d5\u3059\u308c\u3070\u3001\u3068\u308a\u3042\u3048\u305a\u306f\u52d5\u304d\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n% npm run serve\r\n\r\n&gt; web@0.1.0 serve\r\n&gt; vue-cli-service serve\r\n\r\n INFO  Starting development server...\r\n98% after emitting CopyPlugin\r\n\r\n DONE  Compiled successfully in 2632ms                                                                                       18:23:17\r\n\r\n\r\n  App running at:\r\n  - Local:   http:\/\/localhost:8081\/\r\n  - Network: http:\/\/192.168.1.13:8081\/\r\n\r\n  Note that the development build is not optimized.\r\n  To create a production build, run npm run build.\r\n<\/pre>\n<p>\u672c\u3092\u8ffd\u52a0\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-3-300x196.png\" alt=\"\" width=\"300\" height=\"196\" class=\"alignnone size-medium wp-image-239\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-3-300x196.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-3-1024x668.png 1024w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-3-768x501.png 768w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-3.png 1116w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Submit \u3059\u308b\u3068\u3001\u6210\u529f\u3057\u305f\u3088\u3046\u3067\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-4-300x207.png\" alt=\"\" width=\"300\" height=\"207\" class=\"alignnone size-medium wp-image-240\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-4-300x207.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-4.png 758w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>HOME\u3000\u307e\u305f\u306f\u3000Books \u306e\u30ea\u30f3\u30af\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u8ffd\u52a0\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-5-300x171.png\" alt=\"\" width=\"300\" height=\"171\" class=\"alignnone size-medium wp-image-246\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-5-300x171.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-5-1024x583.png 1024w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-5-768x438.png 768w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-5.png 1190w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>\u3082\u3046\u3072\u3068\u3064\u8ffd\u52a0\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-6-300x191.png\" alt=\"\" width=\"300\" height=\"191\" class=\"alignnone size-medium wp-image-247\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-6-300x191.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-6-1024x652.png 1024w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-6-768x489.png 768w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-6.png 1162w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>\u672c\u306e\u30bf\u30a4\u30c8\u30eb\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u3001\u30ea\u30b9\u30c8\u306e\u4e0b\u306b\u8a73\u7d30\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-7-300x246.png\" alt=\"\" width=\"300\" height=\"246\" class=\"alignnone size-medium wp-image-248\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-7-300x246.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-7-1024x838.png 1024w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-7-768x628.png 768w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-7.png 1178w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Edit\u3092\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u3001\u5165\u529b\u30d5\u30a9\u30fc\u30e0\u306b\u5207\u308a\u66ff\u308f\u3063\u3066\u3001\u7de8\u96c6\u307e\u305f\u306f\u3001Delete\u30dc\u30bf\u30f3\u3067\u524a\u9664\u304c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u307e\u3059\u3002<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-8-300x203.png\" alt=\"\" width=\"300\" height=\"203\" class=\"alignnone size-medium wp-image-249\" srcset=\"https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-8-300x203.png 300w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-8-1024x694.png 1024w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-8-768x520.png 768w, https:\/\/software.satoshis.jp\/wp-content\/uploads\/2022\/02\/springboot-vue-bookshelf-8.png 1184w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>\u8a66\u3057\u3066\u307f\u305f\u3068\u3053\u308d\u3001\u7de8\u96c6\u3082\u524a\u9664\u3082\u554f\u984c\u306a\u304f\u52d5\u4f5c\u3057\u307e\u3057\u305f\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6700\u8fd1\u6d41\u884c\u308a\u306e vue.js \u3092 Spring boot \u3068\u7d44\u307f\u5408\u308f\u305b\u3066Web\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u307f\u307e\u3059\u3002 \u53c2\u8003\u3057\u305f\u30b5\u30a4\u30c8\u306f\u3053\u3061\u3089\u3002 \u226b [Full-stack] Spring Boot + Vue.js:  &#8230; <\/p>\n","protected":false},"author":1,"featured_media":221,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[71,77,82],"tags":[86,87,79,83,84],"class_list":["post-220","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","category-node-js","category-vue-js","tag-cors","tag-crossorigin","tag-npm","tag-spring-boot","tag-vue-js"],"nelio_content":{"autoShareEndMode":"never","automationSources":{"useCustomSentences":false,"customSentences":[]},"efiAlt":"","efiUrl":"","followers":[1],"highlights":[],"isAutoShareEnabled":true,"networkImageIds":[],"permalinkQueryArgs":[],"series":[],"suggestedReferences":[]},"views":14664,"_links":{"self":[{"href":"https:\/\/software.satoshis.jp\/index.php?rest_route=\/wp\/v2\/posts\/220","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/software.satoshis.jp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/software.satoshis.jp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/software.satoshis.jp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/software.satoshis.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=220"}],"version-history":[{"count":11,"href":"https:\/\/software.satoshis.jp\/index.php?rest_route=\/wp\/v2\/posts\/220\/revisions"}],"predecessor-version":[{"id":358,"href":"https:\/\/software.satoshis.jp\/index.php?rest_route=\/wp\/v2\/posts\/220\/revisions\/358"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/software.satoshis.jp\/index.php?rest_route=\/wp\/v2\/media\/221"}],"wp:attachment":[{"href":"https:\/\/software.satoshis.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=220"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/software.satoshis.jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=220"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/software.satoshis.jp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}