{"id":1269,"date":"2025-03-16T13:12:14","date_gmt":"2025-03-16T04:12:14","guid":{"rendered":"https:\/\/route-zero.com\/recruit\/route\/1269\/"},"modified":"2025-06-05T13:18:54","modified_gmt":"2025-06-05T04:18:54","slug":"1269","status":"publish","type":"route","link":"https:\/\/route-zero.com\/recruit\/route\/1269\/","title":{"rendered":"MVC\u69cb\u6210\u3092\u7406\u89e3\u3059\u308c\u3070\u73fe\u5834\u3067\u8a70\u307e\u3089\u306a\u3044 | Spring Boot\u5b9f\u88c5\u30ac\u30a4\u30c9"},"content":{"rendered":"<div>\n<h3>\u3042\u306a\u305f\u3082\u3053\u3093\u306a\u7d4c\u9a13\u3042\u308a\u307e\u305b\u3093\u304b\uff1f<\/h3>\n<p>\u300cController\u306b\u5168\u90e8\u66f8\u3044\u3066\u52d5\u3044\u305f\u3051\u3069\u3001\u306a\u305c\u304b\u73fe\u5834\u3067\u306f\u6012\u3089\u308c\u305f\u2026\u300d<br \/>\u300cRepository\uff1fService\uff1f\u3069\u3053\u306b\u4f55\u3092\u66f8\u304f\u306e\u304c\u6b63\u89e3\u304b\u5206\u304b\u3089\u306a\u3044\u300d<br \/>Spring Boot\u3092\u5b66\u3073\u59cb\u3081\u305f\u3070\u304b\u308a\u306e\u9803\u3001MVC\u69cb\u6210\u306b\u6238\u60d1\u3046\u4eba\u306f\u591a\u304f\u3044\u307e\u3059\u3002<\/p>\n<p><strong>\u3053\u306e\u8a18\u4e8b\u3092\u8aad\u3081\u3070\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u7591\u554f\u304c\u30af\u30ea\u30a2\u306b\u306a\u308a\u307e\u3059\u3002<\/strong><\/p>\n<ul>\n<li>\n<p>\u306a\u305cMVC\u69cb\u6210\u304c\u5fc5\u8981\u306a\u306e\u304b<\/p>\n<\/li>\n<li>\n<p>\u5404\u30ec\u30a4\u30e4\u30fc\uff08Controller \/ Service \/ Repository\uff09\u306e\u5f79\u5272<\/p>\n<\/li>\n<li>\n<p>\u3069\u3053\u306b\u30ed\u30b8\u30c3\u30af\u3092\u8a18\u8ff0\u3059\u3079\u304d\u304b\u306e\u5224\u65ad\u57fa\u6e96<\/p>\n<\/li>\n<li>\n<p>\u5b9f\u52d9\u3067\u3088\u304f\u3042\u308b\u69cb\u6210\u30d1\u30bf\u30fc\u30f3\u3068\u843d\u3068\u3057\u7a74<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u691c\u7d22\u610f\u56f3\uff08Why\/What\uff09<\/strong><br \/>\u300cMVC\u3063\u3066\u4f55\uff1f\u300d\u300c\u5f79\u5272\u306e\u9055\u3044\u306f\uff1f\u300d\u300c\u3069\u3053\u306b\u51e6\u7406\u3092\u66f8\u304f\u3079\u304d\uff1f\u300d\u3068\u3044\u3046\u60a9\u307f\u3092\u3001\u5b9f\u52d9\u30ec\u30d9\u30eb\u3067\u89e3\u6d88\u3057\u305f\u3044\u65b9\u306b\u5411\u3051\u305f\u89e3\u8aac\u3067\u3059\u3002<\/p>\n<hr>\n<h2>MVC\u69cb\u6210\u3068\u306f\uff1f\u307e\u305a\u5168\u4f53\u50cf\u3092\u628a\u63e1\u3057\u3088\u3046<\/h2>\n<p>Spring Boot\u3067\u63a1\u7528\u3055\u308c\u308bMVC\uff08Model-View-Controller\uff09\u306f\u3001\u51e6\u7406\u3092\u5f79\u5272\u3054\u3068\u306b\u5206\u96e2\u3057\u3066\u3001\u4fdd\u5b88\u6027\u30fb\u53ef\u8aad\u6027\u3092\u9ad8\u3081\u308b\u8a2d\u8a08\u601d\u60f3\u3067\u3059\u3002<\/p>\n<pre><code><span>[\u30e6\u30fc\u30b6\u30fc\u64cd\u4f5c]<\/span>\r\n   \u2193\r\n<span>Controller<\/span>\uff08\u53f8\u4ee4\u5854\uff09\r\n   \u2193\r\n<span>Service<\/span>\uff08\u696d\u52d9\u30ed\u30b8\u30c3\u30af\uff09\r\n   \u2193\r\n<span>Repository<\/span>\uff08<span>DB<\/span>\u30a2\u30af\u30bb\u30b9\uff09<\/code><\/pre>\n<h3>\u5404\u5c64\u306e\u5f79\u5272\u3092\u3084\u3055\u3057\u304f\u89e3\u8aac<\/h3>\n<ul>\n<li>\n<p><strong>Controller<\/strong>\uff1a\u30e6\u30fc\u30b6\u30fc\u306e\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u53d7\u3051\u53d6\u308a\u3001Service\u306b\u51e6\u7406\u3092\u4f9d\u983c\u3059\u308b\u7a93\u53e3\u3002<br \/>\u203b\u4f8b\uff1a\u300c\u753b\u9762\u9077\u79fb\u3084\u30ea\u30af\u30a8\u30b9\u30c8\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u53d7\u3051\u53d6\u308a\u3092\u62c5\u3046\u300d<\/p>\n<\/li>\n<li>\n<p><strong>Service<\/strong>\uff1a\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u3092\u8a18\u8ff0\u3002\u8a08\u7b97\u3084\u6761\u4ef6\u5206\u5c90\u306a\u3069\u306e\u51e6\u7406\u3082\u3053\u3053\u3002<br \/>\u203b\u4f8b\uff1a\u300c\u5728\u5eab\u30c1\u30a7\u30c3\u30af\u3084\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u306a\u3069\u306e\u696d\u52d9\u30ed\u30b8\u30c3\u30af\u300d<\/p>\n<\/li>\n<li>\n<p><strong>Repository<\/strong>\uff1aDB\u64cd\u4f5c\u3092\u62c5\u5f53\u3002JPA\u3084JDBC\u3092\u4f7f\u3063\u3066\u30c7\u30fc\u30bf\u306e\u53d6\u5f97\u30fb\u66f4\u65b0\u3092\u884c\u3046\u3002<br \/>\u203b\u4f8b\uff1a\u300cSQL\u306e\u5b9f\u884c\u3084Entity\u306e\u4fdd\u5b58\u30fb\u691c\u7d22\u300d<\/p>\n<\/li>\n<\/ul>\n<hr>\n<h3>\u30b5\u30f3\u30d7\u30eb\u69cb\u6210\uff1aSpring Boot\u3067\u306e\u5b9f\u88c5\u4f8b<\/h3>\n<p>\u4ee5\u4e0b\u306f\u300c\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u3092\u53d6\u5f97\u3057\u3066\u8868\u793a\u3059\u308b\u300d\u51e6\u7406\u306eMVC\u5b9f\u88c5\u4f8b\u3067\u3059\u3002<\/p>\n<p>Controller<\/p>\n<pre><code><span>@RestController<\/span>\r\n<span>@RequestMapping<\/span>(<span>\"\/users\"<\/span>)\r\n<span>public<\/span> <span><span>class<\/span> <span>UserController<\/span> <\/span>{\r\n\r\n    <span>private<\/span> <span>final<\/span> UserService userService;\r\n\r\n    <span><span>public<\/span> <span>UserController<\/span><span>(UserService userService)<\/span> <\/span>{\r\n        <span>this<\/span>.userService = userService;\r\n    }\r\n\r\n    <span>@GetMapping<\/span>(<span>\"\/{id}\"<\/span>)\r\n    <span><span>public<\/span> UserDto <span>getUser<\/span><span>(@PathVariable Long id)<\/span> <\/span>{\r\n        <span>return<\/span> userService.getUserById(id);\r\n    }\r\n}<\/code><\/pre>\n<p>Service<\/p>\n<pre><code><span>@Service<\/span>\r\n<span>public<\/span> <span><span>class<\/span> <span>UserService<\/span> <\/span>{\r\n\r\n    <span>private<\/span> <span>final<\/span> UserRepository userRepository;\r\n\r\n    <span><span>public<\/span> <span>UserService<\/span><span>(UserRepository userRepository)<\/span> <\/span>{\r\n        <span>this<\/span>.userRepository = userRepository;\r\n    }\r\n\r\n    <span><span>public<\/span> UserDto <span>getUserById<\/span><span>(Long id)<\/span> <\/span>{\r\n        User user = userRepository.findById(id)\r\n                          .orElseThrow(() -&gt; <span>new<\/span> RuntimeException(<span>\"User not found\"<\/span>));\r\n        <span>return<\/span> <span>new<\/span> UserDto(user);\r\n    }\r\n}<\/code><\/pre>\n<p>Repository<\/p>\n<pre><code><span>public<\/span> <span><span>interface<\/span> <span>UserRepository<\/span> <span>extends<\/span> <span>JpaRepository<\/span>&lt;<span>User<\/span>, <span>Long<\/span>&gt; <\/span>{\r\n}<\/code><\/pre>\n<hr>\n<h2>\u3088\u304f\u3042\u308b\u3064\u307e\u305a\u304d\uff1a\u5168\u90e8Controller\u306b\u66f8\u3044\u3066\u3057\u307e\u3046<\/h2>\n<h3>&#x274c; Before\uff1a\u3042\u308a\u304c\u3061\u306aNG\u5b9f\u88c5<\/h3>\n<pre><code><span>@GetMapping<\/span>(<span>\"\/{id}\"<\/span>)\r\n<span><span>public<\/span> UserDto <span>getUser<\/span><span>(@PathVariable Long id)<\/span> <\/span>{\r\n    User user = userRepository.findById(id).orElseThrow();\r\n    <span>return<\/span> <span>new<\/span> UserDto(user);\r\n}<\/code><\/pre>\n<p>\u2192 \u4e00\u898b\u52d5\u4f5c\u3057\u307e\u3059\u304c\u3001<strong>\u30d3\u30b8\u30cd\u30b9\u30ed\u30b8\u30c3\u30af\u304cController\u306b\u6df7\u5728<\/strong>\u3057\u3066\u304a\u308a\u3001\u5f8c\u3005\u306e\u4fdd\u5b88\u304c\u56f0\u96e3\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<hr>\n<h3>&#x2705; After\uff1a\u9069\u5207\u306aMVC\u5206\u96e2<\/h3>\n<pre><code><span>\/\/ Controller<\/span>\r\n<span>@GetMapping<\/span>(<span>\"\/{id}\"<\/span>)\r\n<span><span>public<\/span> UserDto <span>getUser<\/span><span>(@PathVariable Long id)<\/span> <\/span>{\r\n    <span>return<\/span> userService.getUserById(id);\r\n}\r\n\r\n<span>\/\/ Service<\/span>\r\n<span><span>public<\/span> UserDto <span>getUserById<\/span><span>(Long id)<\/span> <\/span>{\r\n    User user = userRepository.findById(id)\r\n                    .orElseThrow(() -&gt; <span>new<\/span> RuntimeException(<span>\"User not found\"<\/span>));\r\n    <span>return<\/span> <span>new<\/span> UserDto(user);\r\n}<\/code><\/pre>\n<p>\u2192 \u5404\u30ec\u30a4\u30e4\u30fc\u306e\u8cac\u52d9\u304c\u660e\u78ba\u306b\u306a\u308a\u3001\u518d\u5229\u7528\u6027\u30fb\u30c6\u30b9\u30c8\u6027\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002<\/p>\n<hr>\n<h3>\u3010\u3088\u304f\u3042\u308b\u8cea\u554f\u30fb\u88dc\u8db3\u3011<\/h3>\n<p><strong>Q\uff1aService\u3063\u3066\u5fc5\u8981\uff1fController\u3068Repository\u3060\u3051\u3058\u3083\u30c0\u30e1\uff1f<\/strong><br \/>\u2192 \u5c0f\u898f\u6a21\u3067\u306f\u6210\u308a\u7acb\u3064\u5834\u5408\u3082\u3042\u308a\u307e\u3059\u304c\u3001\u6a5f\u80fd\u62e1\u5f35\u3084\u30c6\u30b9\u30c8\u306e\u89b3\u70b9\u3067\u5206\u96e2\u3059\u3079\u304d\u3067\u3059\u3002<\/p>\n<p><strong>Q\uff1aRepository\u306b\u306f\u3069\u3053\u307e\u3067\u66f8\u3044\u3066\u3044\u3044\u306e\uff1f<\/strong><br \/>\u2192 \u57fa\u672c\u306fDB\u30a2\u30af\u30bb\u30b9\u306e\u307f\u306b\u9650\u5b9a\u3002\u6761\u4ef6\u5206\u5c90\u3084\u8a08\u7b97\u306fService\u3078\u3002<\/p>\n<hr>\n<h2>\u307e\u3068\u3081 | MVC\u69cb\u6210\u304c\u7406\u89e3\u3067\u304d\u308c\u3070\u3001\u8a2d\u8a08\u306b\u8ff7\u308f\u306a\u3044<\/h2>\n<ul>\n<li>\n<p>MVC\u306f<strong>\u8cac\u52d9\u3092\u5206\u96e2\u3057\u3066\u30b3\u30fc\u30c9\u3092\u898b\u901a\u3057\u826f\u304f\u3059\u308b\u8a2d\u8a08\u30d1\u30bf\u30fc\u30f3<\/strong><\/p>\n<\/li>\n<li>\n<p>Controller\uff1a\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u53d7\u4ed8\u3068\u632f\u308a\u5206\u3051<\/p>\n<\/li>\n<li>\n<p>Service\uff1a\u696d\u52d9\u30ed\u30b8\u30c3\u30af\u306e\u51e6\u7406<\/p>\n<\/li>\n<li>\n<p>Repository\uff1a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3068\u306e\u3084\u308a\u53d6\u308a<\/p>\n<\/li>\n<\/ul>\n<p>\u5b9f\u52d9\u306b\u5f37\u3044Spring Boot\u958b\u767a\u306e\u305f\u3081\u306b\u306f\u3001<strong>\u69cb\u6210\u30eb\u30fc\u30eb\u3092\u5b88\u308b\u7fd2\u6163<\/strong>\u304c\u975e\u5e38\u306b\u5927\u5207\u3067\u3059\u3002<\/p>\n<hr>\n<h3>\u3010\u5916\u90e8\u30ea\u30f3\u30af\u3011<\/h3>\n<p><a href=\"https:\/\/spring.io\/projects\/spring-boot\">Spring Boot\u516c\u5f0f\u30b5\u30a4\u30c8<\/a><br \/>\n<a href=\"https:\/\/spring.io\/guides\/gs\/serving-web-content\/\">Spring Framework\u516c\u5f0f\u30ac\u30a4\u30c9 \u2013 Spring MVC<\/a><\/p>\n<h3>\u3010\u5185\u90e8\u30ea\u30f3\u30af\u3011<\/h3>\n<p><a href=\"https:\/\/route-zero.com\/recruit\/route\/1088\/\">Spring Boot\u30a2\u30d7\u30ea\u958b\u767a\u3067\u983b\u767a\u3059\u308bWhitelabel Error Page\uff5cThymeleaf\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30a8\u30e9\u30fc\u3068\u5bfe\u7b56\u307e\u3068\u3081<\/a><\/p>\n<p><a href=\"https:\/\/route-zero.com\/recruit\/route\/1100\/\">\u3010Spring Boot\u5b9f\u8df5\u30ac\u30a4\u30c9\u3011List\u578b\u30fbMap\u578b\u306e\u9055\u3044\u3068Bean\u30af\u30e9\u30b9\u306e\u57fa\u790e\uff06\u5fdc\u7528<\/a><\/p>\n<p><a href=\"https:\/\/route-zero.com\/recruit\/route\/1104\/\">Spring Boot\u306e\u3088\u304f\u4f7f\u308f\u308c\u308b\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u3068\u306f\uff1f\u521d\u5fc3\u8005\u5fc5\u898b\u306e\u89e3\u8aac\u3068\u6d3b\u7528\u6cd5<\/a><\/p>\n<p><a href=\"https:\/\/route-zero.com\/recruit\/route\/1115\/\">Spring Boot \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5165\u9580\uff5cMVC\u7d71\u5408\u3068\u30ab\u30b9\u30bf\u30e0\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u5b9f\u8df5\u4f8b<\/a><\/p>\n<p><a href=\"https:\/\/route-zero.com\/recruit\/route\/1264\/\">\u3010\u4fdd\u5b58\u7248\u3011JPA vs JDBC\u2502Spring Boot\u3067\u306e\u5b9f\u52d9\u7684\u306a\u4f7f\u3044\u5206\u3051\u3068\u5c0e\u5165\u5224\u65ad\u30ac\u30a4\u30c9<\/a><\/p>\n<p><a href=\"https:\/\/route-zero.com\/recruit\/route\/1071\/\">Thymeleaf\u306e\u300cth:field\u300d\u3068\u306f\u4f55\u304b<\/a><\/p>\n<p><a href=\"https:\/\/route-zero.com\/recruit\/route\/1147\/\">\u30d5\u30a9\u30fc\u30e0\u5024\u304c\u6d88\u3048\u308b\uff1fThymeleaf th:object\u3068th:field\u306e\u6b63\u3057\u3044\u4f7f\u3044\u65b9\u3092\u5fb9\u5e95\u89e3\u8aac<\/a><\/p>\n<p><a href=\"https:\/\/route-zero.com\/recruit\/route\/1138\/\">Java\u306efor\u6587\u3092Stream\u306b\u66f8\u304d\u63db\u3048\u308b\u306b\u306f\uff1fSpring Boot\u3067\u306e\u5b9f\u8df5\u4f8b\u4ed8\u304d\u3067\u308f\u304b\u308b\uff01<\/a><\/p>\n<p><a href=\"https:\/\/route-zero.com\/recruit\/route\/922\/\">Java\u3068Spring Boot\u3067\u5b66\u3076Web\u30a2\u30d7\u30ea\u4f5c\u6210\u306e\u7b2c\u4e00\u6b69\uff5c\u521d\u5fc3\u8005\u5411\u3051\u30b9\u30c6\u30c3\u30d7\u30d0\u30a4\u30b9\u30c6\u30c3\u30d7\u30ac\u30a4\u30c9<\/a><\/p>\n<\/div>\n","protected":false},"featured_media":1270,"template":"","_links":{"self":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/route\/1269"}],"collection":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/route"}],"about":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/types\/route"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/media\/1270"}],"wp:attachment":[{"href":"https:\/\/route-zero.com\/recruit\/wp-json\/wp\/v2\/media?parent=1269"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}