{"id":292508,"date":"2022-10-31T06:22:14","date_gmt":"2022-10-31T05:22:14","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=292508"},"modified":"2022-10-31T06:37:48","modified_gmt":"2022-10-31T05:37:48","slug":"compose-multiplatform-1-2-is-out","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/ko\/kotlin\/2022\/10\/compose-multiplatform-1-2-is-out\/","title":{"rendered":"Compose Multiplatform 1.2 \ucd9c\uc2dc: \uc0c8\ub85c\uc6b4 \ub9c8\uc6b0\uc2a4 \ubc0f \ud0a4\ubcf4\ub4dc API, ProGuard \uc9c0\uc6d0, \uc628\ub77c\uc778 \uc5c5\ub370\uc774\ud2b8 \ub4f1"},"content":{"rendered":"<p>\uc774\uc81c Compose Multiplatform 1.2\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4! Kotlin\uc744 \uc704\ud55c \uc120\uc5b8\uc801 UI \ud504\ub808\uc784\uc6cc\ud06c\uc758 \uc774 \ucd5c\uc2e0 \ubc84\uc804\uc740 \ucd5c\uc2e0 Kotlin \ubc84\uc804\uacfc \ud638\ud658\ub418\uba70 \ub370\uc2a4\ud06c\ud1b1 \ub300\uc0c1\uc744 \uc704\ud55c \uba87 \uac00\uc9c0 \uac15\ub825\ud55c \uae30\ub2a5\uc774 \ub3c4\uc785\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uad6c\uccb4\uc801\uc73c\ub85c \uc8fc\uc694 \uae30\ub2a5\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li><a href=\"#proguard\">\uc0c8\ub85c \ucd94\uac00\ub41c ProGuard \uc9c0\uc6d0<\/a>\uc744 \ud1b5\ud574 \uc804\ub2ec\ud558\uae30 \uc804\uc5d0 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ucd95\uc18c\ud558\uace0 \ub09c\ub3c5\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ud3ec\ucee4\uc2a4 \uad00\ub9ac\uac00 \uac1c\uc120\ub418\uc5b4 \uc591\uc2dd \uc694\uc18c\uc758 <a href=\"#keyboard\">\ud0a4\ubcf4\ub4dc \ud0d0\uc0c9\uc774 \ub354\uc6b1 \uc6a9\uc774\ud574\uc84c\uc2b5\ub2c8\ub2e4<\/a>.<\/li>\n<li>\ub9c8\uc6b0\uc2a4 \ubc0f \ud0a4\ubcf4\ub4dc \uc785\ub825\uc744 \ucc98\ub9ac\ud558\ub294 API\uac00 \uac1c\uc120\ub418\uc5b4 \ud074\ub9ad\uacfc \ub4dc\ub798\uadf8\ub85c \uc791\ub3d9\ud558\ub294 \uc561\uc158\uc744 \ub354 \ud3b8\ub9ac\ud558\uac8c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ub808\uc774\uc544\uc6c3 \ubc0f \uc785\ub825 \ud544\ub4dc\uc5d0\uc11c <a href=\"#rtl\">\uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd\uc73c\ub85c \uc4f0\ub294 \uc5b8\uc5b4(RTL)\uc5d0 \ub300\ud55c \uacf5\uc2dd \uc9c0\uc6d0<\/a>\uc744 \ub3c4\uc785\ud588\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ud3ec\ucee4\uc2a4 \uad00\ub9ac\uc640 \ucee8\ud14d\uc2a4\ud2b8 \uba54\ub274\ub97c \uc704\ud55c <a href=\"#swing\">Swing \uc0c1\ud638 \uc6b4\uc6a9\uc131<\/a>\uc774 \ub354\uc6b1 \uc6d0\ud65c\ud574\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>Compose Gradle \ud50c\ub7ec\uadf8\uc778\uc758 \ub300\uc548\uc73c\ub85c \uc774\uc81c <a href=\"#conveyor\">\ud0c0\uc0ac \ub3c4\uad6c\uc778 Hydraulic Conveyor<\/a>\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc2a4\ud06c\ud1b1 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ud328\ud0a4\uc9d5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud558\uba74 \ub2e4\uc6b4\ub85c\ub4dc \ud398\uc774\uc9c0\ub97c \uc27d\uac8c \ube4c\ub4dc\ud558\uace0 \uc5ec\ub7ec \ud50c\ub7ab\ud3fc\uc5d0 \ub300\ud574 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uacf5\uc99d\uc744 \uc81c\uacf5\ud558\uba70 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \uc790\ub3d9 \uc5c5\ub370\uc774\ud2b8 \uae30\ub2a5\uc744 \ud1b5\ud569\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>Compose Multiplatform 1.2\uc758 \uc0c8\ub85c\uc6b4 \uae30\ub2a5\uc744 \uc790\uc138\ud788 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4!<\/p>\n<p align=\"center\"><a class=\"ek-link jb-download-button\" title=\"CTA\" href=\"https:\/\/www.jetbrains.com\/ko-kr\/lp\/compose-mpp\/\" target=\"_blank\" rel=\"noopener\">Compose Multiplatform \uc6f9\uc0ac\uc774\ud2b8 \ud0d0\uc0c9<\/a><\/p>\n<h2 id=\"proguard\"><span id=\"Support_for_the_ProGuard_optimizer_and_obfuscator\" class=\"ez-toc-section\"><\/span>ProGuard \ucd5c\uc801\ud654 \ubc0f \ub09c\ub3c5\ud654 \ub3c4\uad6c \uc9c0\uc6d0<\/h2>\n<p>\ucd5c\uc2e0 \ubc84\uc804\uc758 Compose Multiplatform\ubd80\ud130 \uc774\uc81c <a href=\"https:\/\/www.guardsquare.com\/proguard\" target=\"_blank\" rel=\"noopener\">ProGuard<\/a>\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud2b9\ubcc4\ud55c \uad6c\uc131\uc744 \uc81c\uacf5\ud558\uc9c0 \uc54a\uace0\ub3c4 \ubc88\ub4e4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc131\ub2a5\uacfc \ud06c\uae30\ub97c \uac1c\uc120\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. ProGuard\ub294 \ucd5c\uc801\ud654 \uae30\uc220\ub85c \ucf54\ub4dc\ub97c \ucd95\uc18c\ud558\uc5ec \ucd5c\uc885 \ubc14\uc774\ub108\ub9ac\uc758 \ud06c\uae30\ub97c \uc904\uc785\ub2c8\ub2e4. \ub610\ud55c \ucf54\ub4dc \ucd5c\uc801\ud654\ub97c \ud1b5\ud574 \ubd88\ud544\uc694\ud55c \ud568\uc218 \ud638\ucd9c\uc774\ub098 \uac1d\uccb4 \ub300\uc785\uc744 \uc81c\uac70\ud558\uc5ec \uc131\ub2a5\uc744 \uc870\uae08 \ub354 \ud5a5\uc0c1\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud544\uc694\ub2e4\uba74 \uc0ac\uc6a9\uc790\uac00 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ucf54\ub4dc \ub09c\ub3c5\ud654\ub97c \uc801\uc6a9\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub0b4\ubd80 \ud14c\uc2a4\ud2b8 \uacb0\uacfc, ProGuard\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ucc98\ub9ac\ud558\uba74 \uc0d8\ud50c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ucd5c\uc885 \ubc30\ud3ec \ud06c\uae30\uac00 \ud06c\uac8c \uc904\uc5b4\ub4dc\ub294 \uac83\uc73c\ub85c \ub098\ud0c0\ub0ac\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-285632\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/10\/proguard-1200x741.png\" alt=\"\uc0d8\ud50c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 ProGuard\ub97c \uc0ac\uc6a9\ud558\uba74 \uc124\uce58\ub41c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ubc88\ub4e4 \ud06c\uae30\uac00 136MiB\uc5d0\uc11c 91MiB\ub85c \ud06c\uac8c \uc904\uc5b4\ub4ed\ub2c8\ub2e4.\" width=\"1200\" height=\"741\"><\/figure>\n<p>\ud504\ub85c\uc81d\ud2b8\uc5d0 \ub300\ud55c Gradle \uad6c\uc131\uc5d0\uc11c \uc635\uc158\uc744 \uc9c0\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \uc0c8\ub85c\uc6b4 <code>runReleaseDistributable<\/code> \ubc0f <code>packageRelease&lt;PACKAGE_FORMAT&gt;<\/code> \uc791\uc5c5\uc744 \uc0ac\uc6a9\ud558\uc5ec ProGuard\ub85c \ucf54\ub4dc\ub97c \ucc98\ub9ac\ud558\uace0 \uc774\ud6c4\uc5d0 \uc2e4\ud589\ud558\uac70\ub098 \ud328\ud0a4\uc9d5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3><span id=\"Providing_custom_ProGuard_rules\" class=\"ez-toc-section\"><\/span>\uc0ac\uc6a9\uc790 \uc815\uc758 ProGuard \uaddc\uce59 \uc81c\uacf5<\/h3>\n<p>\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ub9ac\ud50c\ub809\uc158\uc744 \uc0ac\uc6a9\ud558\uac70\ub098 \ub7f0\ud0c0\uc784\uc5d0 \ubc14\uc774\ud2b8\ucf54\ub4dc\ub97c \uc0dd\uc131\ud558\ub294 \uacbd\uc6b0, \ucd5c\uc801\ud654 \ud504\ub85c\uc138\uc2a4 \uc911\uc5d0 \uc81c\uac70\ud574\uc11c\ub294 \uc548 \ub418\ub294 \ud074\ub798\uc2a4\uc5d0 \ub300\ud55c \uc9c0\uce68\uc744 ProGuard\uc5d0 \uc81c\uacf5\ud574\uc57c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 <a href=\"https:\/\/www.guardsquare.com\/manual\/configuration\/usage\" target=\"_blank\" rel=\"noopener\">\ud45c\uc900 ProGuard \uad6c\uc131 \ud30c\uc77c<\/a>\uc744 \uc81c\uacf5\ud558\uace0 <code>buildTypes.release.proguard<\/code> \ube14\ub85d\uc758 Gradle \ube4c\ub4dc \ud30c\uc77c\uc5d0\uc11c \uc774\ub97c \uad6c\uc131\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br&gt;\ncompose.desktop {&lt;br&gt;\n    application {&lt;br&gt;\n        \/\/ ...&lt;br&gt;\n        buildTypes.release.proguard {&lt;br&gt;\n            configurationFiles.from(&quot;rules.pro&quot;)&lt;br&gt;\n        }&lt;br&gt;\n    }&lt;br&gt;\n}<\/pre>\n<p>Compose Multiplatform\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 ProGuard \ud1b5\ud569 \uae30\ub2a5\uc744 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\ub824\uba74 GitHub \uc800\uc7a5\uc18c\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 <a href=\"https:\/\/github.com\/JetBrains\/compose-jb\/tree\/master\/gradle-plugins\/compose\/src\/test\/test-projects\/application\/proguard\" target=\"_blank\" rel=\"noopener\">\uc608\uc2dc \ud504\ub85c\uc81d\ud2b8<\/a>\ub97c \uc0b4\ud3b4\ubcf4\uc138\uc694.<\/p>\n<h2 id=\"keyboard\"><span id=\"Improved_focus_management_for_keyboard_navigation\" class=\"ez-toc-section\"><\/span>\ud0a4\ubcf4\ub4dc \ud0d0\uc0c9\uc744 \uc704\ud55c \ud5a5\uc0c1\ub41c \ud3ec\ucee4\uc2a4 \uad00\ub9ac<\/h2>\n<p>UI \uc694\uc18c\uc758 \ud3ec\ucee4\uc2a4\ub97c \uad00\ub9ac\ud558\ub294 \ubd80\ubd84\uc5d0\uc11c \uc77c\ubd80 \ub3d9\uc791\uc744 \uc0c8\ub86d\uac8c \uac1c\uc120\ud558\uc5ec \uc0ac\uc6a9\uc790\uac00 \ud0a4\ubcf4\ub4dc \ub2e8\ucd95\ud0a4\ub85c \uc694\uc18c\uc640 \uc785\ub825\uc744 \ubcf4\ub2e4 \ud6a8\uacfc\uc801\uc73c\ub85c \ud0d0\uc0c9\ud558\ub3c4\ub85d \ud588\uc2b5\ub2c8\ub2e4. \ud074\ub9ad \uac00\ub2a5\ud55c \uc694\uc18c\uc640 \ud1a0\uae00 \uac00\ub2a5\ud55c \uc694\uc18c(\uc81c\uc5b4\uc790 <code>Modifier.clickable<\/code> \ubc0f <code>Modifier.toggleable<\/code> \ud3ec\ud568)\uac00 \uc774\uc81c \ud074\ub9ad \uc2dc \ud3ec\ucee4\uc2a4\ub97c \uc694\uccad\ud558\ubbc0\ub85c \ud3ec\ucee4\uc2a4 \uac00\ub2a5\ud55c \ud56d\ubaa9 \uac04\uc758 \ud0d0\uc0c9\uc774 \uc0ac\uc6a9\uc790\uac00 \uc608\uc0c1\ud558\ub294 \ub300\ub85c \uc791\ub3d9\ud569\ub2c8\ub2e4(\ud074\ub9ad \ud6c4 \ud3ec\ucee4\uc2a4 \uac00\ub2a5\ud55c \ub2e4\uc74c \ud56d\ubaa9 \uc120\ud0dd). \ub610\ud55c \uc694\uc18c\uc5d0 \ud3ec\ucee4\uc2a4\uac00 \ub9de\ucdb0\uc9c0\uba74 \uae30\ubcf8\uc801\uc73c\ub85c \ud0a4\ubcf4\ub4dc \ub2e8\ucd95\ud0a4\ub97c \ub354 \uc27d\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ud558\ub294 \uc0c8\ub85c\uc6b4 \ub3d9\uc791\ub3c4 \ub3c4\uc785\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li><code>Modifier.toggleable<\/code>\ub85c \ud45c\uc2dc\ub41c \ucef4\ud3ec\uc800\ube14\uc740 \uc774\uc81c \uc2a4\ud398\uc774\uc2a4\ubc14\ub97c \uc0ac\uc6a9\ud558\uc5ec \ucf1c\uace0 \ub04c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li><code>Slider<\/code> \ucef4\ud3ec\uc800\ube14\uc740 \uc774\uc81c \ubc29\ud5a5\ud0a4(\ud55c \ubc88\uc5d0 \ud55c \ub2e8\uacc4\uc529 \uac12 \uc99d\uac00), Page Up \ubc0f Page Down \ud0a4(\ud55c \ubc88\uc5d0 \uac12 \ubc94\uc704\uc758 10% \uc774\ub3d9), \uadf8\ub9ac\uace0 Home \ubc0f End \ud0a4(\uac12\uc744 \uac01 \ubc94\uc704\uc758 0% \ub610\ub294 100%\ub85c \uc124\uc815)\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc81c\uc5b4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li><code>DropDownMenu<\/code>, <code>CursorDropDownMenu<\/code> \ubc0f <code>ContextMenu<\/code>\uc758 \uba54\ub274 \ud56d\ubaa9\uc744 \uc774\uc81c \ud0a4\ubcf4\ub4dc \ubc29\ud5a5\ud0a4\ub97c \uc774\uc6a9\ud574 \ud0d0\uc0c9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h2><span id=\"Mouse_and_keyboard_API_improvements\" class=\"ez-toc-section\"><\/span>\ub9c8\uc6b0\uc2a4 \ubc0f \ud0a4\ubcf4\ub4dc API \uac1c\uc120<\/h2>\n<p>\ub610\ud55c \ub9c8\uc6b0\uc2a4 \ubc0f \ud0a4\ubcf4\ub4dc \uc785\ub825\uc744 \ub354 \ud3b8\ub9ac\ud558\uac8c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d Compose for Desktop\uc758 \uc2e4\ud5d8\uc801 API\ub97c \uac1c\uc120\ud569\ub2c8\ub2e4. \ud2b9\ud788 \uc81c\uc5b4\uc790 \ud0a4\uc5d0 \ub354 \uc27d\uac8c \uc561\uc138\uc2a4\ud560 \uc218 \uc788\ub3c4\ub85d <code>onClick<\/code> \ubc0f <code>onDrag<\/code> \uc81c\uc5b4\uc790\ub97c \ub3c4\uc785\ud569\ub2c8\ub2e4.<\/p>\n<p><em>\ub9c8\uc6b0\uc2a4 \ubc0f \ud0a4\ubcf4\ub4dc API\ub294 \ud604\uc7ac Compose Multiplatform\uc758 \ub370\uc2a4\ud06c\ud1b1 \ub300\uc0c1\uc5d0\uc11c\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/em><\/p>\n<h3><span id=\"New_onClick_modifier\" class=\"ez-toc-section\"><\/span>\uc0c8\ub85c\uc6b4 <code>onClick<\/code> \uc81c\uc5b4\uc790<\/h3>\n<p>\ud604\uc7ac \uc0ac\uc6a9\ub418\uc9c0 \uc54a\ub294 <code>Modifier.mouseClickable<\/code>\uc744 \ub300\uccb4\ud558\uae30 \uc704\ud574 <code>Modifier.onClick<\/code>\uc744 \ub3c4\uc785\ud569\ub2c8\ub2e4. \uc774 \uc0c8\ub85c\uc6b4 \uc81c\uc5b4\uc790\ub97c \uc0ac\uc6a9\ud558\uba74 \ucf5c\ubc31\uc744 \uc0ac\uc6a9\ud558\uc5ec \ubaa8\ub4e0 \uc720\ud615\uc758 \ud074\ub9ad \ucc98\ub9ac\ub97c \uc138\ubc00\ud558\uac8c \uc81c\uc5b4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>PointerMatcher<\/code>\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub2e4\uc591\ud55c \uc720\ud615\uc758 \ud074\ub9ad(\uc77c\ubc18, \ub354\ube14 \ud074\ub9ad, \uae34 \ud074\ub9ad)\uacfc \uc0ac\uc6a9 \uc911\uc778 \ubc84\ud2bc(\ub9c8\uc6b0\uc2a4 \uc67c\ucabd \ubc84\ud2bc, \ub9c8\uc6b0\uc2a4 \uc624\ub978\ucabd \ubc84\ud2bc, \ub9c8\uc6b0\uc2a4 \uac00\uc6b4\ub370 \ubc84\ud2bc \ub4f1)\uc744 \uad6c\ubcc4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c <code>keyboardModifiers<\/code> \ub78c\ub2e4 \ub9e4\uac1c\ubcc0\uc218\ub97c \ud1b5\ud574 \ub20c\ub7ec\uc57c \ud558\ub294 \ud2b9\uc815 \ud0a4\ubcf4\ub4dc \uc81c\uc5b4\uc790 \ud0a4\uc5d0 \ub300\ud574 \uc774\ub7ec\ud55c \ucf5c\ubc31\uc744 \uc870\uac74\ubd80\ub85c \ub9cc\ub4e4 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br&gt;\nBox(modifier = Modifier.size(200.dp).background(Color.Yellow)&lt;br&gt;\n   .onClick(&lt;br&gt;\n       matcher = PointerMatcher.mouse(PointerButton.Secondary), \/\/ Right Mouse Button&lt;br&gt;\n       keyboardModifiers = { isAltPressed }, \/\/ accept clicks only when Alt pressed&lt;br&gt;\n       onLongClick = { \/\/ optional&lt;br&gt;\n           println(&quot;Long Click with secondary button and Alt pressed&quot;)&lt;br&gt;\n       },&lt;br&gt;\n       onDoubleClick = { \/\/ optional&lt;br&gt;\n           println(&quot;Double Click with secondary button and Alt pressed&quot;)&lt;br&gt;\n       },&lt;br&gt;\n       onClick = {&lt;br&gt;\n           println(&quot;Click with secondary button and Alt pressed&quot;)&lt;br&gt;\n       }&lt;br&gt;\n   )&lt;br&gt;\n   .onClick { \/\/ onClick with all default parameters&lt;br&gt;\n       println(&quot;Click with primary button (mouse left button)&quot;)&lt;br&gt;\n   }&lt;br&gt;\n) {&lt;br&gt;\n   Text(text = &quot;Box with onClick&quot;, modifier = Modifier.align(Alignment.Center))&lt;br&gt;\n}&lt;br&gt;\n<\/pre>\n<p>\uc774 API\ub97c \ub354 \uc790\uc138\ud788 \uc0b4\ud3b4\ubcf4\uace0 \uc2f6\uc740 \ubd84\ub4e4\uc744 \uc704\ud574 \uc774 \uc81c\uc5b4\uc790\uac00 \uc81c\uacf5\ud558\ub294 \ub2e4\uc591\ud55c \uc635\uc158\uc758 \uc0ac\uc6a9\ubc95\uc744 \uc548\ub0b4\ud558\ub294 <a href=\"https:\/\/github.com\/JetBrains\/compose-jb\/tree\/master\/tutorials\/Mouse_Events#new-experimental-onclick-handlers-only-for-desktop-jvm-platform\" target=\"_blank\" rel=\"noopener\">\ud29c\ud1a0\ub9ac\uc5bc<\/a>\uc744 \uc900\ube44\ud588\uc2b5\ub2c8\ub2e4. \uc5ec\ub7ec onClick \uc81c\uc5b4\uc790\ub97c \uac1c\ubcc4 \uc870\uac74\uacfc \uc81c\uc5b4\uc790 \ud0a4\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\ub3c4 \uc124\uba85\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3><span id=\"New_onDrag_modifier\" class=\"ez-toc-section\"><\/span>\uc0c8\ub85c\uc6b4 <code>onDrag<\/code> \uc81c\uc5b4\uc790<\/h3>\n<p><code>onDrag<\/code> \uc81c\uc5b4\uc790\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub4dc\ub798\uadf8 \uc774\ubca4\ud2b8 \uc2dc \ud638\ucd9c\ub418\ub294 \ucf5c\ubc31\uc744 \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>onClick<\/code>\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c <code>PointerMatcher<\/code>\uc640\ub3c4 \uc791\ub3d9\ud569\ub2c8\ub2e4. \uc989, \ub4dc\ub798\uadf8 \uc774\ubca4\ud2b8\uac00 \uc791\ub3d9\ud574\uc57c \ud558\ub294 \ub9c8\uc6b0\uc2a4 \ubc84\ud2bc\uacfc \uac19\uc740 \ucd94\uac00\uc801\uc778 \uc81c\uc57d \uc870\uac74\uc744 \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub9c8\ucc2c\uac00\uc9c0\ub85c, \uac01 \ub9c8\uc6b0\uc2a4 \ubc84\ud2bc\uacfc \uc791\ub3d9\ud558\ub294 \uc5ec\ub7ec <code>onDrag<\/code> \uc81c\uc5b4\uc790\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \uc608\ub97c \ub4e4\uc5b4 \ub9c8\uc6b0\uc2a4 \uc67c\ucabd \ubc0f \uc624\ub978\ucabd \ubc84\ud2bc\uc5d0 \ub300\ud574 \uc11c\ub85c \ub2e4\ub978 \ub4dc\ub798\uadf8 \ub3d9\uc791\uc744 \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br&gt;\nvar boxOffset by remember { mutableStateOf(Offset(0f, 0f)) }&lt;\/p&gt;\n&lt;p&gt;Box(modifier = Modifier&lt;br&gt;\n   .offset {&lt;br&gt;\n       IntOffset(boxOffset.x.toInt(), boxOffset.y.toInt())&lt;br&gt;\n   }.size(200.dp).background(Color.Yellow)&lt;br&gt;\n   .onDrag(&lt;br&gt;\n       matcher = PointerMatcher.mouse(PointerButton.Secondary), \/\/ it&#039;s Primary by default, can be configured with other pointer buttons such as Secondary, Tertiary, etc.&lt;br&gt;\n       onDragStart = { }, \/\/ optional&lt;br&gt;\n       onDragEnd = { },   \/\/ optional&lt;br&gt;\n       onDragCancel = { } \/\/ optional&lt;br&gt;\n   ) {&lt;br&gt;\n       println(&quot;Drag offset x=${it.x} y=${it.y}&quot;)&lt;br&gt;\n       boxOffset += it&lt;br&gt;\n   }&lt;\/p&gt;\n&lt;p&gt;) {&lt;br&gt;\n   Text(text = &quot;Box with onDrag\\n(using right mouse button)&quot;, modifier = Modifier.align(Alignment.Center))&lt;br&gt;\n}&lt;br&gt;\n<\/pre>\n<p>\uc774\ub294 \ub610\ud55c Compose Multiplatform\uc758 Android \ub300\uc0c1\uc5d0\uc11c \ubcfc \uc218 \uc788\ub4ef\uc774 \ud56d\uc0c1 \uae30\ubcf8 \ubc84\ud2bc\uc744 \uc0ac\uc6a9\ud558\ub294 <code>draggable<\/code> \uc81c\uc5b4\uc790\uc640 \uac19\uc740 \uc694\uc18c\uc640 \uc774 \uc2e4\ud5d8\uc801 API\ub97c \ucc28\ubcc4\ud654\ud558\ub294 \ubd80\ubd84\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774 API\uc5d0 \ub300\ud55c \uc790\uc138\ud55c \uc815\ubcf4\ub97c \uc54c\ub824\ub4dc\ub9ac\uae30 \uc704\ud574 \ub354 \uad11\ubc94\uc704\ud55c \uc0ac\uc6a9 \uc0ac\ub840\uc640 \ub354\ubd88\uc5b4 <code>PointerInputScope<\/code>\uc5d0\uc11c \ub4dc\ub798\uadf8 \ubc0f \ud0ed \uc81c\uc2a4\ucc98 \uc218\uc2e0\uacfc \uac19\uc740 \uace0\uae09 \uae30\ub2a5\uc744 \ubcf4\uc5ec\uc8fc\ub294 <a href=\"https:\/\/github.com\/JetBrains\/compose-jb\/tree\/master\/tutorials\/Mouse_Events#new-experimental-ondrag-modifier-only-for-desktop-jvm-platform\" target=\"_blank\" rel=\"noopener\">\ud29c\ud1a0\ub9ac\uc5bc<\/a>\uc744 \uc900\ube44\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<h3><span id=\"Accessing_keyboard_modifiers\" class=\"ez-toc-section\"><\/span>\ud0a4\ubcf4\ub4dc \uc81c\uc5b4\uc790 \uc561\uc138\uc2a4<\/h3>\n<p>\ubaa8\ub4e0 \ucef4\ud3ec\uc800\ube14\uc758 \ucee8\ud14d\uc2a4\ud2b8\uc5d0\uc11c \uc774\uc81c, \ud604\uc7ac \ub204\ub978 \ud0a4\ubcf4\ub4dc \uc81c\uc5b4\uc790(Ctrl, Shift, Alt \ub4f1)\uc5d0 \ub300\ud55c \uc561\uc138\uc2a4\ub97c \uc81c\uacf5\ud558\ub294 <code>LocalWindowInfo.current.keyboardModifiers<\/code> \uc0c1\ud0dc\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>keyboardModifiers<\/code>\ub294 \uc81c\uc5b4\uc790 \ud0a4\ub97c \ub204\ub974\uac70\ub098 \ub193\uc744 \ub54c \uc790\ub3d9\uc73c\ub85c \uc5c5\ub370\uc774\ud2b8\ub418\ub294 <em>\uc0c1\ud0dc<\/em>\uc774\ubbc0\ub85c \uc774\ub7ec\ud55c \ud0a4\ubcf4\ub4dc \uc81c\uc5b4\uc790\uc5d0 \uc885\uc18d\ub41c \ucef4\ud3ec\uc800\ube14\uc740 \uc7ac\uad6c\uc131\ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br&gt;\nval windowInfo = LocalWindowInfo.current&lt;br&gt;\nvar hovered by remember { mutableStateOf(false) }&lt;br&gt;\nval color by derivedStateOf {&lt;br&gt;\n  if (hovered &amp;&amp; windowInfo.keyboardModifiers.isCtrlPressed) {&lt;br&gt;\n      Color.Yellow&lt;br&gt;\n  } else {&lt;br&gt;\n      Color.Gray&lt;br&gt;\n  }&lt;br&gt;\n}&lt;\/p&gt;\n&lt;p&gt;Box(modifier = Modifier&lt;br&gt;\n   .size(200.dp)&lt;br&gt;\n   .background(color)&lt;br&gt;\n   .onPointerEvent(PointerEventType.Enter) {&lt;br&gt;\n       hovered = true&lt;br&gt;\n   }.onPointerEvent(PointerEventType.Exit) {&lt;br&gt;\n       hovered = false&lt;br&gt;\n   }&lt;br&gt;\n) {&lt;br&gt;\n   Text(&quot;Hover me and then press Ctrl&quot;, modifier = Modifier.align(Alignment.Center))&lt;br&gt;\n}&lt;br&gt;\n<\/pre>\n<h2 id=\"rtl\"><span id=\"Support_for_right-to-left_languages_and_scripts\" class=\"ez-toc-section\"><\/span>\uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd\uc73c\ub85c \uc4f0\ub294 \uc5b8\uc5b4 \ubc0f \uc2a4\ud06c\ub9bd\ud2b8 \uc9c0\uc6d0<\/h2>\n<p>\ubc84\uc804 1.2\ubd80\ud130 Compose for Desktop\uc740 \uc774\uc81c \uc624\ub978\ucabd\uc5d0\uc11c \uc67c\ucabd\uc73c\ub85c \uc4f0\ub294 \uc5b8\uc5b4\ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c \ud0d0\uc9c0\ub41c \uc2dc\uc2a4\ud15c \uc5b8\uc5b4\uc5d0 \ub530\ub77c \ub808\uc774\uc544\uc6c3\uacfc \uc785\ub825\uc774 \uc790\ub3d9\uc73c\ub85c \uc804\ud658\ub429\ub2c8\ub2e4. \uc0ac\uc6a9 \uc911\uc778 \uc2a4\ud06c\ub9bd\ud2b8\uc758 \ubc29\ud5a5\uc5d0 \ub530\ub77c \ub3d9\uc791\uc744 \uad6c\ud604\ud558\ub294 \uacbd\uc6b0, \uc774 \uc815\ubcf4\ub97c \ub178\ucd9c\ud558\ub294 <code><a href=\"https:\/\/developer.android.com\/reference\/kotlin\/androidx\/compose\/ui\/platform\/package-summary#LocalLayoutDirection()\" target=\"_blank\" rel=\"noopener\">LocalLayoutDirection<\/a><\/code> <code>CompositionLocal<\/code>\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2 id=\"swing\"><span id=\"Keyboard_navigation_interoperability_and_shared_context_menus_with_Swing\" class=\"ez-toc-section\"><\/span>Swing\uacfc\uc758 \ud0a4\ubcf4\ub4dc \ud0d0\uc0c9 \uc0c1\ud638 \uc6b4\uc6a9\uc131 \ubc0f \uacf5\uc720 \ucee8\ud14d\uc2a4\ud2b8 \uba54\ub274<\/h2>\n<p>Compose for Desktop\uc73c\ub85c \ube4c\ub4dc\ub41c \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4\uc640 Swing\uc73c\ub85c \ube4c\ub4dc\ub41c \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uacb0\ud569\ud558\uba74 \ubc84\uc804 1.2\uc5d0\uc11c \uc880 \ub354 \ud3b8\ub9ac\ud574\uc9d1\ub2c8\ub2e4. \uc774\uc81c <code>SwingPanel<\/code>(Compose for Desktop \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 Swing \uc694\uc18c\ub97c \ud3ec\ud568\uc2dc\ud0ac \ub54c \uc0ac\uc6a9) \ub610\ub294 <code>ComposePanel<\/code>(\uae30\uc874 Swing \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 Compose for Desktop\uc744 \ud3ec\ud568\uc2dc\ud0ac \ub54c \uc0ac\uc6a9)\uc744 \uc0ac\uc6a9\ud558\uba74 \ud0a4\ubcf4\ub4dc \ud0d0\uc0c9\uacfc \uad00\ub828\ud558\uc5ec \uc791\uc5c5\uc774 \uc6d0\ud65c\ud574\uc9d1\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, Tab \ud0a4\ub85c \uc804\ud658 \uc2dc \ub450 UI \ud504\ub808\uc784\uc6cc\ud06c\uc758 \ud3ec\ucee4\uc2a4 \uac00\ub2a5\ud55c \uc694\uc18c\uac00 \uc801\ud569\ud558\uac8c \uc120\ud0dd\ub429\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/10\/frame_000_delay-0.03s.gif\" alt=\"\ud0ed\uc73c\ub85c \ud328\ub110 \uc774\ub3d9\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/10\/ezgif.com-gif-maker-6.gif\"><\/p>\n<p>Compose for Desktop\uc744 \uae30\uc874 Swing \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ucd94\uac00\ud558\ub294 \uacbd\uc6b0, \uc774\uc81c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \ub450 \ubd80\ubd84 \ubaa8\ub450\uc5d0\uc11c \ud14d\uc2a4\ud2b8 \ubc0f \ud14d\uc2a4\ud2b8 \ud544\ub4dc\uc5d0 \ub300\ud574 \ub3d9\uc77c\ud55c \ucee8\ud14d\uc2a4\ud2b8 \uba54\ub274\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\ub824\uba74 <code>JPopupTextMenu<\/code> \ucef4\ud3ec\uc800\ube14\uc744 \uc0ac\uc6a9\ud558\uba74 \ub429\ub2c8\ub2e4.<\/p>\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">&lt;br&gt;\nval localization = LocalLocalization.current&lt;br&gt;\nCompositionLocalProvider(&lt;br&gt;\n    LocalTextContextMenu provides JPopupTextMenu(owner) { textManager, items -&gt;&lt;br&gt;\n        JPopupMenu().apply {&lt;br&gt;\n            textManager.cut?.also {&lt;br&gt;\n                add(&lt;br&gt;\n                    swingItem(localization.cut, Color.RED, KeyEvent.VK_X, it)&lt;br&gt;\n                )&lt;br&gt;\n            }&lt;br&gt;\n            textManager.copy?.also {&lt;br&gt;\n                add(&lt;br&gt;\n                    swingItem(localization.copy, Color.GREEN, KeyEvent.VK_C, it)&lt;br&gt;\n                )&lt;br&gt;\n            }&lt;br&gt;\n            textManager.paste?.also {&lt;br&gt;\n                add(&lt;br&gt;\n                    swingItem(localization.paste, Color.BLUE, KeyEvent.VK_V, it)&lt;br&gt;\n                )&lt;br&gt;\n            }&lt;br&gt;\n            textManager.selectAll?.also {&lt;br&gt;\n                add(JPopupMenu.Separator())&lt;br&gt;\n                add(&lt;br&gt;\n                   swingItem(localization.selectAll, Color.BLACK, KeyEvent.VK_A, it)&lt;br&gt;\n                )&lt;br&gt;\n            }&lt;br&gt;\n            ...&lt;br&gt;\n        }&lt;br&gt;\n    }&lt;br&gt;\n) {&lt;br&gt;\n    ...&lt;br&gt;\n}&lt;br&gt;\n<\/pre>\n<p>\ucee8\ud14d\uc2a4\ud2b8 \uba54\ub274\uc5d0 \ub300\ud55c Swing \uc0c1\ud638 \uc6b4\uc6a9\uc131\uc744 \uc790\uc138\ud788 \uc18c\uac1c\ud558\uace0 \uc804\uccb4 \uc0d8\ud50c\uc744 \uc81c\uacf5\ud558\ub294 \uc5ec\ub7ec <a href=\"https:\/\/github.com\/JetBrains\/compose-jb\/blob\/master\/tutorials\/Context_Menu\/README.md#swing-interoperability\" target=\"_blank\" rel=\"noopener\">\ud29c\ud1a0\ub9ac\uc5bc<\/a>\ub3c4 \uc81c\uacf5\ub429\ub2c8\ub2e4.<\/p>\n<h2 id=\"conveyor\"><span id=\"Alternative_app_distribution_with_online_updates_via_Conveyor_by_Hydraulic\" class=\"ez-toc-section\"><\/span>Conveyor by Hydraulic\uc744 \ud1b5\ud55c \uc628\ub77c\uc778 \uc5c5\ub370\uc774\ud2b8\ub85c\ub3c4 \uc571 \ubc30\ud3ec<\/h2>\n<p>\ubc84\uc804 1.2\uc5d0\uc11c\ub294 Hydraulic\uc758 \ud0c0\uc0ac \ub3c4\uad6c\uc778 <a href=\"https:\/\/hydraulic.software\/\" target=\"_blank\" rel=\"noopener\">Conveyor<\/a>\ub97c \uc0ac\uc6a9\ud558\uc5ec <a href=\"https:\/\/github.com\/JetBrains\/compose-jb\/tree\/master\/tutorials\/Native_distributions_and_local_execution#available-tools\" target=\"_blank\" rel=\"noopener\">Compose Gradle \ud50c\ub7ec\uadf8\uc778 \ub300\uc2e0<\/a> \ub370\uc2a4\ud06c\ud1b1 \uc571\uc744 \ud328\ud0a4\uc9c0\ub85c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Conveyor\ub294 \uc624\ud508 \uc18c\uc2a4 \ud504\ub85c\uc81d\ud2b8\uc5d0 \ubb34\ub8cc\ub85c \uc81c\uacf5\ub418\uba70 \ub3c4\uc785 \uae30\uac04 \ub3d9\uc548\uc740 \uc0c1\uc5c5\uc801 \uc6a9\ub3c4\ub85c\ub3c4 \ubb34\ub8cc\ub85c \uc81c\uacf5\ub429\ub2c8\ub2e4.<\/p>\n<p>Compose Gradle \ud50c\ub7ec\uadf8\uc778\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c \ub300\uc0c1 \ud50c\ub7ab\ud3fc\uc758 \uae30\ubcf8 \ud615\uc2dd\uc73c\ub85c \uc81c\uacf5\ub418\uace0 \uc790\uccb4 \ubc88\ub4e4 JVM\uacfc \ud568\uaed8 \uc81c\uacf5\ub418\ub294 \uc644\uc804\ud788 \ub3c5\ub9bd\uc801\uc778 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c Conveyor\ub294 \uc628\ub77c\uc778 \uc5c5\ub370\uc774\ud2b8 \uc9c0\uc6d0, \ub2e4\uc6b4\ub85c\ub4dc \ud398\uc774\uc9c0 \uc0dd\uc131(<a href=\"https:\/\/downloads.hydraulic.dev\/eton-sample\/download.html\" target=\"_blank\" rel=\"noopener\">\uc608\uc2dc<\/a>), \uac01 \ud50c\ub7ab\ud3fc\uc5d0 \ub300\ud55c \uc544\uc774\ucf58 \uc790\ub3d9 \ubcc0\ud658 \ubc0f <a href=\"https:\/\/conveyor.hydraulic.dev\/2.1\/#features\" target=\"_blank\" rel=\"noopener\">\ub2e4\uc591\ud55c \uae30\ud0c0 \uae30\ub2a5<\/a>\ub3c4 \ucd94\uac00\ud569\ub2c8\ub2e4. \uadf8\ubfd0 \uc544\ub2c8\ub77c Conveyor\ub294 \uae30\ubcf8 \ub3c4\uad6c\uc5d0 \uc885\uc18d\ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \ubaa8\ub4e0 \uc6b4\uc601 \uccb4\uc81c\uc5d0\uc11c \ud328\ud0a4\uc9c0\ub97c \ube4c\ub4dc, \uc11c\uba85 \ubc0f \uacf5\uc99d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>Conveyor\ub294 \ubc30\ud3ec\ub97c \ub300\ud3ed \uac04\uc18c\ud654\ud558\uae30 \ub54c\ubb38\uc5d0 Compose for Desktop\uc5d0 \ub9e4\uc6b0 \uc801\ud569\ud569\ub2c8\ub2e4. \uac04\uc18c\ud654 \ub355\ubd84\uc5d0 \ub354 \uc218\uc6d4\ud558\uac8c \uc628\ub77c\uc778 \uc5c5\ub370\uc774\ud2b8\ub97c \uc81c\uacf5\ud558\uace0 \ubcf5\uc7a1\ud55c \uba40\ud2f0\ud50c\ub7ab\ud3fc CI\/CD \uc124\uc815\uc744 \ud53c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Windows \ubc0f macOS \ubaa8\ub450\uc5d0\uc11c \ub0b4\ubd80 \ub610\ub294 \uac1c\ubc1c\uc790 \ub300\uc0c1 \uc571\uc5d0 \ub300\ud55c \ucd94\uac00\uc801 \ud3b8\uc758\ub3c4 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uae30\ubcf8 \uc790\uccb4 \uc11c\uba85 \ubaa8\ub4dc\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0, \uc0dd\uc131\ub41c \ub2e4\uc6b4\ub85c\ub4dc \ud398\uc774\uc9c0\uc5d0\uc11c \ubcf5\uc0ac\ud558\uc5ec \ubd99\uc5ec\ub123\uc744 \uc218 \uc788\ub294 \uba85\ub839\uc5b4\uac00 \uc81c\uacf5\ub418\ubbc0\ub85c \ud130\ubbf8\ub110\uc744 \ud1b5\ud574 \uc571\uc744 \uc124\uce58\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4(<a href=\"https:\/\/downloads.hydraulic.dev\/eton-sample\/selfsigned\/download.html\" target=\"_blank\" rel=\"noopener\">\uc608\uc2dc<\/a>).<\/p>\n<h2><span id=\"Wrapping_up\" class=\"ez-toc-section\"><\/span>\ub9c8\ubb34\ub9ac<\/h2>\n<p>Compose Multiplatform \ucd5c\uc2e0 \ubc84\uc804\uc744 \ud65c\uc6a9\ud558\uc5ec \uba4b\uc9c4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc6a9 UI\ub97c \uc81c\uc791\ud558\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4! \uc77c\ubd80 \uc0ac\uc18c\ud55c \ubcc0\uacbd \uc0ac\ud56d\uc740 \uc774 \ub9b4\ub9ac\uc2a4 \uac8c\uc2dc\ubb3c\uc5d0 \uc18c\uac1c\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. Compose Multiplatform 1.2\uc758 \ubaa8\ub4e0 \ubcc0\uacbd \ubc0f \uac1c\uc120 \uc0ac\ud56d\uc5d0 \ub300\ud55c \uc804\uccb4 \ubaa9\ub85d\uc744 \ubcf4\ub824\uba74 <a href=\"https:\/\/github.com\/JetBrains\/compose-jb\/releases\/tag\/v1.2.0\" target=\"_blank\" rel=\"noopener\">\uc800\uc7a5\uc18c\uc5d0\uc11c \ubcc0\uacbd \ub85c\uadf8<\/a>\ub97c \uc790\uc720\ub86d\uac8c \uc0b4\ud3b4\ubcf4\uc138\uc694.<\/p>\n<p>\ubc84\uc804 1.2\ubd80\ud130 Compose Multiplatform\uc740 \uc5ec\ub7ec \ubc84\uc804\uc758 Kotlin \ucef4\ud30c\uc77c\ub7ec\ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \ub370\uc2a4\ud06c\ud1b1 \ub300\uc0c1\uc740 Kotlin 1.7.10\uacfc Kotlin 1.7.20\uc744 \ubaa8\ub450 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc6f9 \ub300\uc0c1\uc740 \ud604\uc7ac Kotlin 1.7.10\uc744 \uc9c0\uc6d0\ud558\uba70 \ub2e4\uc74c \ub9c8\uc774\ub108 \uc5c5\ub370\uc774\ud2b8\ub97c \ud1b5\ud574 1.7.20\uc5d0 \ub300\ud55c \uc9c0\uc6d0\uc744 \uc81c\uacf5\ud560 \uc608\uc815\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub298 \uadf8\ub807\ub4ef\uc774 \uc774 \ucd5c\uc2e0 \ubc84\uc804\uc758 Compose Multiplatform\uc744 \uc2dc\uc791\ud558\ub294 \uac00\uc7a5 \uc26c\uc6b4 \ubc29\ubc95\uc740 <a href=\"https:\/\/github.com\/JetBrains\/compose-jb\/tree\/master\/tutorials\" target=\"_blank\" rel=\"noopener\">\uacf5\uc2dd \ud29c\ud1a0\ub9ac\uc5bc<\/a>\uc744 \uc0b4\ud3b4\ubcf4\uac70\ub098 IntelliJ IDEA\uc758 Kotlin \ud504\ub85c\uc81d\ud2b8 \ub9c8\ubc95\uc0ac\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc9c1\uc811 \uc0ac\uc6a9\ud574\ubcf4\ub294 \uac83\uc785\ub2c8\ub2e4. \uc990\uac81\uac8c \ucef4\ud3ec\uc9d5\ud558\uc138\uc694!<\/p>\n<p align=\"center\"><a class=\"ek-link jb-download-button\" title=\"CTA\" href=\"https:\/\/www.jetbrains.com\/ko-kr\/lp\/compose-mpp\/\" target=\"_blank\" rel=\"noopener\">Compose Multiplatform \uc6f9\uc0ac\uc774\ud2b8 \ud0d0\uc0c9<\/a><\/p>\n<h2><span id=\"See_also\" class=\"ez-toc-section\"><\/span>\uae30\ud0c0 \ucc38\uace0 \uc790\ub8cc<\/h2>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/12\/compose-multiplatform-1-0-is-going-live\/\">Compose Multiplatform 1.0 \ucd9c\uc2dc! | Kotlin \ube14\ub85c\uadf8<\/a><\/li>\n<\/ul>\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","protected":false},"author":964,"featured_media":285796,"comment_status":"closed","ping_status":"closed","template":"","categories":[89],"tags":[6481,6705,6706],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/292508"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/types\/kotlin"}],"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=292508"}],"version-history":[{"count":5,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/292508\/revisions"}],"predecessor-version":[{"id":292517,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/292508\/revisions\/292517"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media\/285796"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=292508"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=292508"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=292508"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=292508"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}