{"id":1089,"date":"2024-11-20T16:49:09","date_gmt":"2024-11-20T07:49:09","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=1089"},"modified":"2025-03-24T08:52:45","modified_gmt":"2025-03-23T23:52:45","slug":"java%e3%81%a7restful-api%e9%96%8b%e7%99%ba%e3%82%92%e6%a5%b5%e3%82%81%e3%82%8b%ef%bc%81%e5%ae%9f%e8%b7%b5%e7%9a%84%e3%81%aa%e5%ae%9f%e8%a3%85%e6%89%8b%e9%a0%86%e3%81%a87%e3%81%a4%e3%81%ae%e3%83%99","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=1089","title":{"rendered":"Java\u3067RESTful API\u958b\u767a\u3092\u6975\u3081\u308b\uff01\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u624b\u9806\u30687\u3064\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9"},"content":{"rendered":"<div id=\"sgb-css-id-1\">\n<p>\u73fe\u4ee3\u306e\u30b7\u30b9\u30c6\u30e0\u958b\u767a\u306b\u304a\u3044\u3066\u3001RESTful API\u306e\u91cd\u8981\u6027\u306f\u65e5\u3005\u9ad8\u307e\u3063\u3066\u3044\u307e\u3059\u3002\u7279\u306bJava\u3092\u4f7f\u7528\u3057\u305fRESTful API\u958b\u767a\u306f\u3001\u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u30b7\u30b9\u30c6\u30e0\u304b\u3089\u30b9\u30bf\u30fc\u30c8\u30a2\u30c3\u30d7\u306e\u30d7\u30ed\u30c0\u30af\u30c8\u307e\u3067\u3001\u5e45\u5e83\u3044\u5834\u9762\u3067\u63a1\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u672c\u8a18\u4e8b\u3067\u306f\u3001Java\u3067\u306eRESTful API\u958b\u767a\u306b\u95a2\u3059\u308b\u5b9f\u8df5\u7684\u306a\u77e5\u8b58\u3068\u3001\u5b9f\u88c5\u73fe\u5834\u3067\u76f4\u63a5\u6d3b\u7528\u3067\u304d\u308b\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u3054\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-2\">\n<h4 class=\"wp-block-heading\" id=\"i-0\">\u306a\u305c\u4eca\u3001Java\u3067\u306eRESTful API\u958b\u767a\u304c\u91cd\u8981\u306a\u306e\u304b\uff1f<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-3\">\n<p>\u8fd1\u5e74\u306e\u30b7\u30b9\u30c6\u30e0\u958b\u767a\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u8981\u56e0\u304b\u3089RESTful API\u306e\u9700\u8981\u304c\u6025\u5897\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-4\">\n<p>\u3000\u25cf \u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306e\u666e\u53ca<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-5\">\n<p>\u3000\u25cf \u30e2\u30d0\u30a4\u30eb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5897\u52a0<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-6\">\n<p>\u3000\u25cf \u30b7\u30b9\u30c6\u30e0\u9593\u9023\u643a\u306e\u9700\u8981\u62e1\u5927<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-7\">\n<p>\u3000\u25cf \u30af\u30e9\u30a6\u30c9\u30cd\u30a4\u30c6\u30a3\u30d6\u958b\u767a\u306e\u4e3b\u6d41\u5316<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-8\">\n<p>\u305d\u306e\u4e2d\u3067\u3082Java\u306f\u3001\u4ee5\u4e0b\u306e\u7406\u7531\u304b\u3089\u7279\u306b\u6ce8\u76ee\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-9\">\n<p>\u3000\u25cf \u8c4a\u5bcc\u306a\u958b\u767a\u5b9f\u7e3e\u3068\u5b9f\u7528\u4f8b<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-10\">\n<p>\u3000\u25cf \u5145\u5b9f\u3057\u305f\u30a8\u30b3\u30b7\u30b9\u30c6\u30e0\u3068\u30e9\u30a4\u30d6\u30e9\u30ea\u7fa4<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-11\">\n<p>\u3000\u25cf \u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u30ec\u30d9\u30eb\u306e\u4fe1\u983c\u6027<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-12\">\n<p>\u3000\u25cf \u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u306e\u9ad8\u3055<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-13\">\n<h4 class=\"wp-block-heading\" id=\"i-1\">\u672c\u8a18\u4e8b\u3067\u5b66\u3079\u308b\u3053\u3068<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-14\">\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001\u4ee5\u4e0b\u306e\u5185\u5bb9\u3092\u6bb5\u968e\u7684\u306b\u89e3\u8aac\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-15\">\n<p>\u30001. RESTful API\u306e\u57fa\u790e\u77e5\u8b58\u3068Java\u3067\u306e\u5b9f\u88c5\u30e1\u30ea\u30c3\u30c8<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-16\">\n<p>\u30002. \u958b\u767a\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u304b\u3089\u5b9f\u88c5\u624b\u9806<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-17\">\n<p>\u30003. \u5b9f\u8df5\u7684\u306a\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-18\">\n<p>\u30004. \u30c6\u30b9\u30c8\u3068\u54c1\u8cea\u4fdd\u8a3c\u306e\u65b9\u6cd5<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-19\">\n<p>\u30005. \u5b9f\u904b\u7528\u3092\u898b\u636e\u3048\u305f\u767a\u5c55\u7684\u306a\u30c8\u30d4\u30c3\u30af<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-20\">\n<p>\u5404\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u5177\u4f53\u7684\u306a\u30b3\u30fc\u30c9\u4f8b\u3068\u5b9f\u8df5\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3092\u4ea4\u3048\u306a\u304c\u3089\u3001\u73fe\u5834\u3067\u5373\u6d3b\u7528\u3067\u304d\u308b\u77e5\u8b58\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-21\">\n<p>\u305d\u308c\u3067\u306f\u3001Java\u3067\u306eRESTful API\u958b\u767a\u306e\u4e16\u754c\u306b\u98db\u3073\u8fbc\u3093\u3067\u3044\u304d\u307e\u3057\u3087\u3046\u3002\u5404\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u3001\u5b9f\u8df5\u7684\u304b\u3064\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u624b\u6cd5\u3092\u8a73\u3057\u304f\u898b\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-22\">\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-2\">\uff11\uff0eRESTful API\u306e\u57fa\u790e\u77e5\u8b58\u3068Java\u3067\u306e\u5b9f\u88c5\u30e1\u30ea\u30c3\u30c8<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-3\">1.1 RESTful API\u306e4\u3064\u306e\u91cd\u8981\u306a\u7279\u5fb4\u3068\u5229\u70b9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-8\">1.2 \u306a\u305cJava\u3067RESTful API\u3092\u5b9f\u88c5\u3059\u3079\u304d\u306a\u306e\u304b<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-15\">\uff12\uff0eJava\u3067\u306eRESTful API\u958b\u767a\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-16\">2.1 \u5fc5\u8981\u306a\u30c4\u30fc\u30eb\u3068\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-20\">2.2 Spring Boot \u3092\u4f7f\u7528\u3057\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-27\">\uff13\uff0eRESTful API\u306e\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u624b\u9806<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-28\">3.1 \u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li>        <a href=\"#i-32\">3.2 \u30ea\u30af\u30a8\u30b9\u30c8\/\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u9069\u5207\u306a\u8a2d\u8a08\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-35\">3.3 \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-38\">\uff14\uff0e7\u3064\u306e\u5b9f\u8df5\u7684\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-39\">4.1 \u9069\u5207\u306aHTTP\u30e1\u30bd\u30c3\u30c9\u3068\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u306e\u4f7f\u7528\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-42\">4.2 \u52b9\u7387\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u8a2d\u8a08\u3068URL\u8a2d\u8a08\u306e\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-44\">4.3 \u30d0\u30fc\u30b8\u30e7\u30cb\u30f3\u30b0\u3068\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u5316\u306e\u91cd\u8981\u6027<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-47\">4.4 \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-51\">\uff15\uff0eRESTful API\u306e\u30c6\u30b9\u30c8\u3068\u54c1\u8cea\u4fdd\u8a3c<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-52\">5.1 \u5358\u4f53\u30c6\u30b9\u30c8\u3068\u7d71\u5408\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-55\">5.2 \u8ca0\u8377\u30c6\u30b9\u30c8\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u624b\u9806<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-60\">\uff16\uff0e\u5b9f\u904b\u7528\u3092\u898b\u636e\u3048\u305f\u767a\u5c55\u7684\u306a\u30c8\u30d4\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-61\">6.1 \u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u8a2d\u8a08\u624b\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-65\">6.2 \u76e3\u8996\u3068\u30ed\u30b0\u7ba1\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-70\">\uff17\uff0e\u307e\u3068\u3081\uff1a\u9ad8\u54c1\u8cea\u306aRESTful API\u958b\u767a\u306e\u305f\u3081\u306b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-71\">7.1 \u5b9f\u88c5\u6642\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-74\">7.2 \u3055\u3089\u306a\u308b\u5b66\u7fd2\u306e\u305f\u3081\u306e\u30ea\u30bd\u30fc\u30b9\u7d39\u4ecb<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-2\">\uff11\uff0eRESTful API\u306e\u57fa\u790e\u77e5\u8b58\u3068Java\u3067\u306e\u5b9f\u88c5\u30e1\u30ea\u30c3\u30c8<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-23\">\n<h3 class=\"wp-block-heading\" id=\"i-3\">1.1 RESTful API\u306e4\u3064\u306e\u91cd\u8981\u306a\u7279\u5fb4\u3068\u5229\u70b9<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-24\">\n<p>RESTful API\uff08Representational State Transfer API\uff09\u306f\u3001Web\u30b5\u30fc\u30d3\u30b9\u3092\u69cb\u7bc9\u3059\u308b\u969b\u306e\u6a19\u6e96\u7684\u306a\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u30b9\u30bf\u30a4\u30eb\u3067\u3059\u3002\u4ee5\u4e0b\u306e4\u3064\u306e\u91cd\u8981\u306a\u7279\u5fb4\u306b\u3088\u308a\u3001\u52b9\u7387\u7684\u3067\u67d4\u8edf\u306a\u30b7\u30b9\u30c6\u30e0\u9593\u9023\u643a\u3092\u5b9f\u73fe\u3057\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-25\">\n<h4 class=\"wp-block-heading\" id=\"i-4\">1. \u30b9\u30c6\u30fc\u30c8\u30ec\u30b9\u6027<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-26\">\n<p>\u3000\u25cf <strong>\u7279\u5fb4<\/strong>\uff1a \u30b5\u30fc\u30d0\u30fc\u306f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u72b6\u614b\u3092\u4fdd\u6301\u3057\u306a\u3044<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-27\">\n<p>\u3000\u25cf <strong><strong>\u5229\u70b9<\/strong><\/strong>\uff1a <\/p>\n<\/div>\n\n<div id=\"sgb-css-id-28\">\n<p>\u3000\u3000\u3000\u25cf \u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u306e\u5411\u4e0a <\/p>\n<\/div>\n\n<div id=\"sgb-css-id-29\">\n<p>\u3000\u3000\u3000\u25cf \u30b7\u30b9\u30c6\u30e0\u306e\u4fe1\u983c\u6027\u5411\u4e0a <\/p>\n<\/div>\n\n<div id=\"sgb-css-id-30\">\n<p>\u3000\u3000\u3000\u25cf \u30c7\u30d0\u30c3\u30b0\u306e\u5bb9\u6613\u3055 <\/p>\n<\/div>\n\n<div id=\"sgb-css-id-31\">\n<h4 class=\"wp-block-heading\" id=\"i-5\">2. \u30ea\u30bd\u30fc\u30b9\u6307\u5411<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-32\">\n<p>\u3000\u25cf <strong>\u7279\u5fb4<\/strong>\uff1a \u5168\u3066\u306e\u30ea\u30bd\u30fc\u30b9\u306b\u4e00\u610f\u306eURI\uff08Uniform Resource Identifier\uff09\u304c\u5272\u308a\u5f53\u3066\u3089\u308c\u308b<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-33\">\n<p>\u3000\u25cf <strong><strong>\u5229\u70b9<\/strong><\/strong>\uff1a <\/p>\n<\/div>\n\n<div id=\"sgb-css-id-34\">\n<p>\u3000\u3000\u3000\u25cf \u76f4\u611f\u7684\u306aAPI\u8a2d\u8a08\u304c\u53ef\u80fd<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-35\">\n<p>\u3000\u3000\u3000\u25cf \u30ea\u30bd\u30fc\u30b9\u306e\u4e00\u8cab\u3057\u305f\u7ba1\u7406<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-36\">\n<p>\u3000\u3000\u3000\u25cf \u660e\u78ba\u306a\u30a2\u30af\u30bb\u30b9\u30d1\u30bf\u30fc\u30f3<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-37\">\n<h4 class=\"wp-block-heading\" id=\"i-6\">3. \u7d71\u4e00\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-38\">\n<p>\u3000\u25cf <strong>\u7279\u5fb4<\/strong>\uff1a HTTP\u30e1\u30bd\u30c3\u30c9\uff08GET, POST, PUT, DELETE\uff09\u3092\u4f7f\u7528\u3057\u305f\u6a19\u6e96\u7684\u306a\u64cd\u4f5c<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-39\">\n<p>\u3000\u25cf <strong><strong>\u5229\u70b9<\/strong><\/strong>\uff1a <\/p>\n<\/div>\n\n<div id=\"sgb-css-id-40\">\n<p>\u3000\u3000\u3000\u25cf \u5b66\u7fd2\u30b3\u30b9\u30c8\u306e\u4f4e\u6e1b<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-41\">\n<p>\u3000\u3000\u3000\u25cf \u5b9f\u88c5\u306e\u4e00\u8cab\u6027<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-42\">\n<p>\u3000\u3000\u3000\u25cf \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u958b\u767a\u306e\u52b9\u7387\u5316<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-43\">\n<h4 class=\"wp-block-heading\" id=\"i-7\">4. \u30ad\u30e3\u30c3\u30b7\u30e5\u53ef\u80fd\u6027<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-44\">\n<p>\u3000\u25cf <strong>\u7279\u5fb4<\/strong>\uff1a \u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u304c\u53ef\u80fd<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-45\">\n<p>\u3000\u25cf <strong><strong>\u5229\u70b9<\/strong><\/strong>\uff1a <\/p>\n<\/div>\n\n<div id=\"sgb-css-id-46\">\n<p>\u3000\u3000\u3000\u25cf \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u5411\u4e0a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-47\">\n<p>\u3000\u3000\u3000\u25cf \u30b5\u30fc\u30d0\u30fc\u8ca0\u8377\u306e\u8efd\u6e1b<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-48\">\n<p>\u3000\u3000\u3000\u25cf \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u524a\u6e1b<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-49\">\n<h3 class=\"wp-block-heading\" id=\"i-8\">1.2 \u306a\u305cJava\u3067RESTful API\u3092\u5b9f\u88c5\u3059\u3079\u304d\u306a\u306e\u304b<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-50\">\n<p>Java\u306f\u3001RESTful API\u958b\u767a\u306b\u304a\u3044\u3066\u4ee5\u4e0b\u306e\u512a\u4f4d\u6027\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-51\">\n<h4 class=\"wp-block-heading\" id=\"i-9\">1. \u8c4a\u5bcc\u306a\u30a8\u30b3\u30b7\u30b9\u30c6\u30e0<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Spring Boot\u3092\u4f7f\u7528\u3057\u305f\u7c21\u5358\u306aREST\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u4f8b\n@RestController\n@RequestMapping(\"\/api\/v1\")\npublic class UserController {\n    @GetMapping(\"\/users\")\n    public List&lt;User&gt; getUsers() {\n        \/\/ \u30e6\u30fc\u30b6\u30fc\u4e00\u89a7\u3092\u8fd4\u5374\n        return userService.getAllUsers();\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-52\">\n<h4 class=\"wp-block-heading\" id=\"i-10\">2. \u5f37\u529b\u306a\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u30b5\u30dd\u30fc\u30c8<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-53\">\n<p>\u3000\u25cf <strong><strong><strong>Spring Boot<\/strong><\/strong><\/strong>\uff1a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-54\">\n<p>\u3000\u3000\u3000\u25cf \u81ea\u52d5\u8a2d\u5b9a\u6a5f\u80fd<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-55\">\n<p>\u3000\u3000\u3000\u25cf \u7d44\u307f\u8fbc\u307f\u30b5\u30fc\u30d0\u30fc<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-56\">\n<p>\u3000\u3000\u3000\u25cf \u8c4a\u5bcc\u306a\u7d71\u5408\u6a5f\u80fd<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-57\">\n<h4 class=\"wp-block-heading\" id=\"i-11\">3. \u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u30ec\u30d9\u30eb\u306e\u4fe1\u983c\u6027<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-58\">\n<p>\u3000\u25cf \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-59\">\n<p>\u3000\u25cf \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u6a5f\u80fd<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-60\">\n<p>\u3000\u25cf \u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-61\">\n<h4 class=\"wp-block-heading\" id=\"i-12\">4. \u958b\u767a\u751f\u7523\u6027\u306e\u5411\u4e0a<\/h4>\n<\/div>\n\n<div id=\"id-12cb3d89-c722-4841-b20c-5e8c4540b3a7\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u6a5f\u80fd<\/th><th>\u30e1\u30ea\u30c3\u30c8<\/th><\/tr><\/thead><tbody><tr><td>\u30a2\u30ce\u30c6\u30fc\u30b7\u30e7\u30f3\u30d9\u30fc\u30b9\u306e\u8a2d\u5b9a<\/td><td>\u8a2d\u5b9a\u306e\u7c21\u7d20\u5316<\/td><\/tr><tr><td>\u8c4a\u5bcc\u306a\u30e9\u30a4\u30d6\u30e9\u30ea<\/td><td>\u958b\u767a\u6642\u9593\u306e\u77ed\u7e2e<\/td><\/tr><tr><td>\u5145\u5b9f\u3057\u305f\u30c6\u30b9\u30c8\u30c4\u30fc\u30eb<\/td><td>\u54c1\u8cea\u306e\u5411\u4e0a<\/td><\/tr><tr><td>IDE\u7d71\u5408<\/td><td>\u52b9\u7387\u7684\u306a\u958b\u767a<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n<div id=\"sgb-css-id-62\">\n<h4 class=\"wp-block-heading\" id=\"i-13\">5. \u9ad8\u5ea6\u306a\u6a5f\u80fd\u306e\u5b9f\u88c5\u3057\u3084\u3059\u3055<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u6a5f\u80fd\u306e\u4f8b\n@PostMapping(\"\/users\")\npublic ResponseEntity&lt;User&gt; createUser(@Valid @RequestBody UserDTO userDTO) {\n    \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u6e08\u307f\u306e\u30c7\u30fc\u30bf\u3092\u4f7f\u7528\u3057\u3066\u51e6\u7406\u3092\u5b9f\u884c\n    User createdUser = userService.createUser(userDTO);\n    return new ResponseEntity&lt;&gt;(createdUser, HttpStatus.CREATED);\n}<\/pre>\n\n\n<div id=\"sgb-css-id-63\">\n<h4 class=\"wp-block-heading\" id=\"i-14\">\u5b9f\u8df5\u7684\u306a\u30e1\u30ea\u30c3\u30c8<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-64\">\n<p>1. <strong>\u578b\u5b89\u5168\u6027<\/strong>\uff1a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-65\">\n<p>\u3000\u25cf \u30b3\u30f3\u30d1\u30a4\u30eb\u6642\u306e\u30a8\u30e9\u30fc\u691c\u51fa<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-66\">\n<p>\u3000\u25cf \u5b9f\u884c\u6642\u306e\u5b89\u5b9a\u6027\u5411\u4e0a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-67\">\n<p>2. <strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong>\uff1a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-68\">\n<p>\u3000\u25cf JVM\u306e\u6700\u9069\u5316\u6a5f\u80fd<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-69\">\n<p>\u3000\u25cf \u52b9\u7387\u7684\u306a\u30e1\u30e2\u30ea\u7ba1\u7406<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-70\">\n<p>3. <strong><strong>\u4fdd\u5b88\u6027<\/strong><\/strong>\uff1a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-71\">\n<p>\u3000\u25cf \u660e\u78ba\u306a\u30b3\u30fc\u30c9\u69cb\u9020<\/p>\n<\/div>\n\n\n<p>\u3000\u25cf \u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u306e\u5bb9\u6613\u3055<\/p>\n\n\n<div id=\"sgb-css-id-72\">\n<p>\u3053\u306e\u3088\u3046\u306b\u3001Java\u3067\u306eRESTful API\u5b9f\u88c5\u306f\u3001\u958b\u767a\u52b9\u7387\u3001\u4fdd\u5b88\u6027\u3001\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u306a\u3069\u3001\u591a\u304f\u306e\u9762\u3067\u512a\u4f4d\u6027\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002\u7279\u306b\u4f01\u696d\u30b7\u30b9\u30c6\u30e0\u306b\u304a\u3044\u3066\u306f\u3001\u3053\u308c\u3089\u306e\u7279\u5fb4\u304c\u91cd\u8981\u306a\u4fa1\u5024\u3092\u6301\u3061\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-73\">\n<h2 class=\"wp-block-heading\" id=\"i-15\">\uff12\uff0eJava\u3067\u306eRESTful API\u958b\u767a\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-74\">\n<h3 class=\"wp-block-heading\" id=\"i-16\">2.1 \u5fc5\u8981\u306a\u30c4\u30fc\u30eb\u3068\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-75\">\n<p>RESTful API\u306e\u958b\u767a\u3092\u59cb\u3081\u308b\u524d\u306b\u3001\u4ee5\u4e0b\u306e\u958b\u767a\u74b0\u5883\u3092\u6574\u3048\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-76\">\n<h4 class=\"wp-block-heading\" id=\"i-17\">\u5fc5\u8981\u306a\u30c4\u30fc\u30eb\u4e00\u89a7<\/h4>\n<\/div>\n\n<div id=\"id-06b82056-8778-4bc6-a69a-4466aa4ff1a8\"><div id=\"sgb-css-id-77\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30c4\u30fc\u30eb<\/th><th>\u63a8\u5968\u30d0\u30fc\u30b8\u30e7\u30f3<\/th><th>\u7528\u9014<\/th><\/tr><\/thead><tbody><tr><td>JDK<\/td><td>17\u4ee5\u4e0a<\/td><td>Java\u5b9f\u884c\u74b0\u5883<\/td><\/tr><tr><td>Maven\/Gradle<\/td><td>Maven 3.8+\/Gradle 7.0+<\/td><td>\u30d3\u30eb\u30c9\u30c4\u30fc\u30eb<\/td><\/tr><tr><td>IDE<\/td><td>IntelliJ IDEA\/Eclipse<\/td><td>\u7d71\u5408\u958b\u767a\u74b0\u5883<\/td><\/tr><tr><td>Postman<\/td><td>\u6700\u65b0\u7248<\/td><td>API\u30c6\u30b9\u30c8<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-78\">\n<h4 class=\"wp-block-heading\" id=\"i-18\">\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-79\">\n<p>1. <strong>JDK\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># macOS\u306e\u5834\u5408\uff08Homebrew\u4f7f\u7528\uff09\nbrew install openjdk@17\n\n# Windows\u306e\u5834\u5408\n# Oracle\u516c\u5f0f\u30b5\u30a4\u30c8\u304b\u3089\u30a4\u30f3\u30b9\u30c8\u30fc\u30e9\u30fc\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\n# \u74b0\u5883\u5909\u6570JAVA_HOME\u306e\u8a2d\u5b9a\u304c\u5fc5\u8981<\/pre>\n\n\n<div id=\"sgb-css-id-80\">\n<p>2. <strong><strong>Maven\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/strong><\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># macOS\u306e\u5834\u5408\nbrew install maven\n\n# Windows\u306e\u5834\u5408\n# Apache Maven\u516c\u5f0f\u30b5\u30a4\u30c8\u304b\u3089zip\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\n# \u74b0\u5883\u5909\u6570PATH\u8a2d\u5b9a\u304c\u5fc5\u8981<\/pre>\n\n\n<div id=\"sgb-css-id-81\">\n<p>3. <strong>\u74b0\u5883\u5909\u6570\u306e\u8a2d\u5b9a\u78ba\u8a8d<\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Java\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u78ba\u8a8d\njava -version\n\n# Maven\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u78ba\u8a8d\nmvn -version<\/pre>\n\n\n<div id=\"sgb-css-id-82\">\n<h4 class=\"wp-block-heading\" id=\"i-19\">\u63a8\u5968IDE\u8a2d\u5b9a<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-83\">\n<p>IntelliJ IDEA\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306e\u63a8\u5968\u30d7\u30e9\u30b0\u30a4\u30f3\uff1a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-84\">\n<p>\u3000\u25cf Spring Boot Assistant<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-85\">\n<p>\u3000\u25cf Java Stream Debugger<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-86\">\n<p>\u3000\u25cf Lombok Plugin<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-87\">\n<p>\u3000\u25cf Database Navigator<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-88\">\n<h3 class=\"wp-block-heading\" id=\"i-20\">2.2 Spring Boot \u3092\u4f7f\u7528\u3057\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\u65b9\u6cd5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-89\">\n<h4 class=\"wp-block-heading\" id=\"i-21\">Spring Initializr\u3092\u4f7f\u7528\u3057\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u4f5c\u6210<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-90\">\n<p>1. <strong>Spring Initializr\u306b\u30a2\u30af\u30bb\u30b9<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-91\">\n<p>\u3000\u25cf <a href=\"https:\/\/start.spring.io\/\">https:\/\/start.spring.io\/<\/a> \u306b\u30a2\u30af\u30bb\u30b9<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-92\">\n<p>\u3000\u25cf \u4ee5\u4e0b\u306e\u8a2d\u5b9a\u3092\u9078\u629e\uff1a<\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Project: Maven\nLanguage: Java\nSpring Boot: 3.x.x\nPackaging: Jar\nJava: 17<\/pre>\n\n\n<div id=\"sgb-css-id-93\">\n<p>2. <strong>\u5fc5\u8981\u306a\u4f9d\u5b58\u95a2\u4fc2\u306e\u8ffd\u52a0<\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- pom.xml\u306e\u4e3b\u8981\u306a\u4f9d\u5b58\u95a2\u4fc2 --&gt;\n&lt;dependencies&gt;\n    &lt;!-- Spring Web --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- Spring Data JPA --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- Spring Validation --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-validation&lt;\/artifactId&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- H2 Database --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.h2database&lt;\/groupId&gt;\n        &lt;artifactId&gt;h2&lt;\/artifactId&gt;\n        &lt;scope&gt;runtime&lt;\/scope&gt;\n    &lt;\/dependency&gt;\n&lt;\/dependencies&gt;<\/pre>\n\n\n<div id=\"sgb-css-id-94\">\n<h4 class=\"wp-block-heading\" id=\"i-22\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u69cb\u9020\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">src\/\n\u251c\u2500\u2500 main\/\n\u2502   \u251c\u2500\u2500 java\/\n\u2502   \u2502   \u2514\u2500\u2500 com\/\n\u2502   \u2502       \u2514\u2500\u2500 example\/\n\u2502   \u2502           \u2514\u2500\u2500 demo\/\n\u2502   \u2502               \u251c\u2500\u2500 DemoApplication.java\n\u2502   \u2502               \u251c\u2500\u2500 controller\/\n\u2502   \u2502               \u251c\u2500\u2500 service\/\n\u2502   \u2502               \u251c\u2500\u2500 repository\/\n\u2502   \u2502               \u251c\u2500\u2500 model\/\n\u2502   \u2502               \u2514\u2500\u2500 config\/\n\u2502   \u2514\u2500\u2500 resources\/\n\u2502       \u2514\u2500\u2500 application.properties\n\u2514\u2500\u2500 test\/\n    \u2514\u2500\u2500 java\/<\/pre>\n\n\n<div id=\"sgb-css-id-95\">\n<h4 class=\"wp-block-heading\" id=\"i-23\">application.properties \u306e\u57fa\u672c\u8a2d\u5b9a<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30b5\u30fc\u30d0\u30fc\u8a2d\u5b9a\nserver.port=8080\nserver.servlet.context-path=\/api\/v1\n\n# \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u8a2d\u5b9a\nspring.datasource.url=jdbc:h2:mem:testdb\nspring.datasource.driverClassName=org.h2.Driver\nspring.datasource.username=sa\nspring.datasource.password=\n\n# JPA\u8a2d\u5b9a\nspring.jpa.database-platform=org.hibernate.dialect.H2Dialect\nspring.jpa.hibernate.ddl-auto=update\n\n# \u30ed\u30b0\u8a2d\u5b9a\nlogging.level.org.springframework=INFO\nlogging.level.com.example=DEBUG<\/pre>\n\n\n<div id=\"sgb-css-id-96\">\n<h4 class=\"wp-block-heading\" id=\"i-24\">\u52d5\u4f5c\u78ba\u8a8d\u7528\u306e\u7c21\u5358\u306a\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@RestController\n@RequestMapping(\"\/hello\")\npublic class HelloController {\n\n    @GetMapping\n    public String hello() {\n        return \"Spring Boot REST API is running!\";\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-97\">\n<h4 class=\"wp-block-heading\" id=\"i-25\">\u8d77\u52d5\u3068\u52d5\u4f5c\u78ba\u8a8d<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-98\">\n<p>1. <strong>\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8d77\u52d5<\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30eb\u30fc\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u5b9f\u884c\nmvn spring-boot:run<\/pre>\n\n\n<div id=\"sgb-css-id-99\">\n<p>2. <strong><strong>\u52d5\u4f5c\u78ba\u8a8d<\/strong><\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">curl http:\/\/localhost:8080\/api\/v1\/hello<\/pre>\n\n\n<div id=\"sgb-css-id-100\">\n<h4 class=\"wp-block-heading\" id=\"i-26\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-101\">\n<p>\u3088\u304f\u3042\u308b\u554f\u984c\u3068\u89e3\u6c7a\u7b56\uff1a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-102\">\n<p>\u30001. <strong>\u30dd\u30fc\u30c8\u7af6\u5408<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-103\">\n<p>\u3000\u3000\u25cf \u30a8\u30e9\u30fc\uff1a <code>Port 8080 is already in use<\/code><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-104\">\n<p>\u3000\u3000\u25cf \u89e3\u6c7a\u7b56\uff1a <code>application.properties<\/code>\u3067\u5225\u306e\u30dd\u30fc\u30c8\u3092\u6307\u5b9a<\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  server.port=8081<\/pre>\n\n\n<div id=\"sgb-css-id-105\">\n<p>\u30002. <strong><strong>Java \u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u4e0d\u4e00\u81f4<\/strong><\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-106\">\n<p>\u3000\u3000\u25cf \u30a8\u30e9\u30fc\uff1a <code>Java version mismatch<\/code><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-107\">\n<p>\u3000\u3000\u25cf \u89e3\u6c7a\u7b56\uff1a <code>pom.xml<\/code>\u306eJava\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u78ba\u8a8d<\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  &lt;properties&gt;\n      &lt;java.version&gt;17&lt;\/java.version&gt;\n  &lt;\/properties&gt;<\/pre>\n\n\n<div id=\"sgb-css-id-108\">\n<p>\u3053\u308c\u3067\u57fa\u672c\u7684\u306a\u958b\u767a\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u306f\u5b8c\u4e86\u3067\u3059\u3002\u6b21\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001\u3053\u306e\u74b0\u5883\u3092\u4f7f\u7528\u3057\u3066\u5b9f\u969b\u306eAPI\u5b9f\u88c5\u306b\u9032\u307f\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-109\">\n<h2 class=\"wp-block-heading\" id=\"i-27\">\uff13\uff0eRESTful API\u306e\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u624b\u9806<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-110\">\n<h3 class=\"wp-block-heading\" id=\"i-28\">3.1 \u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\u306e\u5b9f\u88c5\u4f8b<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-111\">\n<p>\u30e6\u30fc\u30b6\u30fc\u7ba1\u7406API\u3092\u4f8b\u306b\u3001\u57fa\u672c\u7684\u306aCRUD\u64cd\u4f5c\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-112\">\n<h4 class=\"wp-block-heading\" id=\"i-29\">\u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u306e\u5b9a\u7fa9<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Entity\n@Table(name = \"users\")\n@Data\n@NoArgsConstructor\n@AllArgsConstructor\npublic class User {\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n\n    @Column(nullable = false)\n    private String name;\n\n    @Email\n    @Column(unique = true, nullable = false)\n    private String email;\n\n    @Column(nullable = false)\n    private String department;\n\n    @CreatedDate\n    private LocalDateTime createdAt;\n\n    @LastModifiedDate\n    private LocalDateTime updatedAt;\n}<\/pre>\n\n\n<div id=\"sgb-css-id-113\">\n<h4 class=\"wp-block-heading\" id=\"i-30\">\u30ea\u30dd\u30b8\u30c8\u30ea\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Repository\npublic interface UserRepository extends JpaRepository&lt;User, Long&gt; {\n    Optional&lt;User&gt; findByEmail(String email);\n    List&lt;User&gt; findByDepartment(String department);\n}<\/pre>\n\n\n<div id=\"sgb-css-id-114\">\n<h4 class=\"wp-block-heading\" id=\"i-31\">\u30b5\u30fc\u30d3\u30b9\u30ec\u30a4\u30e4\u30fc\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Service\n@Transactional\n@Slf4j\npublic class UserService {\n    private final UserRepository userRepository;\n\n    @Autowired\n    public UserService(UserRepository userRepository) {\n        this.userRepository = userRepository;\n    }\n\n    \/\/ Create\n    public User createUser(User user) {\n        log.info(\"Creating new user: {}\", user.getEmail());\n        return userRepository.save(user);\n    }\n\n    \/\/ Read\n    public User getUserById(Long id) {\n        return userRepository.findById(id)\n            .orElseThrow(() -&gt; new ResourceNotFoundException(\"User not found with id: \" + id));\n    }\n\n    \/\/ Update\n    public User updateUser(Long id, User userDetails) {\n        User user = getUserById(id);\n        user.setName(userDetails.getName());\n        user.setDepartment(userDetails.getDepartment());\n        return userRepository.save(user);\n    }\n\n    \/\/ Delete\n    public void deleteUser(Long id) {\n        User user = getUserById(id);\n        userRepository.delete(user);\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-115\">\n<h3 class=\"wp-block-heading\" id=\"i-32\">3.2 \u30ea\u30af\u30a8\u30b9\u30c8\/\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u9069\u5207\u306a\u8a2d\u8a08\u65b9\u6cd5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-116\">\n<h4 class=\"wp-block-heading\" id=\"i-33\">DTO\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class UserDTO {\n    \/\/ \u30ea\u30af\u30a8\u30b9\u30c8\u7528DTO\n    @Data\n    public static class CreateRequest {\n        @NotBlank\n        private String name;\n\n        @Email\n        @NotBlank\n        private String email;\n\n        @NotBlank\n        private String department;\n    }\n\n    \/\/ \u30ec\u30b9\u30dd\u30f3\u30b9\u7528DTO\n    @Data\n    public static class Response {\n        private Long id;\n        private String name;\n        private String email;\n        private String department;\n        private LocalDateTime createdAt;\n\n        public static Response fromEntity(User user) {\n            Response response = new Response();\n            BeanUtils.copyProperties(user, response);\n            return response;\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-117\">\n<h4 class=\"wp-block-heading\" id=\"i-34\">\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@RestController\n@RequestMapping(\"\/api\/v1\/users\")\n@Validated\npublic class UserController {\n    private final UserService userService;\n\n    @Autowired\n    public UserController(UserService userService) {\n        this.userService = userService;\n    }\n\n    @PostMapping\n    public ResponseEntity&lt;UserDTO.Response&gt; createUser(\n            @Valid @RequestBody UserDTO.CreateRequest request) {\n        User user = new User();\n        BeanUtils.copyProperties(request, user);\n        User createdUser = userService.createUser(user);\n        return new ResponseEntity&lt;&gt;(\n            UserDTO.Response.fromEntity(createdUser), \n            HttpStatus.CREATED\n        );\n    }\n\n    @GetMapping(\"\/{id}\")\n    public ResponseEntity&lt;UserDTO.Response&gt; getUser(@PathVariable Long id) {\n        User user = userService.getUserById(id);\n        return ResponseEntity.ok(UserDTO.Response.fromEntity(user));\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-118\">\n<h3 class=\"wp-block-heading\" id=\"i-35\">3.3 \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-119\">\n<h4 class=\"wp-block-heading\" id=\"i-36\">\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u306e\u5b9a\u7fa9<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@ResponseStatus(HttpStatus.NOT_FOUND)\npublic class ResourceNotFoundException extends RuntimeException {\n    public ResourceNotFoundException(String message) {\n        super(message);\n    }\n}\n\n@ResponseStatus(HttpStatus.BAD_REQUEST)\npublic class BadRequestException extends RuntimeException {\n    public BadRequestException(String message) {\n        super(message);\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-120\">\n<h4 class=\"wp-block-heading\" id=\"i-37\">\u30b0\u30ed\u30fc\u30d0\u30eb\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@ControllerAdvice\npublic class GlobalExceptionHandler extends ResponseEntityExceptionHandler {\n\n    @ExceptionHandler(ResourceNotFoundException.class)\n    public ResponseEntity&lt;ErrorResponse&gt; handleResourceNotFoundException(\n            ResourceNotFoundException ex, WebRequest request) {\n        ErrorResponse error = new ErrorResponse(\n            HttpStatus.NOT_FOUND.value(),\n            ex.getMessage(),\n            LocalDateTime.now()\n        );\n        return new ResponseEntity&lt;&gt;(error, HttpStatus.NOT_FOUND);\n    }\n\n    @ExceptionHandler(MethodArgumentNotValidException.class)\n    public ResponseEntity&lt;ErrorResponse&gt; handleValidationExceptions(\n            MethodArgumentNotValidException ex) {\n        Map&lt;String, String&gt; errors = new HashMap&lt;&gt;();\n        ex.getBindingResult().getAllErrors().forEach(error -&gt; {\n            String fieldName = ((FieldError) error).getField();\n            String errorMessage = error.getDefaultMessage();\n            errors.put(fieldName, errorMessage);\n        });\n\n        ErrorResponse error = new ErrorResponse(\n            HttpStatus.BAD_REQUEST.value(),\n            \"Validation failed\",\n            LocalDateTime.now(),\n            errors\n        );\n        return new ResponseEntity&lt;&gt;(error, HttpStatus.BAD_REQUEST);\n    }\n\n    @ExceptionHandler(Exception.class)\n    public ResponseEntity&lt;ErrorResponse&gt; handleGlobalException(\n            Exception ex, WebRequest request) {\n        ErrorResponse error = new ErrorResponse(\n            HttpStatus.INTERNAL_SERVER_ERROR.value(),\n            \"An unexpected error occurred\",\n            LocalDateTime.now()\n        );\n        return new ResponseEntity&lt;&gt;(error, HttpStatus.INTERNAL_SERVER_ERROR);\n    }\n}\n\n@Data\n@AllArgsConstructor\npublic class ErrorResponse {\n    private int status;\n    private String message;\n    private LocalDateTime timestamp;\n    private Map&lt;String, String&gt; errors;\n\n    public ErrorResponse(int status, String message, LocalDateTime timestamp) {\n        this.status = status;\n        this.message = message;\n        this.timestamp = timestamp;\n        this.errors = new HashMap&lt;&gt;();\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-121\">\n<p>\u3053\u306e\u3088\u3046\u306a\u5b9f\u88c5\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u5229\u70b9\u304c\u5f97\u3089\u308c\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-122\">\n<p>1. <strong>\u5805\u7262\u6027<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-123\">\n<p>\u3000\u25cf \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-124\">\n<p>\u3000\u25cf \u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3\u7ba1\u7406<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-125\">\n<p>\u3000\u25cf \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-126\">\n<p>2. <strong>\u4fdd\u5b88\u6027<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-127\">\n<p>\u3000\u25cf \u30ec\u30a4\u30e4\u30fc\u5206\u96e2<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-128\">\n<p>\u3000\u25cf DTO\u30d1\u30bf\u30fc\u30f3<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-129\">\n<p>\u3000\u25cf \u5171\u901a\u30a8\u30e9\u30fc\u51e6\u7406<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-130\">\n<p>3. <strong>\u62e1\u5f35\u6027<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-131\">\n<p>\u3000\u25cf \u30e2\u30b8\u30e5\u30e9\u30fc\u8a2d\u8a08<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-132\">\n<p>\u3000\u25cf \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9\u5206\u96e2<\/p>\n<\/div>\n\n\n<p>\u3000\u25cf \u4f9d\u5b58\u6027\u6ce8\u5165<\/p>\n\n\n<div id=\"sgb-css-id-133\">\n<p>\u5b9f\u88c5\u6642\u306f\u3001\u3053\u308c\u3089\u306e\u57fa\u672c\u30d1\u30bf\u30fc\u30f3\u3092\u57fa\u306b\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u3066\u3044\u304f\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-134\">\n<h2 class=\"wp-block-heading\" id=\"i-38\">\uff14\uff0e7\u3064\u306e\u5b9f\u8df5\u7684\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-135\">\n<h3 class=\"wp-block-heading\" id=\"i-39\">4.1 \u9069\u5207\u306aHTTP\u30e1\u30bd\u30c3\u30c9\u3068\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u306e\u4f7f\u7528\u6cd5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-136\">\n<h4 class=\"wp-block-heading\" id=\"i-40\">HTTP\u30e1\u30bd\u30c3\u30c9\u306e\u9069\u5207\u306a\u4f7f\u7528<\/h4>\n<\/div>\n\n<div id=\"id-0fb392a0-f136-47d7-8f7f-bf782e307994\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30e1\u30bd\u30c3\u30c9<\/th><th>\u7528\u9014<\/th><th>\u7279\u5fb4<\/th><th>\u4f7f\u7528\u4f8b<\/th><\/tr><\/thead><tbody><tr><td>GET<\/td><td>\u30ea\u30bd\u30fc\u30b9\u306e\u53d6\u5f97<\/td><td>\u3079\u304d\u7b49\u6027\u3042\u308a<\/td><td>\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u53d6\u5f97<\/td><\/tr><tr><td>POST<\/td><td>\u30ea\u30bd\u30fc\u30b9\u306e\u4f5c\u6210<\/td><td>\u3079\u304d\u7b49\u6027\u306a\u3057<\/td><td>\u65b0\u898f\u30e6\u30fc\u30b6\u30fc\u306e\u4f5c\u6210<\/td><\/tr><tr><td>PUT<\/td><td>\u30ea\u30bd\u30fc\u30b9\u306e\u66f4\u65b0\uff08\u5168\u4f53\uff09<\/td><td>\u3079\u304d\u7b49\u6027\u3042\u308a<\/td><td>\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u5168\u66f4\u65b0<\/td><\/tr><tr><td>PATCH<\/td><td>\u30ea\u30bd\u30fc\u30b9\u306e\u66f4\u65b0\uff08\u90e8\u5206\uff09<\/td><td>\u3079\u304d\u7b49\u6027\u306a\u3057<\/td><td>\u30e6\u30fc\u30b6\u30fc\u60c5\u5831\u306e\u90e8\u5206\u66f4\u65b0<\/td><\/tr><tr><td>DELETE<\/td><td>\u30ea\u30bd\u30fc\u30b9\u306e\u524a\u9664<\/td><td>\u3079\u304d\u7b49\u6027\u3042\u308a<\/td><td>\u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@RestController\n@RequestMapping(\"\/api\/v1\/users\")\npublic class UserController {\n    \/\/ GET\u30e1\u30bd\u30c3\u30c9\uff08\u30ea\u30bd\u30fc\u30b9\u53d6\u5f97\uff09\n    @GetMapping(\"\/{id}\")\n    public ResponseEntity&lt;UserResponse&gt; getUser(@PathVariable Long id) {\n        return ResponseEntity.ok(userService.getUser(id));\n    }\n\n    \/\/ POST\u30e1\u30bd\u30c3\u30c9\uff08\u30ea\u30bd\u30fc\u30b9\u4f5c\u6210\uff09\n    @PostMapping\n    public ResponseEntity&lt;UserResponse&gt; createUser(@RequestBody UserRequest request) {\n        return new ResponseEntity&lt;&gt;(userService.createUser(request), HttpStatus.CREATED);\n    }\n\n    \/\/ PUT\u30e1\u30bd\u30c3\u30c9\uff08\u30ea\u30bd\u30fc\u30b9\u66f4\u65b0\uff09\n    @PutMapping(\"\/{id}\")\n    public ResponseEntity&lt;UserResponse&gt; updateUser(\n            @PathVariable Long id, \n            @RequestBody UserRequest request) {\n        return ResponseEntity.ok(userService.updateUser(id, request));\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-137\">\n<h4 class=\"wp-block-heading\" id=\"i-41\">\u30ec\u30b9\u30dd\u30f3\u30b9\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u306e\u30ac\u30a4\u30c9\u30e9\u30a4\u30f3<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@ControllerAdvice\npublic class ApiExceptionHandler {\n    \/\/ 200 OK: \u6b63\u5e38\u7d42\u4e86\n    @GetMapping\n    public ResponseEntity&lt;List&lt;User&gt;&gt; getAllUsers() {\n        return ResponseEntity.ok(userService.getAllUsers());\n    }\n\n    \/\/ 201 Created: \u30ea\u30bd\u30fc\u30b9\u4f5c\u6210\u6210\u529f\n    @PostMapping\n    public ResponseEntity&lt;User&gt; createUser(@RequestBody User user) {\n        return new ResponseEntity&lt;&gt;(userService.createUser(user), HttpStatus.CREATED);\n    }\n\n    \/\/ 400 Bad Request: \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30a8\u30e9\u30fc\n    @ExceptionHandler(MethodArgumentNotValidException.class)\n    public ResponseEntity&lt;ErrorResponse&gt; handleValidationErrors(MethodArgumentNotValidException ex) {\n        return new ResponseEntity&lt;&gt;(\n            new ErrorResponse(\"Validation failed\", ex.getBindingResult().getAllErrors()),\n            HttpStatus.BAD_REQUEST\n        );\n    }\n\n    \/\/ 404 Not Found: \u30ea\u30bd\u30fc\u30b9\u304c\u5b58\u5728\u3057\u306a\u3044\n    @ExceptionHandler(ResourceNotFoundException.class)\n    public ResponseEntity&lt;ErrorResponse&gt; handleNotFound(ResourceNotFoundException ex) {\n        return new ResponseEntity&lt;&gt;(\n            new ErrorResponse(ex.getMessage()),\n            HttpStatus.NOT_FOUND\n        );\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-138\">\n<h3 class=\"wp-block-heading\" id=\"i-42\">4.2 \u52b9\u7387\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u8a2d\u8a08\u3068URL\u8a2d\u8a08\u306e\u65b9\u6cd5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-139\">\n<h4 class=\"wp-block-heading\" id=\"i-43\">RESTful\u306aURL\u8a2d\u8a08\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-140\">\n<p>1. <strong>\u968e\u5c64\u7684\u306a\u30ea\u30bd\u30fc\u30b9\u69cb\u9020<\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/api\/v1\/departments\/{departmentId}\/employees\/{employeeId}\n\/api\/v1\/projects\/{projectId}\/tasks\/{taskId}<\/pre>\n\n\n<div id=\"sgb-css-id-141\">\n<p>2. <strong><strong>\u30af\u30a8\u30ea\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u9069\u5207\u306a\u4f7f\u7528<\/strong><\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@GetMapping(\"\/users\")\npublic ResponseEntity&lt;Page&lt;User&gt;&gt; getUsers(\n        @RequestParam(defaultValue = \"0\") int page,\n        @RequestParam(defaultValue = \"10\") int size,\n        @RequestParam(defaultValue = \"id\") String sortBy) {\n    return ResponseEntity.ok(userService.getUsers(PageRequest.of(page, size, Sort.by(sortBy))));\n}<\/pre>\n\n\n<div id=\"sgb-css-id-142\">\n<p>3. <strong><strong><strong>\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u3068\u30bd\u30fc\u30c8<\/strong><\/strong><\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@GetMapping(\"\/users\/search\")\npublic ResponseEntity&lt;List&lt;User&gt;&gt; searchUsers(\n        @RequestParam(required = false) String department,\n        @RequestParam(required = false) String role,\n        @RequestParam(defaultValue = \"name,asc\") String[] sort) {\n    return ResponseEntity.ok(userService.searchUsers(department, role, sort));\n}<\/pre>\n\n\n<div id=\"sgb-css-id-143\">\n<h3 class=\"wp-block-heading\" id=\"i-44\">4.3 \u30d0\u30fc\u30b8\u30e7\u30cb\u30f3\u30b0\u3068\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u5316\u306e\u91cd\u8981\u6027<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-144\">\n<h4 class=\"wp-block-heading\" id=\"i-45\">API\u30d0\u30fc\u30b8\u30e7\u30cb\u30f3\u30b0\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ URL\u30d9\u30fc\u30b9\u306e\u30d0\u30fc\u30b8\u30e7\u30cb\u30f3\u30b0\n@RestController\n@RequestMapping(\"\/api\/v2\/users\")  \/\/ \u65b0\u30d0\u30fc\u30b8\u30e7\u30f3\npublic class UserControllerV2 {\n    \/\/ V2\u306e\u5b9f\u88c5\n}\n\n\/\/ \u30ab\u30b9\u30bf\u30e0\u30d8\u30c3\u30c0\u30fc\u306b\u3088\u308b\u30d0\u30fc\u30b8\u30e7\u30cb\u30f3\u30b0\n@RestController\n@RequestMapping(\"\/api\/users\")\npublic class UserController {\n    @GetMapping(headers = \"API-Version=1\")\n    public ResponseEntity&lt;UserV1&gt; getUserV1(@PathVariable Long id) {\n        \/\/ V1\u306e\u5b9f\u88c5\n    }\n\n    @GetMapping(headers = \"API-Version=2\")\n    public ResponseEntity&lt;UserV2&gt; getUserV2(@PathVariable Long id) {\n        \/\/ V2\u306e\u5b9f\u88c5\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-145\">\n<h4 class=\"wp-block-heading\" id=\"i-46\">OpenAPI\uff08Swagger\uff09\u306b\u3088\u308b\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u5316<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Configuration\n@OpenAPIDefinition(\n    info = @Info(\n        title = \"User Management API\",\n        version = \"2.0\",\n        description = \"API for managing users in the system\"\n    )\n)\npublic class OpenApiConfig {\n    @Bean\n    public OpenAPI customOpenAPI() {\n        return new OpenAPI()\n            .components(new Components())\n            .info(new Info()\n                .title(\"User Management API\")\n                .version(\"2.0\")\n                .description(\"REST API documentation\")\n            );\n    }\n}\n\n@Operation(summary = \"Create new user\")\n@ApiResponses(value = {\n    @ApiResponse(responseCode = \"201\", description = \"User created successfully\"),\n    @ApiResponse(responseCode = \"400\", description = \"Invalid input\"),\n    @ApiResponse(responseCode = \"409\", description = \"User already exists\")\n})\n@PostMapping\npublic ResponseEntity&lt;UserResponse&gt; createUser(@RequestBody UserRequest request) {\n    \/\/ \u5b9f\u88c5\n}<\/pre>\n\n\n<div id=\"sgb-css-id-146\">\n<h3 class=\"wp-block-heading\" id=\"i-47\">4.4 \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-147\">\n<h4 class=\"wp-block-heading\" id=\"i-48\">Spring Security\u3092\u4f7f\u7528\u3057\u305f\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Configuration\n@EnableWebSecurity\npublic class SecurityConfig {\n    @Bean\n    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n        http\n            .csrf().disable()\n            .authorizeRequests()\n                .antMatchers(\"\/api\/v1\/public\/**\").permitAll()\n                .antMatchers(\"\/api\/v1\/admin\/**\").hasRole(\"ADMIN\")\n                .anyRequest().authenticated()\n            .and()\n            .oauth2ResourceServer()\n                .jwt();\n\n        return http.build();\n    }\n\n    @Bean\n    public PasswordEncoder passwordEncoder() {\n        return new BCryptPasswordEncoder();\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-148\">\n<h4 class=\"wp-block-heading\" id=\"i-49\">JWT\u3092\u4f7f\u7528\u3057\u305f\u8a8d\u8a3c\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Service\n@Slf4j\npublic class JwtTokenProvider {\n    @Value(\"${jwt.secret}\")\n    private String jwtSecret;\n\n    @Value(\"${jwt.expiration}\")\n    private int jwtExpiration;\n\n    public String generateToken(UserDetails userDetails) {\n        Map&lt;String, Object&gt; claims = new HashMap&lt;&gt;();\n        claims.put(\"roles\", userDetails.getAuthorities().stream()\n                .map(GrantedAuthority::getAuthority)\n                .collect(Collectors.toList()));\n\n        return Jwts.builder()\n                .setClaims(claims)\n                .setSubject(userDetails.getUsername())\n                .setIssuedAt(new Date())\n                .setExpiration(new Date(System.currentTimeMillis() + jwtExpiration))\n                .signWith(SignatureAlgorithm.HS512, jwtSecret)\n                .compact();\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-149\">\n<h4 class=\"wp-block-heading\" id=\"i-50\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30d8\u30c3\u30c0\u30fc\u306e\u8a2d\u5b9a<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Configuration\npublic class WebSecurityConfig {\n    @Bean\n    public WebSecurityCustomizer webSecurityCustomizer() {\n        return web -&gt; web.httpFirewall(allowUrlEncodedSlashHttpFirewall());\n    }\n\n    @Bean\n    public HttpFirewall allowUrlEncodedSlashHttpFirewall() {\n        StrictHttpFirewall firewall = new StrictHttpFirewall();\n        firewall.setAllowUrlEncodedSlash(true);\n        return firewall;\n    }\n\n    @Bean\n    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n        http\n            .headers()\n                .xssProtection()\n                .and()\n                .contentSecurityPolicy(\"default-src 'self'\")\n                .and()\n                .frameOptions()\n                .deny()\n                .and()\n                .httpStrictTransportSecurity()\n                .includeSubDomains(true)\n                .maxAgeInSeconds(31536000);\n\n        return http.build();\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-150\">\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30bb\u30ad\u30e5\u30a2\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044RESTful API\u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-151\">\n<h2 class=\"wp-block-heading\" id=\"i-51\">\uff15\uff0eRESTful API\u306e\u30c6\u30b9\u30c8\u3068\u54c1\u8cea\u4fdd\u8a3c<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-152\">\n<h3 class=\"wp-block-heading\" id=\"i-52\">5.1 \u5358\u4f53\u30c6\u30b9\u30c8\u3068\u7d71\u5408\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-153\">\n<h4 class=\"wp-block-heading\" id=\"i-53\">\u5358\u4f53\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@ExtendWith(MockitoExtension.class)\nclass UserServiceTest {\n    @Mock\n    private UserRepository userRepository;\n\n    @InjectMocks\n    private UserService userService;\n\n    @Test\n    void createUser_WithValidData_ShouldReturnCreatedUser() {\n        \/\/ Given\n        User user = new User();\n        user.setName(\"John Doe\");\n        user.setEmail(\"john@example.com\");\n\n        when(userRepository.save(any(User.class))).thenReturn(user);\n\n        \/\/ When\n        User createdUser = userService.createUser(user);\n\n        \/\/ Then\n        assertNotNull(createdUser);\n        assertEquals(\"John Doe\", createdUser.getName());\n        assertEquals(\"john@example.com\", createdUser.getEmail());\n        verify(userRepository, times(1)).save(any(User.class));\n    }\n\n    @Test\n    void getUserById_WithNonExistingId_ShouldThrowException() {\n        \/\/ Given\n        Long userId = 1L;\n        when(userRepository.findById(userId)).thenReturn(Optional.empty());\n\n        \/\/ When &amp; Then\n        assertThrows(ResourceNotFoundException.class, \n            () -&gt; userService.getUserById(userId));\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-154\">\n<h4 class=\"wp-block-heading\" id=\"i-54\">\u7d71\u5408\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)\n@AutoConfigureMockMvc\n@TestInstance(TestInstance.Lifecycle.PER_CLASS)\nclass UserControllerIntegrationTest {\n    @Autowired\n    private MockMvc mockMvc;\n\n    @Autowired\n    private ObjectMapper objectMapper;\n\n    @Autowired\n    private UserRepository userRepository;\n\n    @BeforeEach\n    void setUp() {\n        userRepository.deleteAll();\n    }\n\n    @Test\n    void createUser_WithValidData_ShouldReturnCreatedUser() throws Exception {\n        \/\/ Given\n        UserDTO.CreateRequest request = new UserDTO.CreateRequest();\n        request.setName(\"John Doe\");\n        request.setEmail(\"john@example.com\");\n        request.setDepartment(\"IT\");\n\n        \/\/ When &amp; Then\n        mockMvc.perform(post(\"\/api\/v1\/users\")\n                .contentType(MediaType.APPLICATION_JSON)\n                .content(objectMapper.writeValueAsString(request)))\n            .andExpect(status().isCreated())\n            .andExpect(jsonPath(\"$.name\").value(\"John Doe\"))\n            .andExpect(jsonPath(\"$.email\").value(\"john@example.com\"))\n            .andExpect(jsonPath(\"$.department\").value(\"IT\"))\n            .andDo(print());\n    }\n\n    @Test\n    void getAllUsers_ShouldReturnUsersList() throws Exception {\n        \/\/ Given\n        createTestUser(\"John Doe\", \"john@example.com\", \"IT\");\n        createTestUser(\"Jane Doe\", \"jane@example.com\", \"HR\");\n\n        \/\/ When &amp; Then\n        mockMvc.perform(get(\"\/api\/v1\/users\")\n                .contentType(MediaType.APPLICATION_JSON))\n            .andExpect(status().isOk())\n            .andExpect(jsonPath(\"$\", hasSize(2)))\n            .andExpect(jsonPath(\"$[0].name\").value(\"John Doe\"))\n            .andExpect(jsonPath(\"$[1].name\").value(\"Jane Doe\"))\n            .andDo(print());\n    }\n\n    private void createTestUser(String name, String email, String department) {\n        User user = new User();\n        user.setName(name);\n        user.setEmail(email);\n        user.setDepartment(department);\n        userRepository.save(user);\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-155\">\n<h3 class=\"wp-block-heading\" id=\"i-55\">5.2 \u8ca0\u8377\u30c6\u30b9\u30c8\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u624b\u9806<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-156\">\n<h4 class=\"wp-block-heading\" id=\"i-56\">JMeter\u3092\u4f7f\u7528\u3057\u305f\u8ca0\u8377\u30c6\u30b9\u30c8\u8a2d\u5b9a<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;jmeterTestPlan version=\"1.2\" properties=\"5.0\"&gt;\n  &lt;hashTree&gt;\n    &lt;TestPlan guiclass=\"TestPlanGui\" testclass=\"TestPlan\" testname=\"User API Load Test\"&gt;\n      &lt;elementProp name=\"TestPlan.user_defined_variables\" elementType=\"Arguments\"&gt;\n        &lt;collectionProp name=\"Arguments.arguments\"\/&gt;\n      &lt;\/elementProp&gt;\n      &lt;stringProp name=\"TestPlan.comments\"&gt;&lt;\/stringProp&gt;\n      &lt;boolProp name=\"TestPlan.functional_mode\"&gt;false&lt;\/boolProp&gt;\n      &lt;boolProp name=\"TestPlan.serialize_threadgroups\"&gt;false&lt;\/boolProp&gt;\n      &lt;stringProp name=\"TestPlan.user_define_classpath\"&gt;&lt;\/stringProp&gt;\n    &lt;\/TestPlan&gt;\n    &lt;hashTree&gt;\n      &lt;ThreadGroup guiclass=\"ThreadGroupGui\" testclass=\"ThreadGroup\" testname=\"User API Thread Group\"&gt;\n        &lt;elementProp name=\"ThreadGroup.main_controller\" elementType=\"LoopController\"&gt;\n          &lt;boolProp name=\"LoopController.continue_forever\"&gt;false&lt;\/boolProp&gt;\n          &lt;intProp name=\"LoopController.loops\"&gt;100&lt;\/intProp&gt;\n        &lt;\/elementProp&gt;\n        &lt;stringProp name=\"ThreadGroup.num_threads\"&gt;50&lt;\/stringProp&gt;\n        &lt;stringProp name=\"ThreadGroup.ramp_time\"&gt;10&lt;\/stringProp&gt;\n        &lt;longProp name=\"ThreadGroup.start_time\"&gt;1373789594000&lt;\/longProp&gt;\n        &lt;longProp name=\"ThreadGroup.end_time\"&gt;1373789594000&lt;\/longProp&gt;\n        &lt;boolProp name=\"ThreadGroup.scheduler\"&gt;false&lt;\/boolProp&gt;\n        &lt;stringProp name=\"ThreadGroup.duration\"&gt;&lt;\/stringProp&gt;\n        &lt;stringProp name=\"ThreadGroup.delay\"&gt;&lt;\/stringProp&gt;\n      &lt;\/ThreadGroup&gt;\n    &lt;\/hashTree&gt;\n  &lt;\/hashTree&gt;\n&lt;\/jmeterTestPlan&gt;<\/pre>\n\n\n<div id=\"sgb-css-id-157\">\n<h4 class=\"wp-block-heading\" id=\"i-57\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-158\">\n<p>\u30001. <strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u5b9f\u88c5<\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Configuration\n@EnableCaching\npublic class CacheConfig {\n    @Bean\n    public CacheManager cacheManager() {\n        SimpleCacheManager cacheManager = new SimpleCacheManager();\n        cacheManager.setCaches(Arrays.asList(\n            new ConcurrentMapCache(\"users\"),\n            new ConcurrentMapCache(\"departments\")\n        ));\n        return cacheManager;\n    }\n}\n\n@Service\npublic class UserService {\n    @Cacheable(value = \"users\", key = \"#id\")\n    public User getUserById(Long id) {\n        return userRepository.findById(id)\n            .orElseThrow(() -&gt; new ResourceNotFoundException(\"User not found\"));\n    }\n\n    @CacheEvict(value = \"users\", key = \"#id\")\n    public void deleteUser(Long id) {\n        userRepository.deleteById(id);\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-159\">\n<p>\u30002. <strong><strong>\u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u306e\u6700\u9069\u5316<\/strong><\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@GetMapping(\"\/users\")\npublic ResponseEntity&lt;Page&lt;UserDTO&gt;&gt; getUsers(\n        @RequestParam(defaultValue = \"0\") int page,\n        @RequestParam(defaultValue = \"20\") int size) {\n    Pageable pageable = PageRequest.of(page, size, Sort.by(\"id\").descending());\n    return ResponseEntity.ok(userService.getUsers(pageable));\n}<\/pre>\n\n\n<div id=\"sgb-css-id-160\">\n<p>\u30003. <strong><strong><strong>N+1\u554f\u984c\u306e\u89e3\u6c7a<\/strong><\/strong><\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Repository\npublic interface UserRepository extends JpaRepository&lt;User, Long&gt; {\n    @EntityGraph(attributePaths = {\"department\", \"roles\"})\n    Optional&lt;User&gt; findById(Long id);\n\n    @Query(\"SELECT u FROM User u LEFT JOIN FETCH u.department LEFT JOIN FETCH u.roles\")\n    List&lt;User&gt; findAllWithDepartmentAndRoles();\n}<\/pre>\n\n\n<div id=\"sgb-css-id-161\">\n<h4 class=\"wp-block-heading\" id=\"i-58\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-162\">\n<p>\u30001. <strong><strong><strong><strong>Actuator\u306e\u8a2d\u5b9a<\/strong><\/strong><\/strong><\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># application.properties\nmanagement.endpoints.web.exposure.include=health,metrics,prometheus\nmanagement.endpoint.health.show-details=always<\/pre>\n\n\n<div id=\"sgb-css-id-163\">\n<p>\u30002. <strong><strong><strong><strong>\u30ab\u30b9\u30bf\u30e0\u30e1\u30c8\u30ea\u30af\u30b9\u306e\u5b9f\u88c5<\/strong><\/strong><\/strong><\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Component\n@Slf4j\npublic class ApiMetrics {\n    private final MeterRegistry registry;\n\n    public ApiMetrics(MeterRegistry registry) {\n        this.registry = registry;\n    }\n\n    @Around(\"execution(* com.example.demo.controller.*.*(..))\")\n    public Object measureMethodExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {\n        long start = System.currentTimeMillis();\n        Object result = joinPoint.proceed();\n        long executionTime = System.currentTimeMillis() - start;\n\n        Timer.builder(\"api.execution.time\")\n            .tag(\"method\", joinPoint.getSignature().getName())\n            .register(registry)\n            .record(executionTime, TimeUnit.MILLISECONDS);\n\n        return result;\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-164\">\n<h4 class=\"wp-block-heading\" id=\"i-59\">\u30c6\u30b9\u30c8\u81ea\u52d5\u5316\u306e\u305f\u3081\u306eCI\/CD\u8a2d\u5b9a<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># .github\/workflows\/api-tests.yml\nname: API Tests\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n    branches: [ main ]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions\/checkout@v2\n\n    - name: Set up JDK\n      uses: actions\/setup-java@v2\n      with:\n        java-version: '17'\n        distribution: 'adopt'\n\n    - name: Run Tests\n      run: .\/mvnw test\n\n    - name: Generate Test Report\n      run: .\/mvnw jacoco:report\n\n    - name: Upload Test Report\n      uses: actions\/upload-artifact@v2\n      with:\n        name: test-report\n        path: target\/site\/jacoco\/<\/pre>\n\n\n<div id=\"sgb-css-id-165\">\n<p>\u3053\u308c\u3089\u306e\u30c6\u30b9\u30c8\u3068\u54c1\u8cea\u4fdd\u8a3c\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u4ee5\u4e0b\u306e\u5229\u70b9\u304c\u5f97\u3089\u308c\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-166\">\n<p>\u30001. <strong>\u54c1\u8cea\u306e\u78ba\u4fdd<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-167\">\n<p>\u3000\u3000\u25cf \u30d0\u30b0\u306e\u65e9\u671f\u767a\u898b<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-168\">\n<p>\u3000\u3000\u25cf \u56de\u5e30\u30c6\u30b9\u30c8\u306e\u81ea\u52d5\u5316<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-169\">\n<p>\u3000\u3000\u25cf \u30b3\u30fc\u30c9\u306e\u54c1\u8cea\u7dad\u6301<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-170\">\n<p>\u30002. <strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u6700\u9069\u5316<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-171\">\n<p>\u3000\u3000\u25cf \u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u306e\u7279\u5b9a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-172\">\n<p>\u3000\u3000\u25cf \u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u306e\u5411\u4e0a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-173\">\n<p>\u3000\u3000\u25cf \u30ec\u30b9\u30dd\u30f3\u30b9\u6642\u9593\u306e\u6539\u5584<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-174\">\n<p>\u30003. <strong>\u4fdd\u5b88\u6027\u306e\u5411\u4e0a<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-175\">\n<p>\u3000\u3000\u25cf \u30c6\u30b9\u30c8\u30ab\u30d0\u30ec\u30c3\u30b8\u306e\u7dad\u6301<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-176\">\n<p>\u3000\u3000\u25cf \u7d99\u7d9a\u7684\u306a\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-177\">\n<p>\u3000\u3000\u25cf \u65e9\u671f\u306e\u554f\u984c\u691c\u51fa<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-178\">\n<h2 class=\"wp-block-heading\" id=\"i-60\">\uff16\uff0e\u5b9f\u904b\u7528\u3092\u898b\u636e\u3048\u305f\u767a\u5c55\u7684\u306a\u30c8\u30d4\u30c3\u30af<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-179\">\n<h3 class=\"wp-block-heading\" id=\"i-61\">6.1 \u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u3092\u8003\u616e\u3057\u305f\u8a2d\u8a08\u624b\u6cd5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-180\">\n<h4 class=\"wp-block-heading\" id=\"i-62\">\u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306e\u63a1\u7528<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@SpringBootApplication\n@EnableDiscoveryClient\npublic class UserServiceApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(UserServiceApplication.class, args);\n    }\n}\n\n\/\/ \u30b5\u30fc\u30d3\u30b9\u30c7\u30a3\u30b9\u30ab\u30d0\u30ea\u306e\u8a2d\u5b9a\n@Configuration\npublic class ServiceConfig {\n    @Bean\n    @LoadBalanced\n    public RestTemplate restTemplate() {\n        return new RestTemplate();\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-181\">\n<h4 class=\"wp-block-heading\" id=\"i-63\">\u975e\u540c\u671f\u51e6\u7406\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Service\n@Slf4j\npublic class AsyncUserService {\n    private final UserRepository userRepository;\n    private final NotificationService notificationService;\n\n    @Async\n    public CompletableFuture&lt;User&gt; registerUserAsync(UserDTO userDTO) {\n        return CompletableFuture.supplyAsync(() -&gt; {\n            User user = new User();\n            BeanUtils.copyProperties(userDTO, user);\n            User savedUser = userRepository.save(user);\n\n            \/\/ \u975e\u540c\u671f\u3067\u901a\u77e5\u3092\u9001\u4fe1\n            notificationService.sendWelcomeEmail(savedUser);\n\n            return savedUser;\n        });\n    }\n\n    @Async\n    public CompletableFuture&lt;List&lt;User&gt;&gt; processUsersInBatch(List&lt;UserDTO&gt; userDTOs) {\n        return CompletableFuture.supplyAsync(() -&gt; \n            userDTOs.parallelStream()\n                    .map(this::convertAndSave)\n                    .collect(Collectors.toList())\n        );\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-182\">\n<h4 class=\"wp-block-heading\" id=\"i-64\">\u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Configuration\n@EnableCaching\npublic class RedisCacheConfig {\n    @Bean\n    public RedisCacheConfiguration cacheConfiguration() {\n        return RedisCacheConfiguration.defaultCacheConfig()\n            .entryTtl(Duration.ofMinutes(60))\n            .disableCachingNullValues()\n            .serializeKeysWith(RedisSerializationContext.SerializationPair\n                .fromSerializer(new StringRedisSerializer()))\n            .serializeValuesWith(RedisSerializationContext.SerializationPair\n                .fromSerializer(new GenericJackson2JsonRedisSerializer()));\n    }\n\n    @Bean\n    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {\n        return RedisCacheManager.builder(connectionFactory)\n            .cacheDefaults(cacheConfiguration())\n            .build();\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-183\">\n<h3 class=\"wp-block-heading\" id=\"i-65\">6.2 \u76e3\u8996\u3068\u30ed\u30b0\u7ba1\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-184\">\n<h4 class=\"wp-block-heading\" id=\"i-66\">\u96c6\u4e2d\u30ed\u30b0\u7ba1\u7406\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Configuration\n@EnableAsync\npublic class LoggingConfig {\n    @Bean\n    public LogstashTcpSocketAppender logstashAppender() {\n        LogstashTcpSocketAppender appender = new LogstashTcpSocketAppender();\n        appender.addDestination(\"logstash:5000\");\n\n        LogstashEncoder encoder = new LogstashEncoder();\n        encoder.setCustomFields(\"{\\\"app\\\":\\\"user-service\\\"}\");\n        appender.setEncoder(encoder);\n\n        return appender;\n    }\n}\n\n@Aspect\n@Component\n@Slf4j\npublic class LoggingAspect {\n    @Around(\"execution(* com.example.demo.controller.*.*(..))\")\n    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {\n        long startTime = System.currentTimeMillis();\n        String className = joinPoint.getSignature().getDeclaringTypeName();\n        String methodName = joinPoint.getSignature().getName();\n\n        MDC.put(\"class\", className);\n        MDC.put(\"method\", methodName);\n\n        try {\n            log.info(\"Entering method: {}.{}\", className, methodName);\n            Object result = joinPoint.proceed();\n            log.info(\"Exiting method: {}.{} took {}ms\", \n                className, methodName, System.currentTimeMillis() - startTime);\n            return result;\n        } catch (Exception e) {\n            log.error(\"Exception in {}.{}: {}\", \n                className, methodName, e.getMessage(), e);\n            throw e;\n        } finally {\n            MDC.clear();\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-185\">\n<h4 class=\"wp-block-heading\" id=\"i-67\">\u30e1\u30c8\u30ea\u30af\u30b9\u53ce\u96c6\u3068\u76e3\u8996<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Configuration\npublic class MetricsConfig {\n    @Bean\n    MeterRegistryCustomizer&lt;MeterRegistry&gt; metricsCommonTags() {\n        return registry -&gt; registry.config()\n            .commonTags(\"application\", \"user-service\");\n    }\n}\n\n@Component\npublic class CustomMetrics {\n    private final MeterRegistry registry;\n    private final Counter userCreationCounter;\n    private final Timer apiResponseTimer;\n\n    public CustomMetrics(MeterRegistry registry) {\n        this.registry = registry;\n        this.userCreationCounter = Counter.builder(\"api.user.creation\")\n            .description(\"Number of users created\")\n            .register(registry);\n        this.apiResponseTimer = Timer.builder(\"api.response.time\")\n            .description(\"API response time\")\n            .register(registry);\n    }\n\n    public void recordUserCreation() {\n        userCreationCounter.increment();\n    }\n\n    public Timer.Sample startTimer() {\n        return Timer.start(registry);\n    }\n\n    public void stopTimer(Timer.Sample sample) {\n        sample.stop(apiResponseTimer);\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-186\">\n<h4 class=\"wp-block-heading\" id=\"i-68\">\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u88c5<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Component\npublic class CustomHealthIndicator implements HealthIndicator {\n    private final DataSource dataSource;\n    private final RedisConnectionFactory redisConnectionFactory;\n\n    public CustomHealthIndicator(\n            DataSource dataSource,\n            RedisConnectionFactory redisConnectionFactory) {\n        this.dataSource = dataSource;\n        this.redisConnectionFactory = redisConnectionFactory;\n    }\n\n    @Override\n    public Health health() {\n        Health.Builder builder = new Health.Builder();\n\n        try {\n            checkDatabase(builder);\n            checkRedis(builder);\n            return builder.status(Status.UP).build();\n        } catch (Exception e) {\n            return builder.status(Status.DOWN)\n                .withException(e)\n                .build();\n        }\n    }\n\n    private void checkDatabase(Health.Builder builder) {\n        try (Connection conn = dataSource.getConnection()) {\n            builder.withDetail(\"database\", \"UP\");\n        } catch (SQLException e) {\n            builder.withDetail(\"database\", \"DOWN\")\n                .withException(e);\n        }\n    }\n\n    private void checkRedis(Health.Builder builder) {\n        try {\n            RedisConnection conn = redisConnectionFactory.getConnection();\n            conn.close();\n            builder.withDetail(\"redis\", \"UP\");\n        } catch (Exception e) {\n            builder.withDetail(\"redis\", \"DOWN\")\n                .withException(e);\n        }\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-187\">\n<h4 class=\"wp-block-heading\" id=\"i-69\">\u904b\u7528\u76e3\u8996\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306e\u8a2d\u5b9a\uff08Grafana\u8a2d\u5b9a\u4f8b\uff09<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">apiVersion: 1\n\ndatasources:\n  - name: Prometheus\n    type: prometheus\n    access: proxy\n    url: http:\/\/prometheus:9090\n    isDefault: true\n\ndashboards:\n  - name: API Metrics\n    panels:\n      - title: Response Time\n        type: graph\n        datasource: Prometheus\n        targets:\n          - expr: rate(api_response_time_seconds_count[5m])\n\n      - title: Error Rate\n        type: graph\n        datasource: Prometheus\n        targets:\n          - expr: sum(rate(http_server_requests_seconds_count{status=~\"5..\"}[5m]))\n\n      - title: Active Users\n        type: gauge\n        datasource: Prometheus\n        targets:\n          - expr: sum(api_active_users)<\/pre>\n\n\n<div id=\"sgb-css-id-188\">\n<p><strong>\u5b9f\u904b\u7528\u306b\u304a\u3051\u308b\u4e3b\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-189\">\n<p>\u30001. <strong>\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u5bfe\u7b56<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-190\">\n<p>\u3000\u3000\u25cf \u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3\u306e\u63a1\u7528<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-191\">\n<p>\u3000\u3000\u25cf \u975e\u540c\u671f\u51e6\u7406\u306e\u6d3b\u7528<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-192\">\n<p>\u3000\u3000\u25cf \u30ad\u30e3\u30c3\u30b7\u30e5\u6226\u7565\u306e\u6700\u9069\u5316<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-193\">\n<p>\u30002. <strong>\u76e3\u8996\u4f53\u5236\u306e\u78ba\u7acb<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-194\">\n<p>\u3000\u3000\u25cf \u96c6\u4e2d\u30ed\u30b0\u7ba1\u7406<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-195\">\n<p>\u3000\u3000\u25cf \u30e1\u30c8\u30ea\u30af\u30b9\u53ce\u96c6<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-196\">\n<p>\u3000\u3000\u25cf \u30a2\u30e9\u30fc\u30c8\u8a2d\u5b9a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-197\">\n<p>\u30003. <strong><strong>\u904b\u7528\u52b9\u7387\u306e\u5411\u4e0a<\/strong><\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-198\">\n<p>\u3000\u3000\u25cf \u81ea\u52d5\u5316\u306e\u63a8\u9032<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-199\">\n<p>\u3000\u3000\u25cf \u969c\u5bb3\u691c\u77e5\u306e\u8fc5\u901f\u5316<\/p>\n<\/div>\n\n\n<p>\u3000\u3000\u25cf \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/p>\n\n\n<div id=\"sgb-css-id-200\">\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u672c\u756a\u74b0\u5883\u3067\u306e\u5b89\u5b9a\u3057\u305f\u904b\u7528\u304c\u53ef\u80fd\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-201\">\n<h2 class=\"wp-block-heading\" id=\"i-70\">\uff17\uff0e\u307e\u3068\u3081\uff1a\u9ad8\u54c1\u8cea\u306aRESTful API\u958b\u767a\u306e\u305f\u3081\u306b<\/h2>\n<\/div>\n\n<div id=\"sgb-css-id-202\">\n<h3 class=\"wp-block-heading\" id=\"i-71\">7.1 \u5b9f\u88c5\u6642\u306e\u91cd\u8981\u30dd\u30a4\u30f3\u30c8\u30c1\u30a7\u30c3\u30af\u30ea\u30b9\u30c8<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-203\">\n<h4 class=\"wp-block-heading\" id=\"i-72\">\u8a2d\u8a08\u30d5\u30a7\u30fc\u30ba\u306e\u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8<\/h4>\n<\/div>\n\n<div id=\"id-f9859f85-d10d-4dea-a58c-13523fd42803\"><div id=\"sgb-css-id-204\">\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u30ab\u30c6\u30b4\u30ea<\/th><th>\u30c1\u30a7\u30c3\u30af\u9805\u76ee<\/th><th>\u91cd\u8981\u5ea6<\/th><\/tr><\/thead><tbody><tr><td><strong>API\u8a2d\u8a08<\/strong><\/td><td><\/td><td><\/td><\/tr><tr><td>\u2713 RESTful\u539f\u5247\u306e\u9075\u5b88<\/td><td>URI\u306f\u540d\u8a5e\u30d9\u30fc\u30b9\u3067\u8a2d\u8a08\u3055\u308c\u3066\u3044\u308b\u304b<\/td><td>\u9ad8<\/td><\/tr><tr><td>\u2713 \u30d0\u30fc\u30b8\u30e7\u30cb\u30f3\u30b0<\/td><td>API\u30d0\u30fc\u30b8\u30e7\u30cb\u30f3\u30b0\u6226\u7565\u304c\u6c7a\u5b9a\u3055\u308c\u3066\u3044\u308b\u304b<\/td><td>\u9ad8<\/td><\/tr><tr><td>\u2713 \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/td><td>\u8a8d\u8a3c\u30fb\u8a8d\u53ef\u65b9\u5f0f\u304c\u9069\u5207\u306b\u9078\u629e\u3055\u308c\u3066\u3044\u308b\u304b<\/td><td>\u9ad8<\/td><\/tr><tr><td><strong>\u30c7\u30fc\u30bf\u30e2\u30c7\u30eb<\/strong><\/td><td><\/td><td><\/td><\/tr><tr><td>\u2713 \u30a8\u30f3\u30c6\u30a3\u30c6\u30a3\u8a2d\u8a08<\/td><td>\u9069\u5207\u306a\u30ea\u30ec\u30fc\u30b7\u30e7\u30f3\u30b7\u30c3\u30d7\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u308b\u304b<\/td><td>\u4e2d<\/td><\/tr><tr><td>\u2713 \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/td><td>\u5165\u529b\u5024\u306e\u691c\u8a3c\u30eb\u30fc\u30eb\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u308b\u304b<\/td><td>\u9ad8<\/td><\/tr><tr><td>\u2713 DTO\u306e\u4f7f\u7528<\/td><td>\u30ec\u30a4\u30e4\u30fc\u9593\u306e\u30c7\u30fc\u30bf\u8ee2\u9001\u304c\u6700\u9069\u5316\u3055\u308c\u3066\u3044\u308b\u304b<\/td><td>\u4e2d<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n\n<div id=\"sgb-css-id-205\">\n<h4 class=\"wp-block-heading\" id=\"i-73\">\u5b9f\u88c5\u30d5\u30a7\u30fc\u30ba\u306e\u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8<\/h4>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5b9f\u88c5\u6642\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u4f8b\npublic class ApiImplementationChecklist {\n    \/*\n     * 1. \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n     * - \u30b0\u30ed\u30fc\u30d0\u30eb\u306a\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u5b9f\u88c5\n     * - \u9069\u5207\u306aHTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u306e\u4f7f\u7528\n     * - \u30a8\u30e9\u30fc\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u6a19\u6e96\u5316\n     *\/\n    @ExceptionHandler(Exception.class)\n    public ResponseEntity&lt;ErrorResponse&gt; handleException(Exception ex) {\n        \/\/ \u5b9f\u88c5\u4f8b\n    }\n\n    \/*\n     * 2. \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\n     * - \u5165\u529b\u5024\u306e\u30b5\u30cb\u30bf\u30a4\u30ba\n     * - JWT\u30c8\u30fc\u30af\u30f3\u306e\u691c\u8a3c\n     * - CORS\u8a2d\u5b9a\n     *\/\n    @Bean\n    public SecurityFilterChain filterChain(HttpSecurity http) {\n        \/\/ \u5b9f\u88c5\u4f8b\n    }\n\n    \/*\n     * 3. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\n     * - \u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u9069\u7528\n     * - N+1\u554f\u984c\u306e\u89e3\u6c7a\n     * - \u30da\u30fc\u30b8\u30cd\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u88c5\n     *\/\n    @Cacheable(value = \"users\")\n    public List&lt;User&gt; getUsers() {\n        \/\/ \u5b9f\u88c5\u4f8b\n    }\n}<\/pre>\n\n\n<div id=\"sgb-css-id-210\">\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u30c6\u30b9\u30c8\u30d5\u30a7\u30fc\u30ba\u306e\u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\"><div id=\"sgb-css-id-206\">\n<p>\u2713 \u5358\u4f53\u30c6\u30b9\u30c8\u306e\u30ab\u30d0\u30ec\u30c3\u30b8\u304c80%\u4ee5\u4e0a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-207\">\n<p>\u2713 \u7d71\u5408\u30c6\u30b9\u30c8\u304c\u4e3b\u8981\u30d5\u30ed\u30fc\u3092\u30ab\u30d0\u30fc<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-208\">\n<p>\u2713 \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c6\u30b9\u30c8\u306e\u5b9f\u65bd<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-209\">\n<p>\u2713 \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30c6\u30b9\u30c8\u306e\u5b8c\u4e86<\/p>\n<\/div><\/div><\/div>\n<\/div>\n\n<div id=\"sgb-css-id-215\">\n<div class=\"wp-block-sgb-block-simple sgb-box-simple sgb-box-simple--title-normal sgb-box-simple--with-border\"><div style=\"background-color:var(--wp--preset--color--sango-main);color:#FFF\" class=\"sgb-box-simple__title\">\u30c7\u30d7\u30ed\u30a4\u30e1\u30f3\u30c8\u30d5\u30a7\u30fc\u30ba\u306e\u30c1\u30a7\u30c3\u30af\u30dd\u30a4\u30f3\u30c8<\/div><div class=\"sgb-box-simple__body\" style=\"border-color:var(--wp--preset--color--sango-main);background-color:#FFF\"><div id=\"sgb-css-id-211\">\n<p>\u2713 CI\/CD\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u69cb\u7bc9<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-212\">\n<p>\u2713 \u76e3\u8996\u30fb\u30ed\u30ae\u30f3\u30b0\u4f53\u5236\u306e\u78ba\u7acb<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-213\">\n<p>\u2713 \u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u6226\u7565\u306e\u6c7a\u5b9a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-214\">\n<p>\u2713 \u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30fb\u30ea\u30b9\u30c8\u30a2\u624b\u9806\u306e\u6574\u5099<\/p>\n<\/div><\/div><\/div>\n<\/div>\n\n<div id=\"sgb-css-id-216\">\n<h3 class=\"wp-block-heading\" id=\"i-74\">7.2 \u3055\u3089\u306a\u308b\u5b66\u7fd2\u306e\u305f\u3081\u306e\u30ea\u30bd\u30fc\u30b9\u7d39\u4ecb<\/h3>\n<\/div>\n\n<div id=\"sgb-css-id-217\">\n<h4 class=\"wp-block-heading\" id=\"i-75\">\u6280\u8853\u66f8\u30fb\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-218\">\n<p>\u30001. <strong>\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-219\">\n<p>\u3000\u3000\u25cf Spring Framework Documentation<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-220\">\n<p>\u3000\u3000\u25cf Spring Boot Reference Documentation<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-221\">\n<p>\u3000\u3000\u25cf Spring Security Reference<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-222\">\n<p id=\"block-3e7a6585-5301-4c5f-a99e-c8561e28c2c2\">\u30002. <strong><strong>\u63a8\u5968\u66f8\u7c4d<\/strong><\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-223\">\n<p id=\"block-96eb98e0-c1e0-4ca2-a257-ff62bf33a3a2\">\u3000\u3000\u25cf \u300eRESTful Web APIs\u300f by Leonard Richardson<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-224\">\n<p id=\"block-b162053c-3d27-419d-aa09-dada4b607f21\">\u3000\u3000\u25cf \u300eClean Architecture\u300f by Robert C. Martin<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-225\">\n<p id=\"block-286d41b2-ef61-4f08-92f9-26977ec8238a\">\u3000\u3000\u25cf \u300eSpring Boot\u5b9f\u8df5\u5165\u9580\u300f<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-226\">\n<h4 class=\"wp-block-heading\" id=\"i-76\">\u30aa\u30f3\u30e9\u30a4\u30f3\u30ea\u30bd\u30fc\u30b9<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-227\">\n<p>\u30001. <strong><strong>\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u30b5\u30a4\u30c8<\/strong><\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">- Baeldung (https:\/\/www.baeldung.com)\n  - Spring\u95a2\u9023\u306e\u5b9f\u8df5\u7684\u306a\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\n  - \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5b9f\u88c5\u306e\u8a73\u7d30\u89e3\u8aac\n  - \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0\u30ac\u30a4\u30c9\n\n- Spring Guides (https:\/\/spring.io\/guides)\n  - \u516c\u5f0f\u30ac\u30a4\u30c9\n  - \u30b9\u30c6\u30c3\u30d7\u30d0\u30a4\u30b9\u30c6\u30c3\u30d7\u306e\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\n  - \u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306e\u89e3\u8aac<\/pre>\n\n\n<div id=\"sgb-css-id-228\">\n<p>\u30002. <strong><strong><strong>\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b8\u30a7\u30af\u30c8<\/strong><\/strong><\/strong><\/p>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n * \u53c2\u8003\u3068\u306a\u308bGitHub\u30ea\u30dd\u30b8\u30c8\u30ea:\n * - spring-petclinic: Spring Boot \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u53c2\u8003\u5b9f\u88c5\n * - spring-boot-samples: \u69d8\u3005\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u306e\u30b5\u30f3\u30d7\u30eb\n *\/<\/pre>\n\n\n<div id=\"sgb-css-id-229\">\n<h4 class=\"wp-block-heading\" id=\"i-77\">\u7d99\u7d9a\u7684\u306a\u5b66\u7fd2\u306e\u305f\u3081\u306e\u30ed\u30fc\u30c9\u30de\u30c3\u30d7<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-230\">\n<p>\u30001. <strong>\u57fa\u790e\u56fa\u3081<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-231\">\n<p>\u3000\u3000\u25cf Java\u8a00\u8a9e\u306e\u6df1\u3044\u7406\u89e3<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-232\">\n<p>\u3000\u3000\u25cf Spring Framework\u306e\u57fa\u672c\u6982\u5ff5<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-233\">\n<p>\u3000\u3000\u25cf RESTful API\u306e\u8a2d\u8a08\u539f\u5247<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-234\">\n<p>\u30002. <strong>\u5fdc\u7528\u6280\u8853\u306e\u7fd2\u5f97<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-235\">\n<p>\u3000\u3000\u25cf \u30de\u30a4\u30af\u30ed\u30b5\u30fc\u30d3\u30b9\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-236\">\n<p>\u3000\u3000\u25cf \u30af\u30e9\u30a6\u30c9\u30cd\u30a4\u30c6\u30a3\u30d6\u958b\u767a<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-237\">\n<p>\u3000\u3000\u25cf \u30b3\u30f3\u30c6\u30ca\u5316\u3068\u30aa\u30fc\u30b1\u30b9\u30c8\u30ec\u30fc\u30b7\u30e7\u30f3<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-238\">\n<p>\u30003. <strong>\u5c02\u9580\u6027\u306e\u5411\u4e0a<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-239\">\n<p>\u3000\u3000\u25cf \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5b9f\u88c5\u306e\u8a73\u7d30<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-240\">\n<p>\u3000\u3000\u25cf \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-241\">\n<p>\u3000\u3000\u25cf \u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u8a2d\u8a08<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-242\">\n<h4 class=\"wp-block-heading\" id=\"i-78\">\u5b9f\u8df5\u7684\u306a\u5b66\u7fd2\u30a2\u30d7\u30ed\u30fc\u30c1<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-243\">\n<p>\u30001. <strong><strong>\u30cf\u30f3\u30ba\u30aa\u30f3\u5b66\u7fd2<\/strong><\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-244\">\n<p>\u3000\u3000\u25cf \u5c0f\u898f\u6a21\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-245\">\n<p>\u3000\u3000\u25cf \u65e2\u5b58\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078\u306e\u8ca2\u732e<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-246\">\n<p>\u3000\u3000\u25cf \u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u3078\u306e\u53c2\u52a0<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-247\">\n<p>\u30002. <strong>\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u6d3b\u52d5<\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-248\">\n<p>\u3000\u3000\u25cf \u6280\u8853\u30ab\u30f3\u30d5\u30a1\u30ec\u30f3\u30b9\u3078\u306e\u53c2\u52a0<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-249\">\n<p>\u3000\u3000\u25cf StackOverflow\u3067\u306e\u8cea\u554f\u30fb\u56de\u7b54<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-250\">\n<p>\u3000\u3000\u25cf \u6280\u8853\u30d6\u30ed\u30b0\u306e\u57f7\u7b46<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-251\">\n<p>\u30003. <strong><strong>\u5b9f\u52d9\u3067\u306e\u9069\u7528<\/strong><\/strong><\/p>\n<\/div>\n\n<div id=\"sgb-css-id-252\">\n<p>\u3000\u3000\u25cf \u30c7\u30b6\u30a4\u30f3\u30d1\u30bf\u30fc\u30f3\u306e\u6d3b\u7528<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-253\">\n<p>\u3000\u3000\u25cf \u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306e\u9069\u7528<\/p>\n<\/div>\n\n\n<p>\u3000\u3000\u25cf \u65b0\u6280\u8853\u306e\u5c0e\u5165\u691c\u8a0e<\/p>\n\n\n<div id=\"sgb-css-id-254\">\n<p>\u4ee5\u4e0a\u306e\u5185\u5bb9\u3092\u8e0f\u307e\u3048\u3001\u7d99\u7d9a\u7684\u306a\u5b66\u7fd2\u3068\u5b9f\u8df5\u3092\u901a\u3058\u3066\u3001\u9ad8\u54c1\u8cea\u306aRESTful API\u306e\u958b\u767a\u30b9\u30ad\u30eb\u3092\u78e8\u3044\u3066\u3044\u304f\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-255\">\n<h4 class=\"wp-block-heading\" id=\"i-79\">\u6700\u5f8c\u306b<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-256\">\n<p>Java\u3067\u306eRESTful API\u958b\u767a\u306f\u3001\u6280\u8853\u306e\u9032\u5316\u3068\u3068\u3082\u306b\u5e38\u306b\u5909\u5316\u3057\u3066\u3044\u307e\u3059\u3002\u672c\u8a18\u4e8b\u3067\u89e3\u8aac\u3057\u305f\u5185\u5bb9\u306f\u3001\u73fe\u6642\u70b9\u3067\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3067\u3059\u304c\u3001\u6280\u8853\u306e\u9032\u5316\u306b\u5408\u308f\u305b\u3066\u7d99\u7d9a\u7684\u306a\u5b66\u7fd2\u3068\u6539\u5584\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-257\">\n<h4 class=\"wp-block-heading\" id=\"i-80\">\u6210\u529f\u3078\u306e\u9375<\/h4>\n<\/div>\n\n<div id=\"sgb-css-id-258\">\n<p>\u3000\u25cf \u57fa\u672c\u539f\u5247\u306e\u7406\u89e3\u3068\u9075\u5b88<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-259\">\n<p>\u3000\u25cf \u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u30b9\u30ad\u30eb\u306e\u7fd2\u5f97<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-260\">\n<p>\u3000\u25cf \u7d99\u7d9a\u7684\u306a\u5b66\u7fd2\u3068\u6539\u5584<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-261\">\n<p>\u3000\u25cf \u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3078\u306e\u53c2\u52a0\u3068\u77e5\u898b\u306e\u5171\u6709<\/p>\n<\/div>\n\n<div id=\"sgb-css-id-262\">\n<p>\u4ee5\u4e0a\u306e\u5185\u5bb9\u3092\u5b9f\u8df5\u3059\u308b\u3053\u3068\u3067\u3001\u9ad8\u54c1\u8cea\u306aRESTful API\u306e\u958b\u767a\u304c\u53ef\u80fd\u3068\u306a\u308a\u307e\u3059\u3002\u7686\u69d8\u306e\u958b\u767a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u304a\u3044\u3066\u3001\u672c\u8a18\u4e8b\u306e\u5185\u5bb9\u304c\u6709\u76ca\u306a\u6307\u91dd\u3068\u306a\u308c\u3070\u5e78\u3044\u3067\u3059\u3002<\/p>\n<\/div>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u73fe\u4ee3\u306e\u30b7\u30b9\u30c6\u30e0\u958b\u767a\u306b\u304a\u3044\u3066\u3001RESTful API\u306e\u91cd\u8981\u6027\u306f\u65e5\u3005\u9ad8\u307e\u3063\u3066\u3044\u307e\u3059\u3002\u7279\u306bJava\u3092\u4f7f\u7528\u3057\u305fRESTful API\u958b\u767a\u306f\u3001\u30a8\u30f3\u30bf\u30fc\u30d7\u30e9\u30a4\u30ba\u30b7\u30b9\u30c6\u30e0\u304b\u3089\u30b9\u30bf\u30fc\u30c8\u30a2\u30c3\u30d7\u306e\u30d7\u30ed\u30c0\u30af\u30c8\u307e\u3067\u3001\u5e45\u5e83\u3044\u5834\u9762\u3067\u63a1\u7528\u3055\u308c\u3066\u3044\u307e\u3059 &#8230; <\/p>\n","protected":false},"author":1,"featured_media":2909,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,68,30,28],"tags":[],"class_list":{"0":"post-1089","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-java","8":"category-java-best-practice","9":"category-java-maven","10":"category-java-spring"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1089","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1089"}],"version-history":[{"count":12,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1089\/revisions"}],"predecessor-version":[{"id":2910,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1089\/revisions\/2910"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/media\/2909"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1089"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1089"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1089"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}