{"id":241184,"date":"2022-04-11T14:31:27","date_gmt":"2022-04-11T13:31:27","guid":{"rendered":"https:\/\/blog.jetbrains.com\/ktor\/2022\/04\/11\/ktor-2-0-released\/"},"modified":"2025-09-18T14:47:05","modified_gmt":"2025-09-18T13:47:05","slug":"ktor-2-0-released","status":"publish","type":"ktor","link":"https:\/\/blog.jetbrains.com\/ko\/ktor\/2022\/04\/11\/ktor-2-0-released\/","title":{"rendered":"Ktor 2.0 \ub9b4\ub9ac\uc2a4"},"content":{"rendered":"<p>Ktor 2.0\uc774 \ucd9c\uc2dc\ub418\uc5c8\ub2e4\ub294 \uae30\uc05c \uc18c\uc2dd\uc744 \uc804\ud574 \ub4dc\ub9bd\ub2c8\ub2e4. \uc57d 1\ub144\uc758 \uc791\uc5c5 \ub05d\uc5d0 \ub9c8\uce68\ub0b4 \uacb0\uc2e4\uc744 \ub9fa\uc5c8\uad70\uc694!&nbsp;<\/p>\n<p>Ktor 2.0\uc5d0\ub294 \ub9ce\uc740 \uc0c8\ub85c\uc6b4 \uae30\ub2a5\uc774 \ub3c4\uc785\ub418\uc5c8\uc9c0\ub9cc, \uc8fc\uc694 \ubc84\uc804\uc778 \ub9cc\ud07c \ud68d\uae30\uc801\uc778 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc801\uc6a9\ub418\uc5c8\uace0, \uc77c\ubd80 \uc720\uc9c0 \uad00\ub9ac \uc791\uc5c5\uacfc \ub354\ubd88\uc5b4 \uae30\uc874\uc5d0 \uc798\ubabb\ub41c \uacb0\uc815\uc744 \ucca0\ud68c\ud558\ub294 \uae30\ud68c\ub85c\ub3c4 \uc0bc\uc558\uc2b5\ub2c8\ub2e4. \ub300\ub300\uc801\uc778 \ubcc0\uacbd\uc774 \uc788\uc5c8\uc9c0\ub9cc \uc774\ub97c \ucd5c\uc18c\ud654\ud558\ub824\uace0 \ub178\ub825\ud588\uace0 \uc790\ub3d9\ud654\ub41c \ub9c8\uc774\uadf8\ub808\uc774\uc158\uc5d0 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\ub294 \uc77c\ubd80 \uc9c0\uc6d0 \ub3c4\uad6c\ub3c4 \uc81c\uacf5\ub418\ub2c8 \uc5fc\ub824\ud558\uc9c0 \ub9c8\uc138\uc694. \uba3c\uc800 \uba87 \uac00\uc9c0 \uc0c8\ub85c\uc6b4 \uae30\ub2a5\uc744 \uc0b4\ud3b4\ubcf4\uace0 \uadf8 \ubc16\uc758 \ub0b4\uc6a9\uc740 \ub098\uc911\uc5d0 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\ub3c4\ub85d \ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>Ktor \uc11c\ubc84<\/h2>\n<h3>\ub2e8\uc21c\ud654\ub41c \ud655\uc7a5\uc131<\/h3>\n<p>Ktor\ub97c \ube4c\ub4dc\ud560 \ub54c\ub294 \ud56d\uc0c1 \ud655\uc7a5\uc131\uc744 \uc5fc\ub450\uc5d0 \ub461\ub2c8\ub2e4. \ucc98\uc74c\uc5d0\ub294 \uae30\ub2a5\uc774\ub77c\uace0 \ubd88\ub800\uace0 \uc9c0\uae08\uc740 \ud50c\ub7ec\uadf8\uc778\uc73c\ub85c \uc774\ub984\uc774 \ubc14\ub00c\uc5c8\uc9c0\ub9cc, Ktor\uac00 \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uae30\ub2a5\uc740 \ud50c\ub7ec\uadf8\uc778 \uc544\ud0a4\ud14d\ucc98\ub97c \uc0ac\uc6a9\ud558\uc5ec \ube4c\ub4dc\ub429\ub2c8\ub2e4(\uc774\ub984\uc774 \ubc14\ub010 \uc774\uc720\uac00 \ub0a9\ub4dd\ub418\uc2dc\uc8e0?). \uc774\ub54c \uc81c\uae30\ub41c \ubb38\uc81c\ub294 \uc5b4\ub5a4 \uc0ac\ub78c\ub4e4\uc5d0\uac8c\ub294 \uadf8 \uc774\uba74\uc5d0 \uc788\ub294 \uc544\ud0a4\ud14d\ucc98 \ubaa8\ub378\uc774 \ub09c\ud574\ud558\ub2e4\ub294 \uac83\uc774\uc5c8\uc2b5\ub2c8\ub2e4. Ktor 2.0\uc5d0\uc11c\ub294 \ud655\uc7a5\uc131 API\ub97c \ub300\ud3ed \uac04\uc18c\ud654\ud558\uc5ec \ud50c\ub7ec\uadf8\uc778\uc744 \ud6e8\uc52c \uc27d\uac8c \ub9cc\ub4e4 \uc218 \uc788\ub3c4\ub85d \ud588\uc2b5\ub2c8\ub2e4.&nbsp;<\/p>\n<p>1.x\uc758 \ub2e4\uc74c API \ucf54\ub4dc\ub97c \uc0b4\ud3b4\ubcf4\uc138\uc694.<\/p>\n<pre class=\"EnlighterJSRAW\">companion object Feature : ApplicationFeature&lt;ApplicationCallPipeline, CustomHeader.Configuration, CustomHeader&gt; {\n    override val key = AttributeKey&lt;CustomHeader&gt;(\"CustomPlugin\")\n    override fun install(pipeline: ApplicationCallPipeline, configure: Configuration.() -&gt; Unit): CustomHeader {\n       val configuration = Configuration().apply(configure)\n\n       val feature = CustomHeader(configuration)\n\n       pipeline.intercept(ApplicationCallPipeline.Call) {\n\n            feature.intercept(this)\n        }\n\n       return feature\n    }\n}<\/pre>\n<p>2.0\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ubc14\ub00c\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\">val myCustomPlugin = createApplicationPlugin(\"CustomPlugin\") {\n    onCall {\n\n    }\n\n    onCallReceive {\n\n    }\n\n    onCallRespond {\n\n    }\n}<\/pre>\n<p>\uae30\uc874 \ud50c\ub7ec\uadf8\uc778\uc758 \ub300\ubd80\ubd84\uc740 \uc0c8 API\ub97c \uc0ac\uc6a9\ud558\ub3c4\ub85d \ubcc0\ud658\ub418\uc5c8\uc73c\uba70 \ub300\ubd80\ubd84\uc758 \uc0c1\ud669\uc744 \ud3ec\uad04\ud560 \uc218 \uc788\uc744 \uac83\uc73c\ub85c \ud655\uc2e0\ud569\ub2c8\ub2e4. \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 <a href=\"https:\/\/github.com\/ktorio\/ktor-documentation\/blob\/2.0.0\/codeSnippets\/snippets\/custom-plugin-base-api\/src\/main\/kotlin\/com\/example\/plugins\/CustomHeader.kt\" target=\"_blank\" rel=\"noopener\">\uc774\uc804<\/a> API\uc5d0\uc11c <a href=\"https:\/\/github.com\/ktorio\/ktor-documentation\/blob\/2.0.0\/codeSnippets\/snippets\/custom-plugin\/src\/main\/kotlin\/com\/example\/plugins\/CustomHeaderPlugin.kt\" target=\"_blank\" rel=\"noopener\">\uc0c8<\/a> API\ub85c\uc758 &#8216;CustomHeader&#8217; \ud50c\ub7ec\uadf8\uc778 \ubcc0\ud658\uacfc <a href=\"https:\/\/ktor.io\/docs\/custom-plugins.html\" target=\"_blank\" rel=\"noopener\">\ud50c\ub7ec\uadf8\uc778 \uac1c\ubc1c \ubb38\uc11c<\/a>\ub97c \ud655\uc778\ud558\uc138\uc694.<\/p>\n<p>\ud5a5\ud6c4 \ub9c8\ucf13\ud50c\ub808\uc774\uc2a4\uc5d0\uc11c \ud50c\ub7ec\uadf8\uc778\uc744 \uc27d\uac8c \uac8c\uc2dc\ud558\uace0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uae30\ub2a5 \ub4f1 \ud655\uc7a5\uc131\uacfc \uad00\ub828\ud558\uc5ec \ud6e8\uc52c \ub354 \ub9ce\uc740 \uac83\uc774 \uc900\ube44\ub420 \uc608\uc815\uc785\ub2c8\ub2e4.&nbsp;<\/p>\n<h3>Native \uc9c0\uc6d0<\/h3>\n<p>\uc774\uc81c \uc11c\ubc84 \uce21\uc5d0\uc11c GraalVM(\uc774\ubbf8 1.6\ubd80\ud130 \uc9c0\uc6d0\ub428) \uc678\uc5d0 Kotlin\/Native\ub97c \uc9c0\uc6d0\ud558\uc5ec, \ub3c5\ub9bd\ud615 \uc11c\ubc84 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uacfc \uad00\ub828\ud558\uc5ec \ub450 \uac00\uc9c0 \uc635\uc158\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4.&nbsp;<\/p>\n<p>\ud604\uc7ac Kotin\/Native \uc9c0\uc6d0\uc740 CIO\ub97c \uc5d4\uc9c4\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 \uac83\uc73c\ub85c \uc81c\ud55c\ub418\uc5b4 \uc788\uc73c\uba70 \uc131\ub2a5 \uac1c\uc120\uc744 \uc704\ud55c \ub178\ub825\uc744 \uacc4\uc18d\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ub2e8, \uc0c8\ub85c\uc6b4 Kotlin\/Native \uba54\ubaa8\ub9ac \ubaa8\ub378\uc744 \uc0ac\uc6a9\ud560 \uac83\uc744 \uac15\ub825\ud788 \uad8c\uc7a5\ud569\ub2c8\ub2e4.&nbsp;<\/p>\n<h3>\uae30\ud0c0 \uc11c\ubc84 \uac1c\uc120 \uc0ac\ud56d<\/h3>\n<p>\ub610\ud55c \ubb34\uc791\uc704 \ud3ec\ud2b8 \uc9c0\uc6d0\uc744 \ud3ec\ud568\ud558\uc5ec Ktor \uc11c\ubc84\uc640 \uad00\ub828\ud55c \uc77c\ub828\uc758 \ubd80\uc218\uc801\uc778 \uac1c\uc120\uc774 \uc774\ub8e8\uc5b4\uc84c\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\">fun main() {\n    embeddedServer(Netty, port = 0) {\n        configureRouting()\n    }.start(wait = true)\n}<\/pre>\n<p>\ubfd0\ub9cc \uc544\ub2c8\ub77c \ud14c\uc2a4\ud2b8 API \uac1c\uc120, Type-safe \ub77c\uc6b0\ud305, XML \uc9c1\ub82c\ud654, \ud50c\ub7ec\uadf8\uc778\uc6a9 \ud558\uc704 \uacbd\ub85c, 60\uac1c \uc774\uc0c1\uc758 <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KTOR?q=%23Server%20Target%20release:%202.0.0%20%23Resolved%20\" target=\"_blank\" rel=\"noopener\">\ubc84\uadf8 \uc218\uc815 \ubc0f \uae30\ud0c0 \uae30\ub2a5<\/a>\uc774 \ub3c4\uc785\ub418\uc5c8\uc2b5\ub2c8\ub2e4.&nbsp;<\/p>\n<h2>Ktor \ud074\ub77c\uc774\uc5b8\ud2b8<\/h2>\n<h3>\uac04\uc18c\ud654\ub41c API<\/h3>\n<p>API\uc758 \ub2e8\uc21c\ud654 \uc791\uc5c5\uc744 \uacc4\uc18d\ud558\uc5ec, Ktor \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uacbd\uc6b0 \uc77c\ubc18\uc801\uc778 HTTP \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ub294 \uc0c8\ub85c\uc6b4 API\ub97c \ub3c4\uc785\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\">val result = client.post(\"http:\/\/127.0.0.1:$port\/\") {\n\n}\nresult.bodyAsText()<\/pre>\n<p>\uc81c\ub124\ub9ad <em>post&lt;T&gt;, get&lt;T&gt;<\/em> \uba54\uc11c\ub4dc\ub97c \uc5c6\uc574\uc2b5\ub2c8\ub2e4. \uc774\uc81c \ubcf8\ubb38(&#8216;bodyAsText&#8217;, &#8216;bodyAsChannel&#8217; \ud3ec\ud568)\ubfd0\ub9cc \uc544\ub2c8\ub77c \ud5e4\ub354\uc5d0\ub3c4 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\ub294 &#8216;HttpResponse&#8217;\ub97c \ubaa8\ub450 \ubc18\ud658\ud569\ub2c8\ub2e4.<\/p>\n<h3>\uc7ac\uc2dc\ub3c4<\/h3>\n<p>\uc774\uc81c \uc7ac\uc2dc\ub3c4 \uc0ac\uc774\uc758 \uc2dc\uac04 \uc870\uc815\uc744 \ud3ec\ud568\ud558\uc5ec \uc7ac\uc2dc\ub3c4\uc5d0 \ub300\ud55c \uc9c0\uc6d0\uc774 \uae30\ubcf8 \uc81c\uacf5\ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\">val client = HttpClient(CIO) {\n    install(HttpRequestRetry) {\n        maxRetries = 5\n        retryIf { request, response -&gt;\n            !response.status.isSuccess()\n        }\n        retryOnExceptionIf { _, cause -&gt;\n            cause is NetworkError\n        }\n        delayMillis { retry -&gt;\n            retry * 3000L\n        } \/\/ retries in 3, 6, 9, etc. seconds\n    }\n}<\/pre>\n<h3>\ucf58\ud150\uce20 \ud611\uc0c1<\/h3>\n<p>\uc11c\ubc84\uc5d0\uc11c \ucf58\ud150\uce20 \ud611\uc0c1 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud574 \uc654\ub2e4\uba74 \uc774\uac83\uc774 \ubb34\uc5c7\uc774\uba70 \uc5b4\ub5bb\uac8c \uc791\ub3d9\ud558\ub294\uc9c0 \uc774\ubbf8 \uc798 \uc54c\uace0 \uc788\uc744 \uac83\uc785\ub2c8\ub2e4. \uc774\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84\uac00 \uc694\uccad\ud558\uace0 \uc81c\uacf5\ud560 \uc218 \uc788\ub294 \ub2e4\uc591\ud55c \uc720\ud615\uc758 \ucf58\ud150\uce20\ub97c \ud611\uc0c1\ud558\ub294 \uae30\ub2a5\uc785\ub2c8\ub2e4. \uc774\uc640 \uad00\ub828\ub41c \ud611\uc0c1 \uce21\uba74\uc740 \uc9c0\uae08\uae4c\uc9c0 \uc11c\ubc84\uc5d0\uc11c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5c8\uc9c0\ub9cc \uc774\uc81c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c\ub3c4 \uac00\ub2a5\ud574\uc84c\uc2b5\ub2c8\ub2e4!<\/p>\n<pre class=\"EnlighterJSRAW\">val client = HttpClient(CIO) {\n    install(ContentNegotiation) {\n    }\n}<\/pre>\n<p>\uc774 \ud50c\ub7ec\uadf8\uc778\uc740 &#8216;JsonFeature&#8217;\ub97c \ud6a8\uacfc\uc801\uc73c\ub85c \ub300\uccb4\ud588\uc2b5\ub2c8\ub2e4.&nbsp;<\/p>\n<h3>\uae30\ud0c0 \ud074\ub77c\uc774\uc5b8\ud2b8 \uac1c\uc120 \uc0ac\ud56d<\/h3>\n<p>\uc704\uc758 \ub0b4\uc6a9 \uc678\uc5d0\ub3c4 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\ub294 &#8216;basic()&#8217; \ubc0f &#8216;bearer()&#8217; \ud5ec\ud37c \uae30\ub2a5\uacfc \uac19\uc740 \uc778\uc99d\uc744 \uc704\ud55c \ubc14\ub85c\uac00\uae30 API\ubfd0\ub9cc \uc544\ub2c8\ub77c \uc694\uccad \uc218\uc900\uc758 \uc778\ud130\uc149\ud130, \uc0c8\ub85c\uc6b4 \uba54\ud2b8\ub9ad \ud50c\ub7ec\uadf8\uc778, XML \uc9c1\ub82c\ud654 \ubc0f <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KTOR?q=%23Client%20%20Target%20release:%202.0.0%20%23Resolved%20\" target=\"_blank\" rel=\"noopener\">\ub9ce\uc740 \ubc84\uadf8 \uc218\uc815\uacfc \uae30\ud0c0 \uae30\ub2a5<\/a>\ub3c4 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>Ktor 2.0\uc73c\ub85c \ub9c8\uc774\uadf8\ub808\uc774\uc158<\/h2>\n<p>Ktor\uc640 \uad00\ub828\ub41c \ud55c \uac00\uc9c0 \ubb38\uc81c\ub294 \ubaa8\ub4c8\uacfc \ud328\ud0a4\uc9c0 \uc774\ub984\uc774 \uc77c\uce58\ud558\uc9c0 \uc54a\ub294\ub2e4\ub294 \uac83\uc774\uc5c8\uc2b5\ub2c8\ub2e4. \uc77c\ubd80\uc5d0\ub294 \uc811\ub450\uc0ac <em>server<\/em>\uac00 \uc788\uc5c8\uace0 \uc77c\ubd80\uc5d0\ub294 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4. \uc77c\ubd80\ub294 \uc11c\ubc84\uc640 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uc791\ub3d9\ud588\uc9c0\ub9cc \uc811\ub450\uc0ac\ub294 \uc804\ud600 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4. \ub610\ud55c \ub2e8\uc77c \ubaa8\ub4c8\uc5d0 \uc5ec\ub7ec \ud50c\ub7ec\uadf8\uc778\uc774 \uc788\uc5b4\uc11c \uac80\uc0c9\uc774 \ubc88\uac70\ub85c\uc6e0\uc2b5\ub2c8\ub2e4.&nbsp;<\/p>\n<p>\ud558\uc9c0\ub9cc \uc8fc\uc694 \ubc84\uc804\uc73c\ub85c \ubcc0\uacbd\ud558\uba74\uc11c \ubaa8\ub4c8 \ubc0f \ud328\ud0a4\uc9c0\uc640 \uad00\ub828\ud558\uc5ec \uc77c\uad00\ub41c \uba85\uba85 \uaddc\uce59\uc744 \ub3c4\uc785\ud588\uc2b5\ub2c8\ub2e4. \uc55e\uc73c\ub85c\ub294 \uc11c\ubc84\uc5d0\ub9cc \uad00\ub828\ub41c \ubaa8\ub4e0 \ud56d\ubaa9\uc5d0 <em>server<\/em> \uc811\ub450\uc0ac\uac00 \ubd99\uac8c \ub429\ub2c8\ub2e4. \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uacbd\uc6b0\uc5d0\ub294 <em>client<\/em> \uc811\ub450\uc0ac\uac00 \ubd99\uc2b5\ub2c8\ub2e4. \uc77c\ubc18 \ud328\ud0a4\uc9c0\uc5d0\ub294 \uc811\ub450\uc0ac\uac00 \ubd99\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ub610\ud55c \ud50c\ub7ec\uadf8\uc778\uc740 \uc774\uc81c \uc790\uccb4 \ubaa8\ub4c8\uc5d0 \ud3ec\ud568\ub429\ub2c8\ub2e4.&nbsp;<\/p>\n<pre class=\"EnlighterJSRAW\">import io.ktor.server.application.*\nimport io.ktor.server.request.*\nimport io.ktor.server.response.*\nimport io.ktor.client.request.*\nimport io.ktor.client.statement.*\nimport io.ktor.http.content.*\nimport io.ktor.util.*\nimport io.ktor.utils.io.*<\/pre>\n<p>\ubaa8\ub4c8 \uc774\ub984\ub3c4 \ub9c8\ucc2c\uac00\uc9c0\uc785\ub2c8\ub2e4.&nbsp;<\/p>\n<pre class=\"EnlighterJSRAW\">implementation \"io.ktor:ktor-server-auth:$ktor_version\"\nimplementation \"io.ktor:ktor-server-default-headers:$ktor_version\"\nimplementation \"io.ktor:ktor-server-sessions:$ktor_version\"\nimplementation \"io.ktor:ktor-server-status-pages:$ktor_version\"\nimplementation \"io.ktor:ktor-server-cors:$ktor_version\"\nimplementation \"io.ktor:ktor-server-conditional-headers:$ktor_version\"<\/pre>\n<p>\ub9c8\uc774\uadf8\ub808\uc774\uc158\uc744 \ub3d5\uae30 \uc704\ud574 <a href=\"https:\/\/ktor.io\/docs\/migrating-2.html\" target=\"_blank\" rel=\"noopener\">\ub9e4\ud551 \ubb38\uc11c<\/a>\ubfd0\ub9cc \uc544\ub2c8\ub77c <a href=\"https:\/\/ktor.io\/idea\/\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a>\uc640 \ud568\uaed8 Ktor \ud504\ub85c\uc81d\ud2b8\uc758 \uc790\ub3d9 \ub9c8\uc774\uadf8\ub808\uc774\uc158\uc744 \uc2dc\ub3c4\ud558\ub294 \ub9c8\uc774\uadf8\ub808\uc774\uc158 \ub3c4\uad6c\ub3c4 \uc81c\uacf5\ud569\ub2c8\ub2e4(\ub2e8, Kotlin Multiplatform \ud504\ub85c\uc81d\ud2b8\ub294 \ud604\uc7ac \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc74c).<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/R2r5aUMoMKy3PEh7TNHzSvPZqE7ybY6hLwW-hRA7Mi71o5I6YmMDzXmggxqg2nWNsdWH1yMulHjCeo-PaPN_ouLodqzxstSkyApYKPPUHg0AXoAzCm0ldNGvTuLNdAHOd-9UhEip.png\" alt=\"\"><\/figure>\n<h2>Kotlin 1.6.20 \uc9c0\uc6d0 \ubc0f \ucd5c\uc2e0 \ubb38\uc11c<\/h2>\n<p>Kotlin\uc758 \ucd5c\uc2e0 \ub9b4\ub9ac\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \ubd84\ub4e4\uc740 Ktor 2.0\uc774 1.6.20\uacfc \ud638\ud658\ub41c\ub2e4\ub294 \uc810\uc744 \uc54c\uc544\ub450\uc138\uc694. \ub610\ud55c \ubaa8\ub4e0 \ubcc0\uacbd \uc0ac\ud56d\uc5d0 \ube60\ub974\uac8c \uc775\uc219\ud574\uc9c8 \uc218 \uc788\ub3c4\ub85d Ktor\uc5d0 \ub300\ud55c <a href=\"https:\/\/ktor.io\/docs\/welcome.html\" target=\"_blank\" rel=\"noopener\">\ubb38\uc11c<\/a> \uc791\uc5c5\uc744 \uacc4\uc18d\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc55e\uc73c\ub85c API \ubb38\uc11c \uac1c\uc120\uc744 \uc704\ud55c \ub178\ub825\ub3c4 \uae30\uc6b8\uc77c \uc608\uc815\uc785\ub2c8\ub2e4.&nbsp;<\/p>\n<p>2.0 \ubc84\uc804\uc758 \uc804\uccb4 \uae30\ub2a5 \ubaa9\ub85d\uc740 <a href=\"https:\/\/ktor.io\/changelog\/2.0\/\" target=\"_blank\" rel=\"noopener\">\ubcc0\uacbd \ub85c\uadf8<\/a>\ub97c \ud655\uc778\ud558\uc138\uc694. \uadf8\ub9ac\uace0 \uc624\ub298 \ubc14\ub85c \uccab \ubc88\uc9f8 Ktor 2.0\uc744 <a href=\"https:\/\/ktor.io\/create\/\" target=\"_blank\" rel=\"noopener\">\ub9cc\ub4e4\uc5b4\ubcf4\uc138\uc694<\/a>!&nbsp;<\/p>\n<p><em>\uac8c\uc2dc\ubb3c \uc6d0\ubb38 \uc791\uc131\uc790<\/em><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n\n\n<p><\/p>\n","protected":false},"author":964,"featured_media":0,"comment_status":"closed","ping_status":"closed","template":"","categories":[],"tags":[],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/ktor\/241184"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/ktor"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/types\/ktor"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/users\/964"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/comments?post=241184"}],"version-history":[{"count":6,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/ktor\/241184\/revisions"}],"predecessor-version":[{"id":633015,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/ktor\/241184\/revisions\/633015"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=241184"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=241184"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=241184"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=241184"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}