{"id":654,"date":"2020-07-20T09:00:33","date_gmt":"2020-07-20T00:00:33","guid":{"rendered":"http:\/\/mobilelab.khu.ac.kr\/?p=654"},"modified":"2020-05-08T23:54:07","modified_gmt":"2020-05-08T14:54:07","slug":"be-dart-programmer-27","status":"publish","type":"post","link":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/2020\/07\/20\/be-dart-programmer-27\/","title":{"rendered":"Dart Programmer \ub418\uae30 [27]"},"content":{"rendered":"\n<h4>&lt; HTTP \uc11c\ubc84\uac1c\ubc1c &#8211; Basic HTTP Server &amp; Frameworks ><\/h4>\n\n\n\n<p>HTTP(Hyper Transport Protocol)\uc740 90\ub144\ub300 Tim Bernas Lee \uacbd\uc5d0 \uc758\ud574\uc11c \uc81c\uc548\ub418\uace0 \ub9cc\ub4e4\uc5b4\uc84c\uc73c\uba70, \ud604\uc7ac \uc6b0\ub9ac\uac00 \uc6f9 \ud639\uc740 \uc6d4\ub4dc \uc640\uc774\ub4dc \uc6f9 \ud639\uc740 \uc778\ud130\ub137(\uc774\uac74 \uc798\ubabb\ub41c \uc774\ud574 \uc774\uc9c0\ub9cc)\uc744 \uad6c\ud604\ud558\ub294 \uc544\uc8fc \uc911\uc694\ud55c \uae30\uc220\uc785\ub2c8\ub2e4. \uc5ec\uae30\uc11c\ub294 \uac00\uc7a5 \uae30\ubcf8\uc801\uc778 HTTP Ver 1.1\uc5d0 \uae30\ubc18\ud558\ub294 Client\uc640 Server \ud504\ub85c\uadf8\ub7a8\uc744 Dart \uc5b8\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub9cc\ub4dc\ub294 \ubc29\ubc95\uc744 \uc124\uba85 \ud569\ub2c8\ub2e4. \ub2e8, HTTP\uc5d0 \ub300\ud55c \uc774\ub860\uc801\uc778 \uc774\ud574\uac00 \ubc18\ub4dc\uc2dc \uc788\uc5b4\uc57c \ud558\ub294\ub370, \uc774\uc5d0 \ub300\ud574\uc11c\ub294 \uc774 \uae00\uc5d0\uc11c\ub294 \uc124\uba85\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. HTTP\uc5d0 \ub300\ud55c \uc774\ud574\ub294 \ud1b5\uce6d &#8216;\ucef4\ud4e8\ud130 \ub124\ud2b8\uc6cc\ud06c&#8217; \ub958\uc758 \uc81c\ubaa9\uc744 \uac16\ub294 \uc804\ud1b5\uc801\uc778 \ub300\ud559\uc758 \uad50\uacfc\uc11c \ub4e4\uc5d0\uc11c\ub3c4 \ucc3e\uc544\ubcfc \uc218 \uc788\uc73c\uba70, \ub2e4\uc74c\uc758 \uc6f9 \uc0ac\uc774\ud2b8\ub4e4\uc744 \ud1b5\ud574\uc11c\ub3c4 \ucda9\ubd84\ud788 \uc774\ud574\ud560 \uc218 \uc788\uc73c\ub2c8, \ubbf8\ub9ac \uc0ac\uc804\uc5d0 \uacf5\ubd80\ub97c \ud558\uace0, \uc774 \uae00\uc744 \uc774\uc5b4\uac00\uae30 \ubc14\ub78d\ub2c8\ub2e4. \uc774\ud574\ud574\uc57c \ud558\ub294 \ub2e8\uc5b4\ub4e4\uc740 Web, IP, IP Address, TCP, Port Number, HTTP, HTML, CSS, Web Browser, Web Server, DNS \uc815\ub3c4\uc785\ub2c8\ub2e4. \uae4a\uc774\uc788\ub294 \uc774\ud574\ubcf4\ub2e4\ub294 \ub2e8\uc21c\ud558\uac8c \ub2e8\uc5b4\uac00 \uc758\ubbf8\ud558\ub294 \ub73b\uc744 \ucda9\ubd84\ud558\uac8c \uc774\ud574\ud560 \uc218 \uc788\uc73c\uba74 \ub429\ub2c8\ub2e4. \ucd94\ucc9c\ud558\ub294 \uc778\ud130\ub137 \uc0c1\uc758 \uc790\ub8cc\ub4e4\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<ul><li>Khan Academy &#8211; \ucef4\ud4e8\ud130\uacfc\ud559 \uc778\ud130\ub137 \uc785\ubb38 [<a href=\"https:\/\/ko.khanacademy.org\/computing\/computer-science\/internet-intro#internet-works-intro\">\ucc38\uc870<\/a>, \ud29c\ud1a0\ub9ac\uc5bc]<\/li><li>Tutorials Point &#8211; HTTP Tutorial [<a href=\"https:\/\/www.tutorialspoint.com\/http\/index.htm\">\ucc38\uc870<\/a>, \ud29c\ud1a0\ub9ac\uc5bc] <\/li><li>W3C &#8211; HTTP (Hypertext Transfer Protocol) [<a href=\"https:\/\/www.w3.org\/Protocols\/\">\ucc38\uc870<\/a>, \ud45c\uc900\ubb38\uc11c]<\/li><\/ul>\n\n\n\n<p>\ucc38\uace0\ub85c \uc774\uae00\uc740 Dart \uacf5\uc2dd \uc0ac\uc774\ud2b8\uc758 &#8220;Write HTTP clients &amp; servers&#8221; \uac8c\uc2dc\ubb3c\uc744 \uadfc\uac04\uc73c\ub85c \ud574\uc11c \uc124\uba85\ud558\uace0\uc790 \ud569\ub2c8\ub2e4 [<a href=\"https:\/\/dart.dev\/tutorials\/server\/httpserver\">\ucc38\uc870<\/a>]. HTTP \uc11c\ubc84 \uac1c\ubc1c\uc744 \uc774\ud574\uac00\uae30 \uc704\ud574\uc11c\ub294 \ubc18\ub4dc\uc2dc \uc55e\uc11c\uc758 Dart \uae30\ucd08\ubb38\ubc95\uc5d0 \ub300\ud55c \uc774\ud574\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h4>Basic Operations of HTTP Client &amp; Server<\/h4>\n\n\n\n<p>HTTP Client\uc640 Server\uc5d0 \ub300\ud55c \uae30\ucd08\uac1c\ub150\uc744 \uc774\ud574 \ud588\ub2e4\uba74, HTTP Server\ub294 \ud504\ub85c\uadf8\ub7a8 \ub3d9\uc791\uc2dc \ubcf8\uc778\uc758 IP \uc8fc\uc18c \ub4f1\uc758 \uc815\ubcf4\uc640 Port \ubc88\ud638\ub97c \ud1a0\ub300\ub85c Client \ub4e4\uc758 \uc694\uccad\uc744 \uc218\uc2e0\ud560 \uc900\ube44\ub97c \ud558\ub294\ub370, \uc774 \uacfc\uc815\uc744 bind \ub77c\uace0 \ud569\ub2c8\ub2e4. Client \ub4e4\uc774 \uc774\ud6c4 \ud65c\uc131\ud654\ub418\uc5b4 Server\uc5d0 HTTP protocol\uc744 \ud1b5\ud574\uc11c \uc5ec\ub7ff \uc694\uccad\uc744 \ud558\uac8c \ub429\ub2c8\ub2e4. \uc774\ub97c \uc815\ub9ac\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<ul><li>Server\ub294 \ud504\ub85c\uadf8\ub7a8 \uc2dc\uc791\ud6c4 Listen \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud568<\/li><li>Client\uac00 Server\ub85c TCP\ub97c \ud1b5\ud574\uc11c \uc5f0\uacb0\uc744 \uc218\ud589\ud568<\/li><li>Client\uac00 Server\ub85c HTTP Request\ub97c \ubcf4\ub0b4\uace0, Server\uac00 \uc774\ub97c \uc218\uc2e0\ud568<\/li><li>Server\ub294 Client\uc758 HTTP Request \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uba74\uc11c, \ub2e4\ub978 Client\ub97c Listen\ud568<\/li><li>Server\ub294 HTTP Request\ub97c \ucc98\ub9ac\ud55c \ud6c4, HTTP Response\ub97c \ud68c\uc2e0\ud568<\/li><li>Server\ub294 HTTP Resposne\ub97c \ud68c\uc2e0\ud55c Client\uc640\uc758 TCP \uc5f0\uacb0\uc744 \ud574\uc81c\ud568<\/li><\/ul>\n\n\n\n<p>\uc774\ud6c4 \uc608\uc81c \ud504\ub85c\uadf8\ub7a8\uc744 \ub9cc\ub4e4\uace0 \uc218\ud589\ud560\ub54c\uc5d0\ub3c4 \uc704\uc758 \ub3d9\uc791\uc744 \ub3d9\uc77c\ud558\uac8c \uc9c4\ud589\ud560 \uac83\uc774\ubbc0\ub85c \uc219\uc9c0\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4. \uadf8\ub9ac\uace0 Dart \uc5b8\uc5b4\ub85c HTTP \uae30\ubc18\uc758 Server \ud504\ub85c\uadf8\ub7a8\uc744 \ub9cc\ub4e4\ub54c\uc5d0\ub294 dart:io\ub97c \uc0ac\uc6a9\ud558\uc5ec \uae30\ucd08\ubd80\ud130 \uc791\uc131\ud558\ub294 \ubc29\ubc95\uacfc, HTTP \uae30\ubc18\uc758 \uc11c\ubc84 \ud328\ud0a4\uc9c0\ub97c \ud65c\uc6a9\ud558\ub294 \ubc29\ubc95\uc774 \uc788\uc2b5\ub2c8\ub2e4 [<a href=\"https:\/\/pub.dev\/packages\/http_server\">\ucc38\uc870<\/a>]. \uc77c\ub2e8 dart:io\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 CLI \uae30\ubc18 \uc11c\ube44\uc2a4\uc758 \uac1c\ubc1c\uc2dc \uc0ac\uc6a9\ud558\uba70, \ud5a5\ud6c4 Web Browser\ub098 \uc2a4\ub9c8\ud2b8\ud3f0 \uae30\ubc18\uc758 Web App\uc744 \uc791\uc131\ud558\ub294 \uacbd\uc6b0\ub294 dart:html\uc744 \uc0ac\uc6a9\ud558\uc5ec\uc57c \ud569\ub2c8\ub2e4. \ub530\ub77c\uc11c HTTP \uc11c\ubc84\uac1c\ubc1c \uae00\uc5d0\uc11c\ub294 dart:io\ub97c \uc8fc\ub85c \ud65c\uc6a9\ud558\uc5ec, HTTP Client\uc640 Server\ub97c \uac1c\ubc1c\ud558\ub3c4\ub85d \ud560 \uac81\ub2c8\ub2e4. \ud558\uc9c0\ub9cc Dart \uc5b8\uc5b4\uc5d0\uc11c HttpRequest class\uac00 dart:html\uc5d0 \ud3ec\ud568\ub418\uc5b4 \uc788\uae30\uc5d0, dart:html\ub3c4 \ud568\uaed8 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. Dart\uc5d0\uc11c HTTP\ub97c \uad6c\ud604\ud560\ub54c \uad00\ub828 Class\uc5d0 \ub300\ud574\uc11c \uc774\ud574\ud558\ub824\uba74 \ub2e4\uc74c\uc758 \uc0ac\uc774\ud2b8\ub4e4\uc744 \ucc38\uc870\ud558\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n\n\n\n<ul><li>HttpServer \ud074\ub798\uc2a4 [<a href=\"https:\/\/api.dart.dev\/stable\/2.7.1\/dart-io\/HttpServer-class.html\">\ucc38\uc870<\/a>] <\/li><li>HttpRequest \ud074\ub798\uc2a4 [<a href=\"https:\/\/api.dart.dev\/stable\/2.7.1\/dart-html\/HttpRequest-class.html\">\ucc38\uc870<\/a>]<\/li><li>HttpResponse \ud074\ub798\uc2a4 [<a href=\"https:\/\/api.dart.dev\/stable\/2.7.1\/dart-io\/HttpResponse-class.html\">\ucc38\uc870<\/a>]<\/li><li>HttpServer \ud328\ud0a4\uc9c0 [<a href=\"https:\/\/pub.dev\/packages\/http_server\">\ucc38\uc870<\/a>] <\/li><\/ul>\n\n\n\n<h4>Simple &#8220;Hello, World!&#8221; HTTP Server<\/h4>\n\n\n\n<p>\uac00\uc7a5 \uac04\ub2e8\ud55c HTTP Server\ub97c \ub9cc\ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. Dart \uacf5\uc2dd \ud648\ud398\uc774\uc9c0\uc5d0 \uc788\ub294 \uc608\uc81c\ub85c\uc368, MS Visual Code\uc5d0\uc11c \ub2e4\uc74c\uc758 darttutorial-27-01.dart ( hello_world_server.dart ) \ud504\ub85c\uadf8\ub7a8\uc744 \uc785\ub825\ud558\uc5ec \uc218\ud589\ud569\ub2c8\ub2e4. \uadf8\ub7ec\uba74 &#8220;Listening on localhost:4040&#8243;\ub77c\uace0 \ucd9c\ub825\uc774 \ub418\ub294 \uac83\uc744 \ud655\uc778 \ud560\uc218 \uc788\uc2b5\ub2c8\ub2e4. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ darttutorial-27-01.dart ( hello_world_server.dart )\n\nimport 'dart:io';\n\nFuture main() async {\n  var server = await HttpServer.bind(\n    InternetAddress.loopbackIPv4,\n    4040,\n  );\n  print('Listening on localhost:${server.port}');\n\n  await for (HttpRequest request in server) {\n    request.response.write('Hello, world!');\n    await request.response.close();\n  }\n}<\/code><\/pre>\n\n\n\n<p>HTTP Client\ub294 \uc544\uc9c1 \ubcc4\ub3c4\ub85c \uac1c\ubc1c\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub2e4\ub9cc \uc6f9\ube0c\ub77c\uc6b0\uc800\ub97c \uc2e4\ud589 \uc2dc\ud0a8\ud6c4, \uc8fc\uc18c\ucc3d\uc5d0 localhost:4040 \uc774\ub77c\uace0 \ud0c0\uc774\ud551 \ud55c\ud6c4, enter \ud0a4\ub97c \uce58\uba74 \ub429\ub2c8\ub2e4. \uc774 \uc758\ubbf8\ub294 \uc9c0\uae08 \uac1c\ubc1c\uc790\uac00 \uc791\uc5c5\ud558\ub294 \ucef4\ud4e8\ud130(localhost)\uc5d0\uc11c \ub3d9\uc791\ud558\ub294 \ud504\ub85c\uadf8\ub7a8\uc778\ub370, port \ubc88\ud638\uac00 4040\uc778 \ud504\ub85c\uadf8\ub7a8(darttutorial-27-01.dart)\uc774\ub77c\ub294 \uc758\ubbf8\ud799\ub2c8\ub2e4. \uadf8\ub7ec\uba74 HTTP Client\uc778 \uc6f9\ube0c\ub77c\uc6b0\uc800\uc5d0 &#8220;Hello, world!&#8221;\uc758 \uc544\uc8fc \uc9e7\uc740 \ucd9c\ub825\uc774 \ub098\ud0c0\ub098\ub294 \uac83\uc744 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub807\uac8c \ucd5c\ucd08\uc758 HTTP \uc11c\ubc84\ub97c \ub9cc\ub4e4\uace0 \uc218\ud589\ud558\ub294 \uac83\uc5d0 \uc131\uacf5\ud588\uc2b5\ub2c8\ub2e4. <\/p>\n\n\n\n<h4>Advanced &#8220;Hello, World!&#8221; HTTP Server<\/h4>\n\n\n\n<p>darttutorial-27-01.dart \ud504\ub85c\uadf8\ub7a8\uacfc \ud558\ub294 \uc77c\uc740 \uac19\uc9c0\ub9cc, \ud504\ub85c\uadf8\ub7a8\uc758 \uad6c\uc870\ub97c \ubc14\uafb8\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4. \uc774\ub294 \uc55e\uc73c\ub85c \ubcf4\ub2e4 \uc758\ubbf8\uc788\ub294 \uae30\ub2a5\uc744 \uc218\ud589\ud558\uae30 \uc704\ud55c \ud615\ud0dc\ub85c \ud504\ub85c\uadf8\ub7a8\uc744 \ubbf8\ub9ac \uc900\ube44\ud574 \ub193\ub294\ub2e4\uace0 \uc0dd\uac01\ud558\uba74 \ub418\uaca0\uc2b5\ub2c8\ub2e4. \uac1c\uc120\ud55c \ud504\ub85c\uadf8\ub7a8\uc740 darttutorial-27-02.dart \ud504\ub85c\uadf8\ub7a8\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ darttutorial-27-02.dart\n\nimport \"dart:io\";\nimport 'dart:async';\n\n\/\/ Handler for HTTP Get Request.\nvoid handleGetRequest(HttpRequest req) {\n  \/\/ #1 Retrieve an associated HttpResponse object in HttpRequst object.\n  HttpResponse res = req.response;\n\n  \/\/ #2 Do something : Example - Write text body in the response.\n  res.write('${DateTime.now()}: Hello World!');\n\n  \/\/ #3 Close the response and send it to the client.\n  res.close();\n}\n\n\/\/ Handler for not allowed HTTP Request.\nvoid handleNotAllowedRequest(HttpRequest req) {\n  \/\/ #1 Retrieve an associated HttpResponse object in HttpRequst object.\n  HttpResponse res = req.response;\n\n  \/\/ #2 Do something : Example - Write text body in the response.\n  res\n  ..statusCode = HttpStatus.methodNotAllowed\n  ..write('${DateTime.now()}: Unsupported request: ${req.method}.');\n\n  \/\/ #3 Close the response and send it to the client.\n  res.close();\n}\n\n\/\/ Handler for HTTP Request.\nFuture handleRequest(HttpRequest req) async {\n    \/\/ #1 Do something based on HTTP request types.\n    switch (req.method) {\n      \/\/ #2 GET Request.\n      case 'GET':\n        \/\/ Print log message and activate HTTP Get Request handler.\n        stdout.writeln(\"${DateTime.now()}: GET ${req.uri.path}\");\n        await handleGetRequest(req);\n        break;\n      \/\/ #3 Other Requests.\n      default:\n        stdout.writeln(\"${DateTime.now()}: ${req.method} not allowed\");\n        await handleNotAllowedRequest(req);\n    }\n}\n\nFuture main() async {\n  \/\/ #1 Specify HTTP Server address (localhost) and port.\n  final HOST = InternetAddress.loopbackIPv4;\n  final PORT = 4040;\n\n  \/\/ #2 Starts listening for HTTP requests on the address and port.\n  var httpServer = await HttpServer.bind(HOST, PORT);\n  stdout.writeln(\"${DateTime.now()}: HTTP Server running at ${HOST.address}:$PORT\");\n\n  \/\/ #3 Listening for HTTP requests and handle requests.\n  await for (HttpRequest httpRequest in httpServer) {\n    try {\n      \/\/ #3.1 Activate a HTTP Request handler\n      handleRequest(httpRequest);\n    } catch(e) {\n      \/\/ #3.2 Print message at exception handling case\n      stdout.writeln('${DateTime.now()}: Exception in handleRequest: $e');\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p>\uc2e4\ud589 \ubc29\ubc95\uc740 \uc55e\uc11c\uc758 darttutorial-27-01.dart \ud504\ub85c\uadf8\ub7a8\uacfc \ub3d9\uc77c\ud569\ub2c8\ub2e4. \uc11c\ubc84\uc5d0\uc11c\uc758 \ucd9c\ub825\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. \uc989, \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\uc774 \uc2dc\uc791\ud558\uba74, \ubcf8\uc778\uc758 \ub124\ud2b8\uc6cc\ud06c \uc8fc\uc18c\uc640 \ud3ec\ud2b8 \ubc88\ud638\ub97c \ucd9c\ub825\ud569\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uc6f9\ube0c\ub77c\uc6b0\uc800\ub97c \ud1b5\ud574\uc11c Client\uac00 \uc811\uc18d\ud558\uba74, Client\uac00 \uc694\uccad\ud55c \uc815\ubcf4\ub97c \uc11c\ubc84 \ud504\ub85c\uadf8\ub7a8\uc758 \ucd9c\ub825\uc73c\ub85c \ub098\ud0c0\ub0b4\ub3c4\ub85d \ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2020-02-13 16:25:43.693213: HTTP Server running at 127.0.0.1:4040\n2020-02-13 16:25:48.618858: GET \/<\/code><\/pre>\n\n\n\n<p>darttutorial-27-02.dart \ud504\ub85c\uadf8\ub7a8\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc124\uba85\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>handleGetRequest() \ud568\uc218\ub294 HTTP Client\uac00 HTTP Get Request\ub97c HTTP Server\uc5d0\uac8c \uc804\ub2ec\ud558\uc600\uc744\ub54c, Server\uac00 \uc774\ub97c \ucc98\ub9ac\ud558\uace0\uc790 \ud638\ucd9c\ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. \uc785\ub825 \ud30c\ub77c\uba54\ud0c0\ub85c HTTP Server\uac00 \uc218\uc2e0\ud55c HTTP Request \uc815\ubcf4\ub97c \ud3ec\ud568\ud569\ub2c8\ub2e4. (HttpRequest \ud074\ub798\uc2a4\ub294 \ucc38\uc870\ub85c Stream \ud0c0\uc785\uc785\ub2c8\ub2e4). #1\uc5d0\uc11c\ub294 \uc218\uc2e0\ud55c \uc815\ubcf4\uc5d0\uc11c \ub2e4\uc2dc Client\uc5d0\uac8c \uc804\ub2ec\ud560 HttpResponse\ub97c \ucd94\ucd9c\ud558\ub294 \uc791\uc5c5\uc744 \ud569\ub2c8\ub2e4. \uc774\ub97c res \ubcc0\uc218\uc5d0\uc11c \uc811\uadfc \ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4. #2\uc5d0\uc11c\ub294 res \ubcc0\uc218\uc758 HTTP Response \uba54\uc2dc\uc9c0\uc758 Body\uc5d0 \ud604\uc7ac\uc758 \uc2dc\uac04 \uc815\ubcf4\uc640 &#8220;Hello World!&#8221; \ubb38\uc790\uc5f4\uc744 \uc800\uc7a5\ud569\ub2c8\ub2e4. #3\uc5d0\uc11c HttpResponse \uac1d\uccb4\uc778 res\ub97c close()\ud558\ub294\ub370, \uc774\ub294 \uc774 \ud568\uc218\uac00 \uc804\ub2ec \ubc1b\uc740 HttpRequest\uc5d0 \ub300\ud55c HttpResponse \uc0dd\uc131\uc744 \ub9c8\ucce4\uace0, HTTP Client\uc5d0\uac8c \uc804\uc1a1\ud558\ub294 \ud6a8\uacfc\ub97c \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574\uc11c HTTP Client\uc778 \uc6f9\ube0c\ub77c\uc6b0\uc800\uc5d0\ub294 &#8220;2020-02-13 16:25:59.147779: Hello World!&#8221;\uc640 \uac19\uc774 \uc2dc\uac04\uacfc \ubb38\uc790\uc5f4\uc774 \ub098\ud0c0\ub098\uac8c \ub429\ub2c8\ub2e4. \uc55e\uc73c\ub85c HTTP \uc11c\ubc84\uac00 HTTP Client\ub85c\ubd80\ud130 HTTP Get Request\ub97c \ubc1b\uc73c\uba74, \uc774 \ud568\uc218\ub97c \uac1c\uc120\ud574\uc11c \ucc98\ub9ac\ud558\ub3c4\ub85d \ud560 \uac83 \uc785\ub2c8\ub2e4.<\/p>\n\n\n\n<p>handleNotAllowedRequest() \ud568\uc218\ub294 HTTP Client\uac00 HTTP Get Request\uc678\uc758 \uc694\uccad\uc744 HTTP Server\uc5d0\uac8c \uc804\ub2ec\ud558\uc600\uc744\ub54c, Server\uac00 \uc774\ub97c \ucc98\ub9ac\ud558\uace0\uc790 \ud638\ucd9c\ud558\ub294 \ud568\uc218\uc785\ub2c8\ub2e4. handleGetRequest() \ud568\uc218\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c \uc785\ub825 \ud30c\ub77c\uba54\ud0c0\ub85c HTTP Server\uac00 \uc218\uc2e0\ud55c HTTP Request \uc815\ubcf4\ub97c \ud3ec\ud568\ud569\ub2c8\ub2e4. \uc9c0\uae08\uc740 HTTP \uc11c\ubc84\uc5d0\uc11c Get\uc5d0\ub9cc \ubc18\uc751\ud558\ub3c4\ub85d \ud558\uc600\uae30\uc5d0, Get \uc774\uc678\uc758 \ubaa8\ub4e0 \ucc98\ub9ac\ub294 \uc5ec\uae30\uc11c \ub2f4\ub2f9\ud558\uc9c0\ub9cc, \ud5a5\ud6c4 Get\uc678\uc758 \ub2e4\uc591\ud55c \uae30\ub2a5\uc5d0 \ub300\ud574\uc11c \ud504\ub85c\uadf8\ub7a8\uc744 \uc218\uc815\ud574 \uac00\uba74\uc11c, \uc774 \ud568\uc218\ub294 \uc11c\ubc84\uc5d0\uc11c \ucc98\ub9ac\ud558\uc9c0 \uc54a\ub294 \uae30\ub2a5\ub4e4\uc5d0 \ub300\ud55c \uc81c\ud55c\uc801\uc778 \ucc98\ub9ac\ub9cc \ub2f4\ub2f9\ud558\uac8c \ub420\ub420 \uac83 \uc785\ub2c8\ub2e4. \ub0b4\ubd80 \ub3d9\uc791\uc740 handleGetRequest() \ud568\uc218\uacfc \uac70\uc758 \uac19\uc73c\uba70, \ucd94\uac00\uc801\uc73c\ub85c HTTP Response \uc0c1\ud0dc \uc815\ubcf4\ub97c \ud3ec\ud568\ud558\ub3c4\ub85d \ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<p>handleRequest() \ud568\uc218\ub294 async \ud568\uc218\ub85c \uc120\uc5b8\ud558\uc600\uc73c\uba70, \uc55e\uc73c\ub85c \uc124\uba85\ud560 main()\uc5d0\uc11c HTTP Request\ub97c \uc218\uc2e0\ud558\uba74, \uc774\ub97c \uc804\ub2f4\ud558\ub294 \ud568\uc218\ub85c \ub3d9\uc791\ud569\ub2c8\ub2e4. \ub0b4\ubd80\ub294 \ubcf5\uc7a1\ud558\uc9c0 \uc54a\uc73c\uba70, HTTP Request\uc758 \ud0c0\uc785\uc5d0 \ub9de\ucdb0\uc11c, \uc704\uc5d0\uc11c \uc124\uba85\ud55c \uc801\ud569\ud55c \ud568\uc218\ub4e4\uc744 \ud638\ucd9c\ud558\uae30\ub9cc \ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<p>main() \ud568\uc218\ub294 \uc77c\ub2e8 \uc11c\ubc84\uc758 \ub124\ud2b8\uc6cc\ud06c \uc815\ubcf4\ub97c #1\uc5d0\uc11c \ubcc4\ub3c4\uc758 \uc815\uc758\ub85c \ubd84\ub9ac\ud588\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 #2\uc5d0\uc11c \uc55e\uc11c Simple \ubc84\uc804\uacfc \uac19\uc774 \ud654\uba74\uc5d0 \ubcf8\uc778\uc758 \ub124\ud2b8\uc6cc\ud06c \uc815\ubcf4\uc640 \ud568\uaed8 \ucd5c\ucd08 \ub3d9\uc791 \uc2dc\uac04\uc744 \ub098\ud0c0\ub0b4\ub3c4\ub85d \ud588\uc2b5\ub2c8\ub2e4. #3\uc740 await for \uad6c\ubb38\uc744 \uc0ac\uc6a9\ud558\uc5ec HTTP Server\uac00 \uc218\uc2e0\ud558\ub294 HTTP Request\ub4e4 \ubc0f \uae30\ud0c0 \ud544\uc694\ud55c \uc791\uc5c5\uc744 \ubc18\ubcf5\uc801\uc73c\ub85c \ud558\ub3c4\ub85d \ud558\uc600\uc73c\uba70, \ud604\uc7ac\ub294 HTTP Request \uba54\uc2dc\uc9c0\ub97c handleRequest() \ud568\uc218\uc5d0 \uc804\ub2ec\ud558\ub294 \uc5ed\ud560\ub9cc \ud569\ub2c8\ub2e4. \ud639\uc2dc \ubaa8\ub97c \uc624\ub958\uc5d0 \ub300\uc751\ud574\uc11c try &#8211; catch \uad6c\ubb38\uc73c\ub85c \uc5d0\ub7ec\uc5d0 \ub300\ud55c \ub300\uc751\uc744 \ud558\ub3c4\ub85d \ud55c \ubd80\ubd84\ub3c4 \ubcfc \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<h4>\ub9c8\ubb34\ub9ac<\/h4>\n\n\n\n<p>HTTP Client\uc640 Server\ub97c Dart \uc5b8\uc5b4\ub85c \uac1c\ubc1c\ud558\ub294 \uccab\ub2e8\ucd94\ub97c \ub07c\uc6e0\uc2b5\ub2c8\ub2e4. HTTP \uc790\uccb4\uc5d0 \ub300\ud55c \uc774\ub860\uc801 \uacf5\ubd80\ub294 \ubcc4\ub3c4\ub85c \ud574\uc57c \ud558\uba70, \ubcf8 \uae00\uc5d0\uc11c\ub294 \uac00\uc7a5 \uac04\ub2e8\ud55c Simple &#8220;Hello World!&#8221; HTTP Server\ub97c \ud1b5\ud574\uc11c, Dart \uc5b8\uc5b4\ub97c \ud1b5\ud55c HTTP \uc11c\ubc84\ub97c \uac1c\ubc1c\ud558\uae30 \uc704\ud55c \uac00\uc7a5 \uae30\ucd08\uc801\uc778 \ucf54\ub4dc\ub4e4\uc744 \uc0b4\ud3b4\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \uadf8\ub9ac\uace0 \uc810\ucc28 \uc9c0\ub2a5\uc801\uc778 \uc791\uc5c5\uc744 \ud558\uae30 \uc704\ud55c \ud615\ud0dc\ub85c \ubcc0\uacbd\ud55c Advanced &#8220;Hello World!&#8221; HTTP Server\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \ud558\ub294 \uc77c\uc740 \ub458\uc774 \ubcc4\ubc18 \ucc28\uc774\uac00 \uc5c6\uc9c0\ub9cc, \uc55e\uc73c\ub85c \uc0c8\ub85c\uc6b4 \uc0ac\ud56d\uc744 \uacf5\ubd80\ud558\uace0 \ubc18\uc601\ud560\ub54c, \uac1c\uc120\ud55c \ucf54\ub4dc\uac00 \ubcf4\ub2e4 \uae54\uae08\ud558\uac8c \uc9c4\ud654\ud558\ub294 \ubaa8\uc2b5\uc744 \ubcfc \uc218 \uc788\uc744 \uac81\ub2c8\ub2e4.<\/p>\n\n\n\n<p>\uc6b0\ub9ac\ub294 Dart \uc5b8\uc5d0\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \ucf54\uc5b4 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub9cc\uc73c\ub85c HTTP \uc11c\ubc84\ub97c \uac1c\ubc1c\ud558\ub294 \ubc29\uc2dd\uc744 \uc124\uba85 \ud558\uc600\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc81c\ub300\ub85c\ub41c HTTP \uc11c\ubc84\uc5d0\uc11c\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \uc81c\uacf5\ud574\uc57c \ud558\ub294 \uae30\uc220\uc774 \ub9e4\uc6b0 \ub9ce\uc2b5\ub2c8\ub2e4. \ub530\ub77c\uc11c HTTP \uc11c\ubc84\ub97c \uc2e4\uc81c\ub85c \uc6b4\uc601\ud558\ub294 \ub370\uc5d0 \ud544\uc694\ud55c \uae30\uc220\ub4e4\uc744 \ubbf8\ub9ac \uad6c\ud604\ud55c HTTP \uc11c\ubc84 Framework\ub4e4\uc774 \uc874\uc7ac\ud558\uba70, Dart \uc5b8\uc5b4\uc758 \uacbd\uc6b0\ub3c4 \ucd5c\uadfc \ud558\ub098 \ub458 HTTP \uc11c\ubc84 Framework \ub4e4\uc774 \ub4f1\uc7a5\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. Dart \uc5b8\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec Web \uc11c\ubc84\ub97c \uad6c\ud604\ud558\uace0 \uc6b4\uc601\ud558\uace0\uc790 \ud558\ub294 \uacbd\uc6b0\uc5d0 \ucf54\uc5b4 \ub77c\uc774\ube0c\ub7ec\ub9ac \ub9cc\uc73c\ub85c \ubd80\uc871\ud55c \uacbd\uc6b0\ub294 \uc544\ub798\uc758 \ud504\ub808\uc784\uc6cc\ud06c \ub4e4\uc744 \uc0b4\ud3b4\ubcf4\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n\n\n\n<ul><li><a href=\"https:\/\/pub.dev\/packages\/http_server\">Utility classes for HTTP server\u00a0<\/a><\/li><li><a href=\"https:\/\/aqueduct.io\/\">Aqueduct : An object-oriented, multi-threaded HTTP server framework<\/a><\/li><li><a href=\"https:\/\/angel-dart.dev\/\">Angel : A polished, production-ready backend framework<\/a><\/li><li><a href=\"https:\/\/pub.dev\/packages\/shelf\">Shelf : Web Server Middleware<\/a><\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright 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=\"138\" height=\"49\"\/><\/figure><\/div>\n\n\n\n<p><strong>Creative Commons License<\/strong> (<strong>CC BY-NC-ND<\/strong>)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>&lt; HTTP \uc11c\ubc84\uac1c\ubc1c &#8211; Basic HTTP Server &amp; Frameworks > HTTP(Hyper Transport Protocol)\uc740 90\ub144\ub300 Tim Bernas Lee \uacbd\uc5d0 \uc758\ud574\uc11c \uc81c\uc548\ub418\uace0 \ub9cc\ub4e4\uc5b4\uc84c\uc73c\uba70, \ud604\uc7ac \uc6b0\ub9ac\uac00 \uc6f9 \ud639\uc740 \uc6d4\ub4dc \uc640\uc774\ub4dc \uc6f9 \ud639\uc740 \uc778\ud130\ub137(\uc774\uac74 &#8230;<\/p>\n","protected":false},"author":1,"featured_media":978,"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":[14],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts\/654"}],"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=654"}],"version-history":[{"count":18,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts\/654\/revisions"}],"predecessor-version":[{"id":1134,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/posts\/654\/revisions\/1134"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/media\/978"}],"wp:attachment":[{"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/media?parent=654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/categories?post=654"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/mobilelab.khu.ac.kr\/wordpress\/wp-json\/wp\/v2\/tags?post=654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}