{"id":1169,"date":"2020-10-14T09:00:00","date_gmt":"2020-10-14T00:00:00","guid":{"rendered":"http:\/\/mobilelab.khu.ac.kr\/?p=1169"},"modified":"2020-10-14T14:21:54","modified_gmt":"2020-10-14T05:21:54","slug":"dart-programmer-46","status":"publish","type":"post","link":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/2020\/10\/14\/dart-programmer-46\/","title":{"rendered":"Dart Programmer \ub418\uae30 [46]"},"content":{"rendered":"\n<h4>&lt; Container \uac1c\ubc1c &#8211; Dart HTTP Server over Docker, Part.2 &gt;<\/h4>\n\n\n\n<p>\uc774\ubc88 \uae00\uc5d0\uc11c\ub294 Dart \uc5b8\uc5b4\ub85c \ub9cc\ub4e0 \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\uc744 Container \uae30\uc220\uc5d0 \uc801\uc6a9\ud558\ub294 \uacbd\uc6b0\uc5d0 Part.1\uc5d0\uc11c \ub2e4\ub8ec HTTP \uc11c\ubc84\uc5d0 \ud2b9\ud654\ub41c google\/dart-runtime \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\uac00 \uc544\ub2cc, google\/dart \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc73c\ub85c \uc811\uadfc\ud558\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. \uc55e\uc11c Part.1\uacfc\ub294 \ub3c5\ub9bd\uc801\uc73c\ub85c \ub2e4\ub8e8\uae30 \uc704\ud574\uc11c, \uc644\uc804\ud788 \uc0c8\ub85c\uc6b4 \ud504\ub85c\uc81d\ud2b8\ub97c \uc5f4\uace0 \uc791\uc5c5\ud558\ub294 \uac83\uc73c\ub85c \uac00\uc815\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h4>[1\ub2e8\uacc4] Stagehand\ub97c \ud1b5\ud55c Start Application\uc758 \uc0dd\uc131<\/h4>\n\n\n\n<p>\uc791\uc5c5\uc744 \uc218\ud589\ud560 \uc801\uc808\ud55c \ub514\ub809\ud1a0\ub9ac\ub97c \ub9cc\ub4e0 \ud6c4, \ub2e4\uc74c\uc758 \uba85\ub839\uc73c\ub85c \uac04\ub2e8\ud55c console \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ud15c\ud50c\ub9ac\ud2b8\uac00 \ub9cc\ub4e4\uc5b4 \uc9c0\ub3c4\ub85d \ud569\ub2c8\ub2e4. \uc800\uc758 \uacbd\uc6b0\ub294 dart4docker \ub77c\ub294 \ub514\ub809\ud1a0\ub9ac\uc5d0 \ub2e4\uc74c \uba85\ub839\uc744 \uc218\ud589 \ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>stagehand console-simple<\/p>\n\n\n\n<h4>[2\ub2e8\uacc4] main.dart \ud504\ub85c\uadf8\ub7a8\uc758 \ubcc0\uacbd<\/h4>\n\n\n\n<p>\ub2e4\uc74c \ub2e8\uacc4\ub294 bin \ub514\ub809\ud1a0\ub9ac \ud558\ub2e8\uc758 main.dart \ud504\ub85c\uadf8\ub7a8\uc744 Docker \uc0c1\uc5d0\uc11c container\ub85c \ub3d9\uc791\ud560 HTTP \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\uc73c\ub85c \ubcc0\uacbd\ud558\ub294 \uc77c \uc785\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574\uc11c, \uc791\uc5c5 \ud3f4\ub354\ub97c Visual Code\ub85c \uc5fd\ub2c8\ub2e4. \uc774\ubc88 \uae00\uc5d0\uc11c\ub294 \uc0c8\ub85c\uc6b4 HTTP \uc11c\ubc84\ub97c \ub9cc\ub4e4\uae30 \ubcf4\ub2e4\ub294, \uc774\ubbf8 \uc6b0\ub9ac\uac00 tutorial\uc744 \uc9c4\ud589\ud558\uba74\uc11c \ub9cc\ub4e0 HTTP \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\uc744 \uc7ac\uc0ac\uc6a9 \ud569\ub2c8\ub2e4. <\/p>\n\n\n\n<p>\uc55e\uc11c 27\ubc88 \uae00\uc5d0\uc11c \ub9cc\ub4e0 darttutorial-27-02.dart \ud504\ub85c\uadf8\ub7a8\uc758 \ub0b4\uc6a9\uc744 \ubcf5\uc0ac\ud558\uc5ec, main.dart\uc758 \ub0b4\uc6a9\uc744 \ub36e\uc5b4 \uc4f0\ub3c4\ub85d \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc774 \ud504\ub85c\uadf8\ub7a8\uc740 Docker container \ud658\uacbd\uc5d0\uc11c \uadf8\ub300\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc774\uc720\ub294 main()\uc758 HOST \uac12 \uc124\uc815\uc774 InternetAddress.loopbackIPv4\ub85c \ub418\uc5b4 \uc788\ub294\ub370, \uc774\ub294 \uac19\uc740 \ucef4\ud4e8\ud130 \uc548\uc5d0\uc11c\uc758 \uc811\uc18d\ub9cc \ud5c8\uc6a9\ud568\uc73c\ub85c, Docker container\uc758 \uacbd\uc6b0\ub294 OS\ub808\ubca8\uc758 \uac00\uc0c1\ud654\ub97c \uc9c0\uc6d0\ud558\ub294 \uc77c\uc885\uc758 \ub17c\ub9ac\uc801\uc778 \ubcc4\ub3c4\uc758 \ucef4\ud4e8\ud130\uc5d0\uc11c \ub3d9\uc791\ud558\ubbc0\ub85c, \uc774 \uac12\uc744 InternetAddress.anyIPv4\ub85c \ubcc0\uacbd\ud558\uc5ec, \uc678\ubd80\uc5d0\uc11c\uc758 \uc811\uc18d\uc744 \ud5c8\uac00\ud558\ub3c4\ub85d \uc218\uc815\ud569\ub2c8\ub2e4. <\/p>\n\n\n\n<h4>[3\ub2e8\uacc4] Dockerfile \uc0dd\uc131<\/h4>\n\n\n\n<p>Dockerfile\uc740 container image\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud55c \ud654\uc77c\ub85c, Docker\ub97c \ub2e4\ub904\ubcf8 \uc0ac\ub78c\uc774\ub77c\uba74 \ub2f9\uc5f0\ud558\uac8c \uc54c\uace0 \uc788\ub294 \ud654\uc77c \uc785\ub2c8\ub2e4. \uc791\uc5c5 \ud3f4\ub354\uc758 \ub8e8\ud2b8 \uc704\uce58\uc5d0 Dockerfile\uc744 \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h4>[4\ub2e8\uacc4] google\/dart \ub3c4\ucee4 \uc774\ubbf8\uc9c0\uc758 \uc774\ud574<\/h4>\n\n\n\n<p>Dockerfile\uc758 \ub0b4\uc6a9\uc744 \uc791\uc131\ud558\ub294 \ub2e8\uacc4\uc5d0\uc11c, Google\uc774 \uc81c\uacf5\ud558\ub294 dart \uc774\ubbf8\uc9c0\ub97c \uc774\ud574\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. Docker Hub\uc5d0 \ub4f1\ub85d(<a href=\"https:\/\/hub.docker.com\/r\/google\/dart\">https:\/\/hub.docker.com\/r\/google\/dart<\/a>)\ub41c \uc774 \uc774\ubbf8\uc9c0\ub294 Dart \uc5b8\uc5b4\ub85c \ub9cc\ub4e4\uc5b4\uc9c4 \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc744 Docker \uc0c1\uc5d0\uc11c \uac1c\ubc1c\ud558\uae30 \uc704\ud55c \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0 \uc785\ub2c8\ub2e4. \uc55e\uc11c \uc6b0\ub9ac\uac00 \uc0ac\uc6a9\ud55c dart-runtime \uc774\ubbf8\uc9c0\uc758 \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0 \uc774\uba70, Google\uc774 \ub9cc\ub4e4\uace0 \ubc30\ud3ec\ud55c \uc774\ubbf8\uc9c0 \uc785\ub2c8\ub2e4. <\/p>\n\n\n\n<h4>[5\ub2e8\uacc4 Dockerfile \uc791\uc131<\/h4>\n\n\n\n<p>\uac1c\ubc1c\uc790\uac00 \uc9c1\uc811 Dockerfile\uc758 \ub0b4\uc6a9\uc744 \uc0c1\uc138\ud558\uac8c \uc791\uc131\ud574\uc57c \ud569\ub2c8\ub2e4. Dokcer Hub\uc758 \uc774\ubbf8\uc9c0 \uc124\uba85 \ub0b4\uc6a9\uc5d0 Dockerfile\uc758 Sample\uc774 \uc788\uc73c\uba70, \uc774\ub97c \ud1a0\ub300\ub85c \uc6b0\ub9ac\uac00 \ub9cc\ub4dc\ub294 \ud504\ub85c\uadf8\ub7a8\uc758 Dockerfile\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc791\uc131\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">FROM google\/dart\n\nWORKDIR \/app\n\nADD pubspec.* \/app\/\nRUN pub get\nADD . \/app\nRUN pub get --offline\n\nCMD []\nENTRYPOINT [\"\/usr\/bin\/dart\", \"\/app\/bin\/main.dart\"]<\/pre>\n\n\n\n<h4>[6\ub2e8\uacc4] Container Image\uc758 \ube4c\ub4dc<\/h4>\n\n\n\n<p>Docker container image\uc758 build\ub294 \uc77c\ubc18\uc801\uc778 \uc808\ucc28\ub300\ub85c \uc218\ud589\ud558\uba74 \ub429\ub2c8\ub2e4. \ub2e4\uc74c\uc740 \uc774\ub97c \uc218\ud589\ud558\ub294 \uba85\ub839\uc744 \uc608\uc2dc\ub85c \uc801\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>docker build &#8211;tag dartserver:1.0 .<\/p>\n\n\n\n<p>Docker\ub97c \uc0ac\uc6a9\ud574 \ubcf8 \uacbd\ud5d8\uc774 \uc788\ub294 \uacbd\uc6b0 \ubc14\ub85c \uc774\ud574 \uac00\ub2a5\ud558\uaca0\uc9c0\ub9cc, dartserver \ub77c\ub294 \uc774\ub984\uc758 \uc774\ubbf8\uc9c0\ub85c \ubc84\uc804\uc744 1.0\uc73c\ub85c \uc8fc\ub294 \ud615\ud0dc\ub85c \ud0dc\uadf8\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h4>[7\ub2e8\uacc4] Container Image\uc758 \uc2e4\ud589<\/h4>\n\n\n\n<p>\uc774\uc81c Docker\ub97c \ud1b5\ud574\uc11c image\ub97c \uc2e4\ud589\ud560 \ub2e8\uacc4 \uc785\ub2c8\ub2e4. \uc2e4\ud589\uc740 \uc77c\ubc18\uc801\uc778 container\uc758 \uc2e4\ud589\uacfc \ub2e4\ub974\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc758 \uba85\ub839\uc740 \uc774\uc758 \uc608\uc2dc \uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>docker run &#8211;name mydartserver -d -p 4041:4040 dartserver:1.0<\/p>\n\n\n\n<p>dartserver:1.0 \uc774\ubbf8\uc9c0\uc5d0\uc11c \uc2e4\ud589\ud558\ub294 \ucee8\ud14c\uc774\ub108\uc758 \uc774\ub984\uc740 mydartserver\ub85c \ud588\uc73c\uba70, \ud1b5\uc2e0 \ud3ec\ud2b8 \ub9e4\ud551\uc744 localhost:4041\uc774 container\uc758 4040\uc5d0 \ub300\uc751 \ud558\ub3c4\ub85d \ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h4>[8\ub2e8\uacc4] Container \ub3d9\uc791 \ud655\uc778<\/h4>\n\n\n\n<p>27\ubc88 \uae00\uc758 \uc2e4\ud589\ucc98\ub7fc Web \ube0c\ub77c\uc6b0\uc800\ub97c \ud1b5\ud55c \uc811\uc18d\ub3c4 \uc815\uc0c1\uc801\uc73c\ub85c \ub3d9\uc791\ud558\uba70, Docker\ub97c \ub2e4\ub8ec\ub2e4\uba74 \ubcf4\ub2e4 \uce5c\uc219\ud55c \ub2e4\uc74c\uc758 \uba85\ub839\uc73c\ub85c \uc815\uc0c1 \ub3d9\uc791\uc744 \ud655\uc778 \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>curl localhost:4041<\/p>\n\n\n\n<p>\uacb0\uacfc\ub294 27\ubc88 \uae00\uc5d0\uc11c\uc640 \ub3d9\uc77c\ud558\uac8c \uc544\ub798\uc640 \uac19\uc740 \ubb38\uad6c\uac00 \ucd9c\ub825\ub420 \uac83 \uc785\ub2c8\ub2e4 (\uc2dc\uac04 \uc815\ubcf4\ub294 \uc2e4\ud589\uc5d0 \ub530\ub77c \ub2e4\ub984).<\/p>\n\n\n\n<p>2020-05-09 05:09:32.141864: Hello World!<\/p>\n\n\n\n<h4>\ub9c8\ubb34\ub9ac<\/h4>\n\n\n\n<p>Google\uc774 Dart \uc5b8\uc5b4\ub85c \ub9cc\ub4e0 \ud504\ub85c\uadf8\ub7a8\uc744 Docker \uc704\uc5d0\uc11c \uad6c\ub3d9\ud560 \uc218 \uc788\ub294 \ub450\uac1c\uc758 \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\ub97c \uc81c\uacf5\ud558\ub294 \ub355\ubd84\uc5d0 Dart \uc5b8\uc5b4\ub85c \ub9cc\ub4e0 \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\uc758 \ucee8\ud14c\uc774\ub108 \uae30\ubc18 \uad6c\ub3d9\uc774 \ub9e4\uc6b0 \uc6a9\uc774\ud558\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4. <\/p>\n\n\n\n<p>HTTP \ud504\ub85c\ud1a0\ucf5c\uc744 \uc0ac\uc6a9\ud558\ub294 \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\uc774\ub77c\uba74 dart-runtime \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\ub97c \uad8c\uc7a5\ud558\uba70, \ud3ec\ud2b8 \ubc88\ud638\uc5d0 \uc81c\uc57d \ub4f1\uc774 \uc2eb\uc740 \uacbd\uc6b0\ub294 dart \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc801\ud569\ud574 \ubcf4\uc785\ub2c8\ub2e4. \uc774 \uae00\uc744 \uc791\uc131\ud558\ub294 \uc2dc\uc810\uc5d0\ub3c4, \uc774\ub7ec\ud55c \uc0ac\ud56d\uc744 \ubc18\uc601\ud558\ub294\uc9c0 dart \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud55c \uac74\uc218\uac00 dart-runtime \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud55c \uac74\uc218 \ub300\ube44 2\ubc30 \uc815\ub3c4\uc778 \uac83\uc744 \ud655\uc778 \ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc dart \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294, Dockerfile \ub4f1\uc744 \uc791\uc131\ud558\ub294 \ub4f1\uc5d0\uc11c \uc9c1\uc811 \uc791\uc131\ud574\uc57c \ud558\ub294 \ubd88\ud3b8\ud568\uc774 \uc77c\ubd80 \uc874\uc7ac \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uadf8\ub9ac\uace0 \ubcf8 \uae00\uc5d0\uc11c\ub294 Stagehand\ub97c \uae30\ubc18\uc73c\ub85c template\ub97c \uc0dd\uc131\ud558\uace0, \uc774\ub97c \ud1a0\ub300\ub85c \ud504\ub85c\uc81d\ud2b8\ub97c \uac1c\ubc1c\ud558\uc600\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc, \uc9c1\uc811 \ub9cc\ub4e0 \ud654\uc77c\ub4e4 \ub9cc\uc73c\ub85c Dart \uc5b4\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4dc\ub294 \uac83\ub3c4 \uc5b8\uc81c\ub4e0\uc9c0 \uac00\ub2a5\ud569\ub2c8\ub2e4. \uc774\ub7f0 \uacbd\uc6b0\ub294 Dockerfile\uc5d0\uc11c yaml \ud654\uc77c \ubc0f pub \uae30\ubc18 \ud328\ud0a4\uc9c0 \uc81c\uc5b4\uc5d0 \ub300\ud574\uc11c \uc190\uc218 \uc9c1\uc811 \uc791\uc131\ud574 \uc8fc\uba74 \ub418\ubbc0\ub85c, \uc77c\ubd80 \ubc88\uac70\ub7ec\uc6b8 \ubfd0 \ubb38\uc81c\ub294 \uc5c6\uc73c\ub2c8 \ucc38\uc870\ud558\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright size-large is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-content\/uploads\/2020\/01\/b05-1.jpg\" alt=\"\" class=\"wp-image-267\" width=\"126\" height=\"45\"\/><\/figure><\/div>\n\n\n\n<p><strong>Creative Commons License (CC BY-NC-ND)<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&lt; Container \uac1c\ubc1c &#8211; Dart HTTP Server over Docker, Part.2 &gt; \uc774\ubc88 \uae00\uc5d0\uc11c\ub294 Dart \uc5b8\uc5b4\ub85c \ub9cc\ub4e0 \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\uc744 Container \uae30\uc220\uc5d0 \uc801\uc6a9\ud558\ub294 \uacbd\uc6b0\uc5d0 Part.1\uc5d0\uc11c \ub2e4\ub8ec HTTP \uc11c\ubc84\uc5d0 \ud2b9\ud654\ub41c google\/dart-runtime \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\uac00 &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[3],"tags":[16],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts\/1169"}],"collection":[{"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/comments?post=1169"}],"version-history":[{"count":3,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts\/1169\/revisions"}],"predecessor-version":[{"id":1221,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts\/1169\/revisions\/1221"}],"wp:attachment":[{"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/media?parent=1169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/categories?post=1169"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/tags?post=1169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}