{"id":1160,"date":"2020-10-14T09:00:00","date_gmt":"2020-10-14T00:00:00","guid":{"rendered":"http:\/\/mobilelab.khu.ac.kr\/?p=1160"},"modified":"2020-10-14T14:21:35","modified_gmt":"2020-10-14T05:21:35","slug":"dart-programmer-45","status":"publish","type":"post","link":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/2020\/10\/14\/dart-programmer-45\/","title":{"rendered":"Dart Programmer \ub418\uae30 [45]"},"content":{"rendered":"\n<h4>&lt; Container \uac1c\ubc1c &#8211; Dart HTTP Server over Docker, Part.1 &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 \ubc29\ubc95\uc744 \ub2e4\ub8e8\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. Container \uae30\uc220\uc740 Docker\ub97c \uc0ac\uc6a9\ud560 \uc608\uc815\uc774\uba70, \uc774\ub97c \uc704\ud574\uc11c \ub3c5\uc790\ub294 Docker\ub97c \ud3ec\ud568\ud55c Conainer \uae30\uc220\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \ud544\uc694\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 dartserver \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. \uadf8\ub9ac\uace0 PORT \uac12 \uc124\uc815\uc744 4040\uc5d0\uc11c 8080\uc73c\ub85c \ubcc0\uacbd\ud569\ub2c8\ub2e4. \uc774\uc5d0 \ub300\ud55c \uc774\uc720\ub294 \ucd94\ud6c4 \uc124\uba85 \ud558\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h4>[3\ub2e8\uacc4] Dcokerfile \uc791\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-runtime \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-runtime \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-runtime\">https:\/\/hub.docker.com\/r\/google\/dart-runtime<\/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. \ud2b9\ubcc4\ud788 Web \uc11c\ubc84\uc640 \uac19\uc774 8080 \ub958\uc758 \ud1b5\uc2e0 \ud3ec\ud2b8\ub97c \ud1b5\ud574\uc11c \uc678\ubd80\uc640 \ud1b5\uc2e0\ud558\ub294 \uacbd\uc6b0\ub97c \uc704\ud558\uc5ec, Google\uc774 \ub9cc\ub4e4\uace0 \ubc30\ud3ec\ud55c \uc774\ubbf8\uc9c0 \uc785\ub2c8\ub2e4. <\/p>\n\n\n\n<p>\uc774\ubc88 \uae00\uc5d0\uc11c \uc6b0\ub9ac\ub294 \uc774 \uc774\ubbf8\uc9c0\ub97c \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\ub85c \uc0ac\uc6a9\ud560 \uac83\uc778\ub370, \ub2e4\uc74c\uc758 4\uac00\uc9c0 \uc804\uc81c \uc870\uac74\uc744 \ucda9\uc871\ud558\ub294 \uacbd\uc6b0\uc5d0\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<ul><li>pubspec.yaml \ud654\uc77c\uc744 \ud3ec\ud568\ud558\uc5ec, \ud654\uc77c\uac04 \uc758\uc874\uc131\uc744 \uba85\uc2dc\ud560 \uc218 \uc788\uc744 \uac83<\/li><li>\uc2e4\ud589\ud560 \ud504\ub85c\uadf8\ub7a8\uc774 bin\/server.dart\ub85c \uc81c\uacf5\ub418\uc5b4 entry point\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc744 \uac83<\/li><li>8080 \ud1b5\uc2e0 \ud3ec\ud2b8\ub97c \ud1b5\ud574\uc11c \uc678\ubd80 \uc694\uccad\uc744 \ubc1b\uc744 \uac83<\/li><li>Container \uc0dd\uc131\uc2dc \ud504\ub85c\uadf8\ub7a8\uc774 \uc758\uc874\ud558\ub294 \ubaa8\ub4e0 \ud328\ud0a4\uc9c0\uc758 \uc811\uadfc\uc774 \uac00\ub2a5\ud560 \uac83<\/li><\/ul>\n\n\n\n<p>\uccab\ubc88\uc9f8 \uc870\uac74\uc740 Stagehand\ub97c \ud1b5\ud55c \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131\uc2dc \uc790\ub3d9\uc73c\ub85c pubspec.yaml \ud654\uc77c\uc774 \uc0dd\uc131\ub418\uc5b4 \ub9cc\uc871 \ud569\ub2c8\ub2e4. \ub450\ubc88\uc9f8 \uc870\uac74\uc744 \uc704\ud574\uc11c\ub294 bin\/main.dart \ud504\ub85c\uadf8\ub7a8\uc758 \uc774\ub984\uc744 bin\/server.dart\ub85c \uc218\uc815\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc138\ubc88\uc9f8 \uc870\uac74\uc744 \ub9cc\uc871\uc2dc\ud0a4\uae30 \uc704\ud558\uc5ec, 2\ub2e8\uacc4\uc5d0\uc11c 4040\uc778 \ud3ec\ud2b8 \ubc88\ud638\ub97c 8080\uc73c\ub85c \ubcc0\uacbd\ud588\uc2b5\ub2c8\ub2e4. \ub124\ubc88\uc9f8 \uc870\uac74\uc740 \uc811\uadfc \ubd88\uac00\ud55c \ud328\ud0a4\uc9c0\uac00 \uc5c6\uc73c\ub2c8 \ud604 \uc0c1\ud0dc\uc5d0\uc11c \ub9cc\uc871 \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc774\ub807\uac8c \uc870\uac74\uc744 \ub9cc\uc871\ud55c \uacbd\uc6b0, Dockerfile\uc5d0\ub294 \ub2e4\uc74c\uc758 \ud55c\uc904\ub9cc \ub4e4\uc5b4\uac00\uba74 \ub429\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>FROM google\/dart-runtime<\/code><\/pre>\n\n\n\n<h4>[5\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>[6\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 8081:8080 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:8081\uc774 container\uc758 8080\uc5d0 \ub300\uc751 \ud558\ub3c4\ub85d \ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h4>[7\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:8081<\/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 04:41:43.079079: Hello World!<\/p>\n\n\n\n<h4>\ub9c8\ubb34\ub9ac<\/h4>\n\n\n\n<p>Dart \uc5b8\uc5b4\ub97c \ud1b5\ud558\uc5ec \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\uc744 \ub9cc\ub4dc\ub294 \uac83\uc740 \uc544\uc9c1 \ud65c\uc131\ud654 \ub418\uc9c0 \uc54a\uc544 \ubcf4\uc774\uc9c0\ub9cc, \uc5b8\uc5b4\uac00 \uac00\uc9c0\ub294 \ub9e4\ub825\uc73c\ub85c \ub9ce\uc740 \uac1c\ubc1c\uc790\ub4e4\uc774 \uad00\uc2ec\uc744 \uae30\uc6b8\uc774\ub2c8, \uc11c\ubc84\uc5d0\uc11c\uc758 \uc778\uae30\ub3c4 \uc870\ub9cc\uac04 \ub9ce\uc774 \ub298\uc5b4\ub0a0 \uac83\uc73c\ub85c \ubcf4\uc785\ub2c8\ub2e4. \ud2b9\ud788 Google\uc5d0\uc11c Docker\ub97c \uc704\ud55c Dart \uae30\ubc18 \uc11c\ubc84\uc758 \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\ub97c \uc81c\uacf5\ud558\ub294 \ub355\uc5d0 \uc870\uae08 \ub354 \uc218\uc6d4\ud558\uac8c HTTP \uae30\ubc18\uc758 \uc11c\ubc84\ub97c \uad6c\ub3d9\ud560 \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc774\ubc88 \uae00\uc5d0\uc11c \ub290\ub084\uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \uae00\uc5d0\uc11c\ub294 Google\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ub610 \ub2e4\ub978 Docker\uc6a9 \ubca0\uc774\uc2a4 \uc774\ubbf8\uc9c0\ub97c \ub2e4\ub8e8\uc5b4 \ubcf4\uaca0\uc2b5\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=\"131\" height=\"47\"\/><\/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.1 &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 \ubc29\ubc95\uc744 \ub2e4\ub8e8\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. Container \uae30\uc220\uc740 Docker\ub97c \uc0ac\uc6a9\ud560 \uc608\uc815\uc774\uba70, \uc774\ub97c &#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\/1160"}],"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=1160"}],"version-history":[{"count":3,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts\/1160\/revisions"}],"predecessor-version":[{"id":1174,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts\/1160\/revisions\/1174"}],"wp:attachment":[{"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/media?parent=1160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/categories?post=1160"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/tags?post=1160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}