{"id":1164,"date":"2023-04-20T21:54:16","date_gmt":"2023-04-20T12:54:16","guid":{"rendered":"https:\/\/www.gyuroot.com\/wordpress\/?p=1164"},"modified":"2023-07-04T22:11:43","modified_gmt":"2023-07-04T13:11:43","slug":"sprint-%eb%b9%8c%eb%93%9c-%eb%b0%8f-%ed%85%8c%ec%8a%a4%ed%8a%b8-%ec%9e%90%eb%8f%99%ed%99%94","status":"publish","type":"post","link":"https:\/\/www.gyuroot.com\/wordpress\/?p=1164","title":{"rendered":"[Sprint] \ube4c\ub4dc \ubc0f \ud14c\uc2a4\ud2b8 \uc790\ub3d9\ud654"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_63 counter-hierarchy ez-toc-counter ez-toc-white ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title \" >\ubaa9\ucc28<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1164\/#_%ED%95%99%EC%8A%B5_%EB%AA%A9%ED%91%9C\" title=\"# \ud559\uc2b5 \ubaa9\ud45c\"># \ud559\uc2b5 \ubaa9\ud45c<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1164\/#_%ED%95%B4%EA%B2%B0_%EA%B3%BC%EC%A0%9C\" title=\"# \ud574\uacb0 \uacfc\uc81c\"># \ud574\uacb0 \uacfc\uc81c<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1164\/#Getting_Started\" title=\"Getting Started\">Getting Started<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1164\/#_%EC%8B%A4%EC%8A%B5_%EC%9E%90%EB%A3%8C\" title=\"# \uc2e4\uc2b5 \uc790\ub8cc\"># \uc2e4\uc2b5 \uc790\ub8cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1164\/#_%EA%B3%BC%EC%A0%9C_%ED%95%AD%EB%AA%A9%EB%B3%84_%EC%A7%84%ED%96%89_%EC%83%81%ED%99%A9\" title=\"# \uacfc\uc81c \ud56d\ubaa9\ubcc4 \uc9c4\ud589 \uc0c1\ud669\"># \uacfc\uc81c \ud56d\ubaa9\ubcc4 \uc9c4\ud589 \uc0c1\ud669<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1164\/#_TROUBLE_SHOOTING_LOG\" title=\"# TROUBLE SHOOTING LOG\"># TROUBLE SHOOTING LOG<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1164\/#%EC%9B%90%EC%9D%B8\" title=\"\uc6d0\uc778\">\uc6d0\uc778<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1164\/#%ED%95%B4%EA%B2%B0_%EB%B0%A9%EC%95%88\" title=\"\ud574\uacb0 \ubc29\uc548\">\ud574\uacb0 \ubc29\uc548<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1164\/#_%ED%94%BC%EB%93%9C%EB%B0%B1\" title=\"# \ud53c\ub4dc\ubc31\"># \ud53c\ub4dc\ubc31<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1164\/#References\" title=\"#References\">#References<\/a><\/li><\/ul><\/nav><\/div>\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"_%ED%95%99%EC%8A%B5_%EB%AA%A9%ED%91%9C\"><\/span># \ud559\uc2b5 \ubaa9\ud45c<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<ul>\n<li>\uc9c0\uc18d\uc801 \ud1b5\ud569\uc758 \ud544\uc694\uc131\uc744 \uc124\uba85\ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n<li>\ube4c\ub4dc\/\ud14c\uc2a4\ud2b8\uc758 \uac1c\ub150\uc744 \uc774\ud574\ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n<li>\ub9b4\ub9ac\uc2a4\uc758 \uac1c\ub150\uc744 \uc774\ud574\ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n<li>CI \ub3c4\uad6c(\uc5ec\uae30\uc11c\ub294 GitHub Action)\ub97c \uc774\uc6a9\ud558\uc5ec \uc9c0\uc18d\uc801 \ud1b5\ud569\uc774 \uc774\ub8e8\uc5b4\uc9c0\ub294 \uacfc\uc815\uc744 \uc9c1\uc811 \uad6c\ud604\ud560 \uc218 \uc788\ub2e4<\/li>\n\n\n<li>\ub2e4\uc591\ud55c CI \ub3c4\uad6c\uc758 \ucc28\uc774\uc810\uc744 \uc774\ud574\ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n<li>\ucf54\ub4dc\uc640 \ud658\uacbd \ubcc0\uc218\ub97c \ubd84\ub9ac\ud574\uc57c \ud558\ub294 \uc774\uc720\ub97c \uc124\uba85\ud560 \uc218 \uc788\ub2e4.<\/li>\n\n<\/ul>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"_%ED%95%B4%EA%B2%B0_%EA%B3%BC%EC%A0%9C\"><\/span># \ud574\uacb0 \uacfc\uc81c<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Getting_Started\"><\/span><strong>Getting Started<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<ul>\n<li>node.js \ud504\ub85c\uadf8\ub7a8\uc758 \ud14c\uc2a4\ud2b8\ub97c \uc704\ud574\uc11c\ub294 <code>npm test<\/code> \uba85\ub839\uc5b4\ub97c CI, \uc989 GitHub Action \uc0c1\uc5d0\uc11c \uc790\ub3d9\uc73c\ub85c \uc2e4\ud589\ud574\uc918\uc57c \ud569\ub2c8\ub2e4.<\/li>\n\n\n<li>\uba3c\uc800 \uacf5\uc2dd \ubb38\uc11c\ub97c \ud1b5\ud574 GitHub Action\uc758 \uc0ac\uc6a9\ubc29\ubc95\uc744 \uc54c\uc544\ubd05\uc2dc\ub2e4.<\/li>\n\n\n<li><code>Actions<\/code> \ud0ed\uc744 \ud074\ub9ad\ud558\uc5ec workflow\uac00 \uc81c\ub300\ub85c \uc791\ub3d9\ud588\ub294\uc9c0\ub97c \ud655\uc778\ud574 \ubd05\uc2dc\ub2e4.<\/li>\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/actions\/automating-builds-and-tests\/building-and-testing-nodejs-or-python\">\ub808\ud37c\ub7f0\uc2a4\ub97c \ucc38\uace0<\/a>\ud558\uc5ec GitHub Action Node.js workflow\ub97c \ub9cc\ub4e4\uace0, \ud14c\uc2a4\ud2b8\uac00 \ud1b5\uacfc\ud558\ub294\uc9c0 \ud655\uc778\ud558\uc138\uc694.<\/li>\n\n<\/ul>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"_%EC%8B%A4%EC%8A%B5_%EC%9E%90%EB%A3%8C\"><\/span># \uc2e4\uc2b5 \uc790\ub8cc<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<p class=\"has-text-color\" style=\"color: rgb(0, 0, 0)\"><a href=\"https:\/\/github.com\/cs-devops-bootcamp\/sprint-mini-node-server-with-github-action\">sprint-mini-node-server-with-github-action<\/a><\/p>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"_%EA%B3%BC%EC%A0%9C_%ED%95%AD%EB%AA%A9%EB%B3%84_%EC%A7%84%ED%96%89_%EC%83%81%ED%99%A9\"><\/span># \uacfc\uc81c \ud56d\ubaa9\ubcc4 \uc9c4\ud589 \uc0c1\ud669<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<p class=\"has-background\" style=\"background-color: rgb(231, 243, 248)\">&#x270f;&#xfe0f; <strong>1. \uc720\ub2db \ud14c\uc2a4\ud2b8\ub97c \ud1b5\uacfc\uc2dc\ud0a4\uc138\uc694.<\/strong><\/p>\n\n\n<p class=\"has-text-color\" style=\"color: rgb(0, 0, 0)\"><strong>\uba3c\uc800 \ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c\uc744 \uc5f0\uc2b5\ud569\ub2c8\ub2e4.\n\uc9c1\uc811 <\/strong><code><strong>test\/app.test.js<\/strong><\/code><strong>\ub97c \uc218\uc815\ud558\uc5ec \ud1b5\uacfc\ud558\uc9c0 \uc54a\ub294 \ud14c\uc2a4\ud2b8\ub97c \ubaa8\ub450 \ud1b5\uacfc\uc2dc\ud0a4\uc138\uc694.<\/strong><\/p>\n\n\n<p class=\"has-text-color\" style=\"color: rgb(0, 0, 0)\"><strong>1. \ud14c\uc2a4\ud2b8\uac00 \ud1b5\uacfc\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub824\uba74 <\/strong><code><strong>npm test<\/strong><\/code><strong> \uba85\ub839\uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4.<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><code>oh@devops:~\/codeStates\/sprint-mini-node-server-with-github-action$ npm test\n\n&gt; mini-node-server@1.0.0 test\n&gt; mocha .\/test\n\nServer listening on http:\/\/localhost:4000\n\n\n  \uc720\ub2db \ud14c\uc2a4\ud2b8 101\n    1) \uacb0\uacfc\uc5d0 \ub300\ud55c \uae30\ub300\uac12(expectation value)\ub97c \ube44\uad50\ud558\uc5ec \uc720\ub2db \ud14c\uc2a4\ud2b8\ub97c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    2) \uc11c\ubc84\uc5d0 GET \/ \uc694\uccad\uc744 \ubcf4\ub0b4\uba74 Hello World!\ub77c\ub294 \ud14d\uc2a4\ud2b8\uac00 \uc751\ub2f5\uc73c\ub85c \uc635\ub2c8\ub2e4\n    3) \uc11c\ubc84\uc5d0 POST \/upper \uc694\uccad\uc5d0 body\ub97c \uc2e4\uc5b4 \ubcf4\ub0b4\uba74 \uc751\ub2f5\uc740 \ub300\ubb38\uc790\ub85c \ub3cc\ub824\uc90d\ub2c8\ub2e4\n    4) \uc11c\ubc84\uc5d0 POST \/lower \uc694\uccad\uc5d0 body\ub97c \uc2e4\uc5b4 \ubcf4\ub0b4\uba74 \uc751\ub2f5\uc740 \uc18c\ubb38\uc790\ub85c \ub3cc\ub824\uc90d\ub2c8\ub2e4\n\n\n  0 passing (105ms)\n  4 failing\n\n  1) \uc720\ub2db \ud14c\uc2a4\ud2b8 101\n       \uacb0\uacfc\uc5d0 \ub300\ud55c \uae30\ub300\uac12(expectation value)\ub97c \ube44\uad50\ud558\uc5ec \uc720\ub2db \ud14c\uc2a4\ud2b8\ub97c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:\n     AssertionError: expected 2 to equal &#039;\uae30\ub313\uac12\uc774 \ucc44\uc6cc\uc9c0\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4&#039;\n      at Context.&lt;anonymous&gt; (test\/app.test.js:13:25)\n      at process.processImmediate (node:internal\/timers:476:21)\n\n  2) \uc720\ub2db \ud14c\uc2a4\ud2b8 101\n       \uc11c\ubc84\uc5d0 GET \/ \uc694\uccad\uc744 \ubcf4\ub0b4\uba74 Hello World!\ub77c\ub294 \ud14d\uc2a4\ud2b8\uac00 \uc751\ub2f5\uc73c\ub85c \uc635\ub2c8\ub2e4:\n\n      AssertionError: expected &#039;Hello World!&#039; to equal &#039;\uae30\ub313\uac12\uc774 \ucc44\uc6cc\uc9c0\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4&#039;\n      + expected - actual\n\n      -Hello World!\n      +\uae30\ub313\uac12\uc774 \ucc44\uc6cc\uc9c0\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4\n      \n      at \/home\/oh\/codeStates\/sprint-mini-node-server-with-github-action\/test\/app.test.js:21:32\n      at process.processTicksAndRejections (node:internal\/process\/task_queues:95:5)\n\n  3) \uc720\ub2db \ud14c\uc2a4\ud2b8 101\n       \uc11c\ubc84\uc5d0 POST \/upper \uc694\uccad\uc5d0 body\ub97c \uc2e4\uc5b4 \ubcf4\ub0b4\uba74 \uc751\ub2f5\uc740 \ub300\ubb38\uc790\ub85c \ub3cc\ub824\uc90d\ub2c8\ub2e4:\n\n      AssertionError: expected &#039;CODESTATES&#039; to equal &#039;\uae30\ub313\uac12\uc774 \ucc44\uc6cc\uc9c0\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4&#039;\n      + expected - actual\n\n      -CODESTATES\n      +\uae30\ub313\uac12\uc774 \ucc44\uc6cc\uc9c0\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4\n      \n      at \/home\/oh\/codeStates\/sprint-mini-node-server-with-github-action\/test\/app.test.js:31:32\n      at process.processTicksAndRejections (node:internal\/process\/task_queues:95:5)\n\n  4) \uc720\ub2db \ud14c\uc2a4\ud2b8 101\n       \uc11c\ubc84\uc5d0 POST \/lower \uc694\uccad\uc5d0 body\ub97c \uc2e4\uc5b4 \ubcf4\ub0b4\uba74 \uc751\ub2f5\uc740 \uc18c\ubb38\uc790\ub85c \ub3cc\ub824\uc90d\ub2c8\ub2e4:\n\n      AssertionError: expected &#039;codestates&#039; to equal &#039;\uae30\ub313\uac12\uc774 \ucc44\uc6cc\uc9c0\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4&#039;\n      + expected - actual\n\n      -codestates\n      +\uae30\ub313\uac12\uc774 \ucc44\uc6cc\uc9c0\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4\n      \n      at \/home\/oh\/codeStates\/sprint-mini-node-server-with-github-action\/test\/app.test.js:41:32\n      at process.processTicksAndRejections (node:internal\/process\/task_queues:95:5)<\/code><\/pre>\n\n\n<p class=\"has-text-color\" style=\"color: rgb(0, 0, 0)\"><strong>2. app.test.js \ub97c \uc218\uc815\ud558\uc5ec test \ub97c \ud1b5\uacfc\uc2dc\ud0b5\ub2c8\ub2e4.<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><code>const { expect } = require(&#039;chai&#039;)\nconst request = require(&#039;supertest&#039;)\nconst { app, server } = require(&#039;..\/app&#039;)\nconst FILL_ME_IN = &#039;\uae30\ub313\uac12\uc774 \ucc44\uc6cc\uc9c0\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4&#039;\n\ndescribe(&#039;\uc720\ub2db \ud14c\uc2a4\ud2b8 101&#039;, () =&gt; {\n\n  after(() =&gt; {\n    server.close()\n  })\n\n  it(&#039;\uacb0\uacfc\uc5d0 \ub300\ud55c \uae30\ub300\uac12(expectation value)\ub97c \ube44\uad50\ud558\uc5ec \uc720\ub2db \ud14c\uc2a4\ud2b8\ub97c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4&#039;, () =&gt; {\n    expect(1 + 1).to.be.equal(2) \/\/ \uae30\ub300\uac12 \ucd94\uac00\n    expect(100 + 200).to.be.equal(300) \/\/ \uae30\ub300\uac12 \ucd94\uac00\n  })\n\n  it(&#039;\uc11c\ubc84\uc5d0 GET \/ \uc694\uccad\uc744 \ubcf4\ub0b4\uba74 Hello World!\ub77c\ub294 \ud14d\uc2a4\ud2b8\uac00 \uc751\ub2f5\uc73c\ub85c \uc635\ub2c8\ub2e4&#039;, () =&gt; {\n    return request(app)\n      .get(&#039;\/&#039;)\n      .then(res =&gt; {\n        expect(res.text).to.be.equal(&#039;Hello World!&#039;) \/\/ \uae30\ub300\uac12 \ucd94\uac00\n      })\n  })\n\n  it(&#039;\uc11c\ubc84\uc5d0 POST \/upper \uc694\uccad\uc5d0 body\ub97c \uc2e4\uc5b4 \ubcf4\ub0b4\uba74 \uc751\ub2f5\uc740 \ub300\ubb38\uc790\ub85c \ub3cc\ub824\uc90d\ub2c8\ub2e4&#039;, () =&gt; {\n    return request(app)\n      .post(&#039;\/upper&#039;)\n      .send(&#039;&quot;coDeStaTes&quot;&#039;)\n      .set(&#039;Content-Type&#039;, &#039;application\/json&#039;)\n      .then(res =&gt; {\n        expect(res.body).to.be.equal(&#039;CODESTATES&#039;) \/\/ \uae30\ub300\uac12 \ucd94\uac00\n      })\n  })\n\n  it(&#039;\uc11c\ubc84\uc5d0 POST \/lower \uc694\uccad\uc5d0 body\ub97c \uc2e4\uc5b4 \ubcf4\ub0b4\uba74 \uc751\ub2f5\uc740 \uc18c\ubb38\uc790\ub85c \ub3cc\ub824\uc90d\ub2c8\ub2e4&#039;, () =&gt; {\n    return request(app)\n      .post(&#039;\/lower&#039;)\n      .send(&#039;&quot;coDeStaTes&quot;&#039;)\n      .set(&#039;Content-Type&#039;, &#039;application\/json&#039;)\n      .then(res =&gt; {\n        expect(res.body).to.be.equal(&#039;codestates&#039;) \/\/ \uae30\ub300\uac12 \ucd94\uac00\n      })\n  })\n})<\/code><\/pre>\n\n\n<pre class=\"wp-block-code\"><code>oh@devops:~\/codeStates\/sprint-mini-node-server-with-github-action$ npm test\n\n&gt; mini-node-server@1.0.0 test\n&gt; mocha .\/test\n\nServer listening on http:\/\/localhost:4000\n\n\n  \uc720\ub2db \ud14c\uc2a4\ud2b8 101\n    &#x2714; \uacb0\uacfc\uc5d0 \ub300\ud55c \uae30\ub300\uac12(expectation value)\ub97c \ube44\uad50\ud558\uc5ec \uc720\ub2db \ud14c\uc2a4\ud2b8\ub97c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4\n    &#x2714; \uc11c\ubc84\uc5d0 GET \/ \uc694\uccad\uc744 \ubcf4\ub0b4\uba74 Hello World!\ub77c\ub294 \ud14d\uc2a4\ud2b8\uac00 \uc751\ub2f5\uc73c\ub85c \uc635\ub2c8\ub2e4\n    &#x2714; \uc11c\ubc84\uc5d0 POST \/upper \uc694\uccad\uc5d0 body\ub97c \uc2e4\uc5b4 \ubcf4\ub0b4\uba74 \uc751\ub2f5\uc740 \ub300\ubb38\uc790\ub85c \ub3cc\ub824\uc90d\ub2c8\ub2e4\n    &#x2714; \uc11c\ubc84\uc5d0 POST \/lower \uc694\uccad\uc5d0 body\ub97c \uc2e4\uc5b4 \ubcf4\ub0b4\uba74 \uc751\ub2f5\uc740 \uc18c\ubb38\uc790\ub85c \ub3cc\ub824\uc90d\ub2c8\ub2e4\n\n\n  4 passing (91ms)<\/code><\/pre>\n\n\n<p class=\"has-background\" style=\"background-color: rgb(231, 243, 248)\">&#x270f;&#xfe0f; <strong>2. GitHub Action\uc744 \uc774\uc6a9\ud574\uc11c Node.js CI\ub97c \uc801\uc6a9\ud558\uc138\uc694.<\/strong><\/p>\n\n\n<p class=\"has-text-color\" style=\"color: rgb(0, 0, 0)\"><strong>1. node \ubc84\uc804\uc740 16 \ubc84\uc804\uc73c\ub85c \ubc18\ub4dc\uc2dc \uc9c0\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><code>$ nvm install 16.13.0\n$ nvm use 16.13.0<\/code><\/pre>\n\n\n<p class=\"has-text-color\" style=\"color: rgb(0, 0, 0)\"><strong>2. \ub2e4\uc74c \uc0c1\ud669\uc5d0\uc11c GitHub Action\uc774 \ud2b8\ub9ac\uac70\ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/strong><\/p>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>.github\/workflows \ub514\ub809\ud1a0\ub9ac\uc5d0 workflow \ud30c\uc77c \uc0dd\uc131<\/strong><\/p>\n\n<\/blockquote>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-225-1024x864.png?v=1688456442\" alt=\"\"\/><\/figure>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>master \ub85c push \ud14c\uc2a4\ud2b8 &#8211; Success<\/strong><\/p>\n\n<\/blockquote>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-226-462x1024.png?v=1688456448\" alt=\"\"\/><\/figure>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>master \ub85c push \ud14c\uc2a4\ud2b8 &#8211; Fail<\/strong><\/p>\n\n<\/blockquote>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-227-901x1024.png?v=1688456454\" alt=\"\"\/><\/figure>\n\n\n<blockquote class=\"wp-block-quote has-text-color\" style=\"color: rgb(0, 0, 0)\">\n<p><strong>master \ub85c pull request<\/strong> <strong>\ud14c\uc2a4\ud2b8<\/strong><\/p>\n\n<\/blockquote>\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/www.gyuroot.com\/wordpress\/wp-content\/uploads\/image-228-1019x1024.png?v=1688456459\" alt=\"\"\/><\/figure>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"_TROUBLE_SHOOTING_LOG\"><\/span># TROUBLE SHOOTING LOG<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<p class=\"has-background\" style=\"background-color: rgb(251, 243, 219)\">&#x1f4a1; \ubb38\uc81c \ub0b4\uc6a9<\/p>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%EC%9B%90%EC%9D%B8\"><\/span>\uc6d0\uc778<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%ED%95%B4%EA%B2%B0_%EB%B0%A9%EC%95%88\"><\/span>\ud574\uacb0 \ubc29\uc548<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"_%ED%94%BC%EB%93%9C%EB%B0%B1\"><\/span># \ud53c\ub4dc\ubc31<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\uc624\ud0dc\uacbd<\/th><th>\ubc15\ucc2c\uaddc<\/th><\/tr><\/thead><tbody><tr><td>DevOps\uc758 \uc0c1\uc9d5 \u2018\uc790\ub3d9\ud654\u2019 \ub97c \ucc98\uc74c\uc73c\ub85c \uad6c\ud604\ud574\ubcf4\ub2c8\n\uac04\ub2e8\ud55c \uc2a4\ud06c\ub9bd\ud2b8\ub85c\ub3c4 \uac1c\ubc1c\uc790\uc758 \ub9ce\uc740 \uc218\uc791\uc5c5\uc744 \ub35c\uc5b4\uc904 \uc218 \uc788\ub2e4\ub77c\ub294 \uac83\uc744 \uae68\ub2ec\uc558\ub2e4.<\/td><td>GitHub \uacf5\uc2dd\ubb38\uc11c\ub97c \ubcf4\uba74\uc11c \ud559\uc2b5\ud558\uace0 \uc788\uc5c8\uace0 \uc790\ub3d9\ud654 \ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc774 \ub9ce\ub2e4\ub294\uac78 \uc54c\uac8c\ub42c\ub2e4.<\/td><\/tr>\n<\/tbody><\/table><\/figure>\n\n\n<h1 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"References\"><\/span>#References<span class=\"ez-toc-section-end\"><\/span><\/h1>\n\n\n<ul>\n<li><a href=\"https:\/\/docs.github.com\/en\/actions\/learn-github-actions\/creating-starter-workflows-for-your-organization\">Creating a starter workflow<\/a><\/li>\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/actions\/learn-github-actions\/using-starter-workflows\">Using starter workflow<\/a><\/li>\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/actions\/automating-builds-and-tests\">automating-builds-and-tests<\/a><\/li>\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/actions\/using-workflows\/workflow-syntax-for-github-actions\">workflow-syntax-for-github-actions<\/a><\/li>\n\n<\/ul>\n\n","protected":false},"excerpt":{"rendered":"<p># \ud559\uc2b5 \ubaa9\ud45c # \ud574\uacb0 \uacfc\uc81c Getting Started # \uc2e4\uc2b5 \uc790\ub8cc sprint-mini-node-server-with-github-action # \uacfc\uc81c \ud56d\ubaa9\ubcc4 \uc9c4\ud589 \uc0c1\ud669 &#x270f;&#xfe0f; 1. \uc720\ub2db \ud14c\uc2a4\ud2b8\ub97c \ud1b5\uacfc\uc2dc\ud0a4\uc138\uc694. \uba3c\uc800 \ud14c\uc2a4\ud2b8 \uc8fc\ub3c4 \uac1c\ubc1c\uc744 \uc5f0\uc2b5\ud569\ub2c8\ub2e4. \uc9c1\uc811 test\/app.test.js\ub97c \uc218\uc815\ud558\uc5ec \ud1b5\uacfc\ud558\uc9c0 \uc54a\ub294 \ud14c\uc2a4\ud2b8\ub97c \ubaa8\ub450 \ud1b5\uacfc\uc2dc\ud0a4\uc138\uc694. 1. \ud14c\uc2a4\ud2b8\uac00 \ud1b5\uacfc\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub824\uba74 npm test \uba85\ub839\uc744 \uc774\uc6a9\ud569\ub2c8\ub2e4. 2. app.test.js \ub97c \uc218\uc815\ud558\uc5ec test \ub97c \ud1b5\uacfc\uc2dc\ud0b5\ub2c8\ub2e4. &#x270f;&#xfe0f; 2. GitHub Action\uc744 \uc774\uc6a9\ud574\uc11c &#8230; <a title=\"[Sprint] \ube4c\ub4dc \ubc0f \ud14c\uc2a4\ud2b8 \uc790\ub3d9\ud654\" class=\"read-more\" href=\"https:\/\/www.gyuroot.com\/wordpress\/?p=1164\" aria-label=\"More on [Sprint] \ube4c\ub4dc \ubc0f \ud14c\uc2a4\ud2b8 \uc790\ub3d9\ud654\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":""},"categories":[45],"tags":[],"_links":{"self":[{"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1164"}],"collection":[{"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1164"}],"version-history":[{"count":1,"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1164\/revisions"}],"predecessor-version":[{"id":1184,"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1164\/revisions\/1184"}],"wp:attachment":[{"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1164"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gyuroot.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}