{"id":388026,"date":"2023-09-15T04:40:02","date_gmt":"2023-09-15T03:40:02","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=388026"},"modified":"2023-09-15T04:40:09","modified_gmt":"2023-09-15T03:40:09","slug":"compose-multiplatform-1-5-0-release","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/ko\/kotlin\/2023\/09\/compose-multiplatform-1-5-0-release\/","title":{"rendered":"Compose Multiplatform 1.5.0 \ucd9c\uc2dc"},"content":{"rendered":"<p>\uc624\ub298\ubd80\ud130 Compose Multiplatform 1.5.0\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ubc88 \ub9b4\ub9ac\uc2a4\ub294 Kotlin\uc6a9 Jetpack Compose \uc120\uc5b8\uc801 UI \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud558\uc5ec Android\ub97c \ub118\uc5b4 \ub370\uc2a4\ud06c\ud1b1, iOS, \uc6f9\uc73c\ub85c \ud655\uc7a5\ub429\ub2c8\ub2e4. \ub370\uc2a4\ud06c\ud1b1 \ubc84\uc804\uc740 \uc548\uc815\uc801\uc774\uace0 iOS\ub294 \uc54c\ud30c \ubc84\uc804\uc774\uba70 \uc6f9 \uc9c0\uc6d0\uc740 \uc2e4\ud5d8\uc801 \ub2e8\uacc4\uc785\ub2c8\ub2e4. \uc804\uccb4 \uc18c\uac1c \ub0b4\uc6a9\uc744 \ubcf4\ub824\uba74 <a href=\"https:\/\/www.jetbrains.com\/ko-kr\/lp\/compose-multiplatform\/\" target=\"_blank\" rel=\"noreferrer noopener\">Compose Multiplatform \uc6f9\uc0ac\uc774\ud2b8<\/a>\ub97c \ucc38\uc870\ud558\uc138\uc694.<\/p>\n<p>\uc774\ubc88 \ub9b4\ub9ac\uc2a4\uc758 \uc8fc\uc694 \ub0b4\uc6a9\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<ol>\n<li>Dialog, Popup \ubc0f WindowInsets API\uac00 \uc774\uc81c \uacf5\ud1b5 \ucf54\ub4dc\uc5d0 \ud3ec\ud568\ub429\ub2c8\ub2e4.<\/li>\n<li>iOS \uc2a4\ud06c\ub864\uacfc \uad00\ub828\ud558\uc5ec \ub9ac\uc18c\uc2a4 \uad00\ub9ac\uc640 \ud14d\uc2a4\ud2b8 \ud544\ub4dc\uac00 \uac1c\uc120\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/li>\n<li>UI \ud14c\uc2a4\ud2b8 \ud504\ub808\uc784\uc6cc\ud06c\uac00 \ub370\uc2a4\ud06c\ud1b1\uc5d0\uc11c \uc548\uc815\ud654\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ol>\n<p>\uc774 \ub9b4\ub9ac\uc2a4\ub294 \uc131\ub2a5 \uac1c\uc120\uc5d0 \uc911\uc810\uc744 \ub454 <a href=\"https:\/\/android-developers.googleblog.com\/2023\/08\/whats-new-in-jetpack-compose-august-23-release.html\" target=\"_blank\" rel=\"noreferrer noopener\">Jetpack Compose 1.5<\/a>\ub97c \uae30\ubc18\uc73c\ub85c \ud569\ub2c8\ub2e4. \ub610\ud55c <a href=\"https:\/\/material.io\/blog\/material-3-compose-1-1\" target=\"_blank\" rel=\"noreferrer noopener\">Material Design 3\uc758 1.1 \ub9b4\ub9ac\uc2a4<\/a>\uc5d0\ub3c4 \uae30\ubc18\uc744 \ub461\ub2c8\ub2e4. \uc5ec\uae30\uc5d0\ub294 \ub0a0\uc9dc \uc120\ud0dd\uae30 \ubc0f \uc2dc\uac04 \uc120\ud0dd\uae30\uc640 \uac19\uc740 \uc0c8\ub85c\uc6b4 \uad6c\uc131 \uc694\uc18c\uac00 \ud3ec\ud568\ub429\ub2c8\ub2e4.<\/p>\n<p align=\"center\"><a class=\"ek-link jb-download-button\" title=\"Compose Multiplatform 1.5.0 \uc0ac\uc6a9\ud574 \ubcf4\uae30\" href=\"https:\/\/github.com\/JetBrains\/compose-multiplatform\/releases\/tag\/v1.5.0\" target=\"_blank\" rel=\"noopener\">Compose Multiplatform 1.5.0 \uc0ac\uc6a9\ud574 \ubcf4\uae30<\/a><\/p>\n<h2 class=\"wp-block-heading\">Compose Multiplatform\uc740 Dialog, Popup \ubc0f WindowInsets\ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4<\/h2>\n<p>\ubc84\uc804 1.5\ubd80\ud130 Compose Multiplatform\uc5d0\uc11c \ub300\ud654\uc0c1\uc790\uc640 \ud31d\uc5c5\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub300\ud654\uc0c1\uc790\ub294 \uc0ac\uc6a9\uc790\uac00 \ud56d\ubaa9\uc744 \uc120\ud0dd\ud558\uac70\ub098 \uc77c\ubd80 \ub370\uc774\ud130\ub97c \uc785\ub825\ud558\ub294 \ubaa8\ub2ec \uc774\ubca4\ud2b8\uc5d0 \uc0ac\uc6a9\ub429\ub2c8\ub2e4. \ubc18\uba74\uc5d0 \ud31d\uc5c5\uc740 \uc120\ud0dd\uc801 \uae30\ub2a5 \uc81c\uacf5\uacfc \uac19\uc740 \ube44 \ubaa8\ub2ec \ub3d9\uc791\uc5d0 \uc0ac\uc6a9\ub429\ub2c8\ub2e4.<\/p>\n<p>\uc774\ubc88 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c\ub294 \uae30\ubcf8 \ud0c0\uc785\uc778 <a href=\"https:\/\/developer.android.com\/reference\/kotlin\/androidx\/compose\/ui\/window\/package-summary#Dialog(kotlin.Function0,androidx.compose.ui.window.DialogProperties,kotlin.Function0)\" target=\"_blank\" rel=\"noreferrer noopener\">Dialog<\/a>\uc640 <a href=\"https:\/\/developer.android.com\/reference\/kotlin\/androidx\/compose\/ui\/window\/package-summary#Popup(androidx.compose.ui.window.PopupPositionProvider,kotlin.Function0,androidx.compose.ui.window.PopupProperties,kotlin.Function0)\" target=\"_blank\" rel=\"noreferrer noopener\">Popup<\/a>\uc740 \ubb3c\ub860 <a href=\"https:\/\/developer.android.com\/reference\/kotlin\/androidx\/compose\/material\/package-summary#DropdownMenu(kotlin.Boolean,kotlin.Function0,androidx.compose.ui.Modifier,androidx.compose.ui.unit.DpOffset,androidx.compose.foundation.ScrollState,androidx.compose.ui.window.PopupProperties,kotlin.Function1)\" target=\"_blank\" rel=\"noreferrer noopener\">DropdownMenu<\/a>\uc640 <a href=\"https:\/\/developer.android.com\/reference\/kotlin\/androidx\/compose\/material\/package-summary#AlertDialog(kotlin.Function0,kotlin.Function0,androidx.compose.ui.Modifier,kotlin.Function0,kotlin.Function0,androidx.compose.ui.graphics.Shape,androidx.compose.ui.graphics.Color,androidx.compose.ui.graphics.Color,androidx.compose.ui.window.DialogProperties)\" target=\"_blank\" rel=\"noreferrer noopener\">AlertDialog<\/a>\ub3c4 \uacf5\ud1b5 \ucf54\ub4dc \ub0b4\uc5d0\uc11c \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uc5d0 \ub530\ub77c \ud50c\ub7ab\ud3fc\ubcc4 \uae30\ub2a5\uc744 \uc81c\uacf5\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc608\ub97c \ub4e4\uc5b4, \uc544\ub798 Composable\uc740 \uc644\uc804\ud788 \uacf5\ud1b5 \ucf54\ub4dc\ub85c \uc791\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n@Composable\nfun CommonDialog() {\n   var isDialogOpen by remember { mutableStateOf(false) }\n   Button(onClick = { isDialogOpen = true }) {\n       Text(&quot;Open&quot;)\n   }\n   if (isDialogOpen) {\n       AlertDialog(\n           onDismissRequest = { },\n           confirmButton = {\n               Button(onClick = { isDialogOpen = false }) {\n                   Text(&quot;OK&quot;)\n               }\n           },\n           title = { Text(&quot;Alert Dialog&quot;) },\n           text = { Text(&quot;Lore ipsum&quot;) },\n       )\n   }\n}\n<\/pre>\n\n\n<p>\uc774\ub294 \ub370\uc2a4\ud06c\ud1b1, Android \ubc0f iOS\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\uc2dc\ub429\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/DialogBoxesDesktop-resized-1.png\" alt=\"\ub370\uc2a4\ud06c\ud1b1\uc758 \ub300\ud654\uc0c1\uc790 \ub370\ubaa8\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/DialogBoxesDesktop-resized-1.gif\"><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/DialogBoxesAndroidiPhone-resized-1.png\" alt=\"Android \ubc0f iOS\uc758 \ub300\ud654\uc0c1\uc790 \ub370\ubaa8\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/DialogBoxesAndroidiPhone-resized-1.gif\"><\/p>\n<p>\uc774\ubc88 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc138 \ubc88\uc9f8 \uae30\ub2a5\uc740 <a href=\"https:\/\/developer.android.com\/jetpack\/compose\/layouts\/insets\" target=\"_blank\" rel=\"noreferrer noopener\">WindowInsets API<\/a>\ub85c, \ucf58\ud150\uce20\uac00 \uc2dc\uc2a4\ud15c UI\uc640 \uacb9\uce58\uc9c0 \uc54a\ub3c4\ub85d \ud558\uae30 \uc704\ud574 \uc5bc\ub9c8\ub098 \uc870\uc815\ud574\uc57c \ud558\ub294\uc9c0\ub97c \uc124\uba85\ud569\ub2c8\ub2e4. \ubc84\uc804 1.5\ubd80\ud130 \uc774 \uae30\ub2a5\uc740 Compose Multiplatform\uc5d0 \ud3ec\ud568\ub418\uc5b4 Android\uc640 iOS \ubaa8\ub450\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>WindowInsets API\ub97c \uc0ac\uc6a9\ud558\uba74 \ub178\uce58 \ub4a4\uc5d0\uc11c Compose Multiplatform\uc744 \ud1b5\ud574 \ubc30\uacbd \ucf58\ud150\uce20\ub97c \uadf8\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub54c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc704\uc5d0 \ud770\uc0c9 \uc120\uc774 \ucd94\uac00\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc544\ub798 \uc2a4\ud06c\ub9b0\uc0f7\uc740 \uc774\ub85c \uc778\ud55c \ucc28\uc774\ub97c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"623\" height=\"664\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/WindowInsetsAPI.png\" alt=\"WindowInsets API\ub97c \uc0ac\uc6a9\ud558\uc5ec Compose Multiplatform\uc5d0\uc11c \ubc30\uacbd \ucf58\ud150\uce20 \uadf8\ub9ac\uae30\" class=\"wp-image-382365\" \/><\/figure>\n<h2 class=\"wp-block-heading\">iOS \uac1c\uc120 \uc0ac\ud56d<\/h2>\n<p>iOS \ud50c\ub7ab\ud3fc\uc740 \uc774\ubc88 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c \ud2b9\ud788 \uc911\uc810\uc744 \ub450\uc5c8\ub358 \ub9cc\ud07c, \ub2e4\uc591\ud55c \uac1c\uc120 \uc0ac\ud56d\uc774 \uc801\uc6a9\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc2a4\ud06c\ub864 \ub3d9\uc791\uc774 \ud50c\ub7ab\ud3fc\uc758 \ubaa8\uc591\uacfc \ub290\ub08c\uc744 \ub530\ub974\uace0, \ub9ac\uc18c\uc2a4 \uad00\ub9ac\uac00 \ub2e8\uc21c\ud654\ub418\uc5c8\uc73c\uba70, \ud14d\uc2a4\ud2b8 \ucc98\ub9ac\uac00 \ud5a5\uc0c1\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\">\uc790\uc5f0\uc2a4\ub7ec\uc6b4 \uc2a4\ud06c\ub864<\/h3>\n<p>\uc774\ubc88 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c\ub294 iOS \uc2a4\ud06c\ub864\uc774 \uae30\ubcf8 \uc2a4\ud06c\ub864\uacfc \uac19\uc774 \uc791\ub3d9\ud558\ub3c4\ub85d \uc870\uc815\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ud45c\uc2dc\ud560 \ud56d\ubaa9\uc758 \uc218 \ubc0f\/\ub610\ub294 \ud06c\uae30\uac00 \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uacf5\uac04\uc744 \ucd08\uacfc\ud558\ub294 \ucf54\ub4dc\uac00 \uc788\ub2e4\uace0 \uac00\uc815\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n@Composable\nfun NaturalScrolling() {\n   val items = (1..30).map { &quot;Item $it&quot; }\n   LazyColumn {\n       items(items) {\n           Text(\n               text = it,\n               fontSize = 30.sp,\n               modifier = Modifier.padding(start = 20.dp)\n           )\n       }\n   }\n}\n<\/pre>\n\n\n<p>\uc2a4\ud06c\ub864\ud558\uba74 \uae30\ubcf8 iPhone \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uacfc \ub9c8\ucc2c\uac00\uc9c0\ub85c \ud56d\ubaa9\uc774 \ud654\uba74 \uac00\uc7a5\uc790\ub9ac\uc5d0\uc11c \ud280\uc5b4\ub098\uc635\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/NaturalScrolling-resized.png\" alt=\"iOS\uc5d0\uc11c \uc2a4\ud06c\ub864 \ud56d\ubaa9 \ud45c\uc2dc\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/NaturalScrolling-resized.gif\"><\/p>\n<h3 class=\"wp-block-heading\">\ub3d9\uc801 \ud0c0\uc785 \uc9c0\uc6d0<\/h3>\n<p><a href=\"https:\/\/developer.apple.com\/documentation\/uikit\/uifont\/scaling_fonts_automatically\/\" target=\"_blank\" rel=\"noreferrer noopener\">iOS\uc758 \ub3d9\uc801 \ud0c0\uc785<\/a> \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud558\uba74 \uc0ac\uc6a9\uc790\uac00 \uc120\ud638\ud558\ub294 \uae00\uaf34 \ud06c\uae30\ub97c \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc989, \ubcf4\uae30 \uc27d\ub3c4\ub85d \ub354 \ud06c\uac8c \ud558\uac70\ub098 \ub354 \ub9ce\uc740 \ucf58\ud150\uce20\uc5d0 \ub9de\uac8c \ub354 \uc791\uac8c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc571 \ub0b4\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \ud14d\uc2a4\ud2b8 \ud06c\uae30\ub294 \uc774 \uc2dc\uc2a4\ud15c \uc124\uc815\uc744 \uae30\uc900\uc73c\ub85c \ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774 \uae30\ub2a5\uc774 \uc774\uc81c Compose Multiplatform\uc5d0\uc11c \uc9c0\uc6d0\ub429\ub2c8\ub2e4. \ud14d\uc2a4\ud2b8 \ud06c\uae30 \uc870\uc815\uc5d0 \uc0ac\uc6a9\ub418\ub294 \uc99d\ubd84\uc740 \uae30\ubcf8 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \uac83\uacfc \ub3d9\uc77c\ud558\ubbc0\ub85c \ub3d9\uc791\ub3c4 \ub3d9\uc77c\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc608\ub97c \ub4e4\uc5b4, \ub2e4\uc74c Composable\uc744 \uc0dd\uac01\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n@Composable\nfun DynamicType() {\n   Text(&quot;This is some sample text&quot;, fontSize = 30.sp)\n}\n<\/pre>\n\n\n<p>\uae30\ubcf8 \uc77d\uae30 \ud06c\uae30\uac00 \ucd5c\uc18c\ub85c \uc124\uc815\ub418\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ud45c\uc2dc\ub429\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1266\" height=\"928\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/DynamicTypesSmall.png\" alt=\"Compose Multiplatform\uc5d0\uc11c iOS\uc758 \ub3d9\uc801 \ud0c0\uc785 \uae30\ub2a5(\uc791\uc740 \ud14d\uc2a4\ud2b8)\" class=\"wp-image-382376\" \/><\/figure>\n<p>\ubc18\uba74\uc5d0 \uc120\ud638\ud558\ub294 \uc77d\uae30 \ud06c\uae30\uac00 \ucd5c\ub300\uc77c \ub54c\uc758 \uacb0\uacfc\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1266\" height=\"928\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/DynamicTypesLarge.png\" alt=\"Compose Multiplatform\uc5d0\uc11c iOS\uc758 \ub3d9\uc801 \ud0c0\uc785 \uae30\ub2a5(\ud070 \ud14d\uc2a4\ud2b8)\" class=\"wp-image-382387\" \/><\/figure>\n<h3 class=\"wp-block-heading\">\uc0c8\ub85c\uace0\uce68 \ube48\ub3c4\uac00 \ub192\uc740 \ub514\uc2a4\ud50c\ub808\uc774 \uc9c0\uc6d0<\/h3>\n<p>\uc774\uc804 \ubc84\uc804\uc5d0\uc11c\ub294 \ucd5c\ub300 \ud504\ub808\uc784 \uc18d\ub3c4\uac00 60FPS\uc600\uc2b5\ub2c8\ub2e4. \uc774\ub85c \uc778\ud574 120Hz \ud654\uba74\uc744 \uc0ac\uc6a9\ud558\ub294 \uae30\uae30\uc5d0\uc11c UI\uac00 \ub290\ub824\uc9c0\uace0 \uc9c0\uc5f0\ub418\ub294 \uacbd\uc6b0\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ubc88 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c\ub294 \ucd5c\ub300 120FPS\uc758 \ud504\ub808\uc784 \uc18d\ub3c4\uac00 \uc9c0\uc6d0\ub429\ub2c8\ub2e4.<\/p>\n<h3 class=\"wp-block-heading\">\ub2e8\uc21c\ud654\ub41c \ub9ac\uc18c\uc2a4 \uad00\ub9ac<\/h3>\n<p>1.5.0\ubd80\ud130 iOS \uc18c\uc2a4 \uc138\ud2b8\uc758 resources \ud3f4\ub354\uc5d0 \uc788\ub294 \ubaa8\ub4e0 \uc560\uc14b\uc740 \uae30\ubcf8\uc801\uc73c\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ubc88\ub4e4\uc5d0 \ubcf5\uc0ac\ub429\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc774\ubbf8\uc9c0 \ud30c\uc77c\uc744 <code>src\/commonMain\/resources\/<\/code>\uc5d0 \ub123\uc73c\uba74 \ud574\ub2f9 \ud30c\uc77c\uc774 \ubc88\ub4e4\uc5d0 \ubcf5\uc0ac\ub418\uc5b4 \ucf54\ub4dc\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>CocoaPods\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0, \ub354 \uc774\uc0c1 Gradle \ube4c\ub4dc \ud30c\uc77c\uc5d0\uc11c \uc774 \ub3d9\uc791\uc744 \uad6c\uc131\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. \ub610\ud55c \uc218\uc815 \ud6c4 \uc560\uc14b\uc744 \ubcf5\uc0ac\uc2dc\ud0a4\uae30 \uc704\ud574 <em>podInstall<\/em>\uc744 \ub2e4\uc2dc \ud638\ucd9c\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ubc88 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c\ub294 \uc544\ub798 \ud45c\uc2dc\ub41c \ub300\ub85c \ube4c\ub4dc \uc2a4\ud06c\ub9bd\ud2b8\uc5d0\uc11c \ub3d9\uc791\uc744 \uba85\uc2dc\uc801\uc73c\ub85c \uad6c\uc131\ud558\ub824\uace0 \ud558\uba74 \uc624\ub958\uac00 \ubc1c\uc0dd\ud569\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nkotlin {\n    cocoapods {\n        extraSpecAttributes[&quot;resources&quot;] = &quot;...&quot;\n    }\n}\n<\/pre>\n\n\n<p>\uc790\uc138\ud55c \ub0b4\uc6a9\uacfc \uae30\uc874 \ucf54\ub4dc\ub97c \ub9c8\uc774\uadf8\ub808\uc774\uc158\ud558\uae30 \uc704\ud55c \uc9c0\uce68\uc740 <a href=\"https:\/\/github.com\/JetBrains\/compose-multiplatform\/pull\/3496\" target=\"_blank\" rel=\"noreferrer noopener\">\uc774 \ubb38\uc11c\ub97c \ucc38\uc870<\/a>\ud558\uc138\uc694.<\/p>\n<h3 class=\"wp-block-heading\">TextField \uac1c\uc120<\/h3>\n<p>\uc774\uc804 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c\ub294 \ud14d\uc2a4\ud2b8\ub97c \uc785\ub825\ud558\uba74 \uc6d0\uce58 \uc54a\ub294 \ub3d9\uc791\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub294 \ub450 \uac00\uc9c0 \uc0c1\ud669\uc774 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\ubc88 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c\ub294 \uc774\ub7ec\ud55c \ubb38\uc81c\ub97c \uc5c6\uc560\ub3c4\ub85d <code>TextField<\/code>\uac00 \uac1c\uc120\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<h4 class=\"wp-block-heading\">\ub300\ubb38\uc790 \uc0ac\uc6a9 \ubb38\uc81c<\/h4>\n<p>\uccab\uc9f8, <code>TextField<\/code>\ub294 \uc774\uc81c \uccab \uae00\uc790\uc758 \uc790\ub3d9 \ub300\ubb38\uc790 \ud45c\uc2dc\uac00 \ube44\ud65c\uc131\ud654\ub41c \uacbd\uc6b0 \uc774\ub97c \uc778\uc2dd\ud569\ub2c8\ub2e4. \uc774\ub294 \uc608\ub97c \ub4e4\uc5b4 \ube44\ubc00\ubc88\ud638\ub97c \uc785\ub825\ud560 \ub54c \uc911\uc694\ud569\ub2c8\ub2e4. \uc774 \ub3d9\uc791\uc740 KeyboardOptions \uc778\uc218\ub97c \ud1b5\ud574 \uc81c\uc5b4\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub97c \uc124\uba85\ud55c \uc544\ub798 \ucef4\ud3ec\uc800\ube14\uc744 \uc0b4\ud3b4\ubcf4\uc138\uc694.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun TextFieldCapitalization() {\n   var text by remember { mutableStateOf(&quot;&quot;) }\n   TextField(\n       value = text,\n       onValueChange = { text = it },\n       keyboardOptions = KeyboardOptions(\n           capitalization = KeyboardCapitalization.Sentences,\n           autoCorrect = false,\n           keyboardType = KeyboardType.Ascii,\n       ),\n   )\n}\n<\/pre>\n\n\n<p>\uc67c\ucabd \uc774\ubbf8\uc9c0\ub294 \ub300\ubb38\uc790 \ud45c\uc2dc \ud504\ub85c\ud37c\ud2f0\uac00 <code>KeyboardCapitalization.None<\/code>\uc73c\ub85c \uc124\uc815\ub41c \uacbd\uc6b0\uc5d0 \ubc1c\uc0dd\ud558\ub294 \uc0c1\ud669\uc744 \ubcf4\uc5ec\uc8fc\uace0, \uc624\ub978\ucabd \uc774\ubbf8\uc9c0\ub294 \uac12\uc774 <code>KeyboardCapitalization.Sentences<\/code>\uc778 \uacbd\uc6b0 \ubc1c\uc0dd\ud558\ub294 \uc0c1\ud669\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/CapitalizationOptions-resized-2.png\" alt=\"TextField\ub97c \uc0ac\uc6a9\ud55c \ub300\ubb38\uc790 \ud45c\uc2dc \ub370\ubaa8\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/CapitalizationOptions-resized-1.gif\"><\/p>\n<h4 class=\"wp-block-heading\">\ud558\ub4dc\uc6e8\uc5b4 \ud0a4\ubcf4\ub4dc<\/h4>\n<p>\ub450 \ubc88\uc9f8 \uc0c1\ud669\uc740 \ud558\ub4dc\uc6e8\uc5b4 \ud0a4\ubcf4\ub4dc\uc640 \uad00\ub828\ub41c \uac83\uc785\ub2c8\ub2e4. \uc774\uc804 \ubc84\uc804\uc5d0\uc11c\ub294 \ud558\ub4dc\uc6e8\uc5b4 \ud0a4\ubcf4\ub4dc\ub97c \uc0ac\uc6a9\ud560 \ub54c <strong>Enter<\/strong>\ub97c \ub204\ub974\uba74 \uc5ec\ub7ec \uac1c\uc758 \uc904\uc774 \uc0c8\ub85c \uc0dd\uaca8\ub0ac\uace0 <strong>\ubc31\uc2a4\ud398\uc774\uc2a4<\/strong>\ub97c \ub204\ub974\uba74 \uc5ec\ub7ec \ubc88 \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\ubc88 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c\ub294 \uc774\uc81c \uc774\ub7ec\ud55c \uc774\ubca4\ud2b8\uac00 \uc62c\ubc14\ub974\uac8c \ucc98\ub9ac\ub429\ub2c8\ub2e4.<\/p>\n<h2 class=\"wp-block-heading\">\ub370\uc2a4\ud06c\ud1b1 \uac1c\uc120 \uc0ac\ud56d<\/h2>\n<h3 class=\"wp-block-heading\">\uc548\uc815\ud654\ub41c \ud14c\uc2a4\ud2b8 \ud504\ub808\uc784\uc6cc\ud06c<\/h3>\n<p>\uc774\ubc88 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c\ub294 Compose for Desktop\uc5d0\uc11c \ud14c\uc2a4\ud2b8 \uc9c0\uc6d0\uc774 \uc548\uc815\ud654\ub418\uc5c8\uc2b5\ub2c8\ub2e4. Jetpack Compose\ub294 Compose \ucf54\ub4dc\uc758 \ub3d9\uc791\uc744 \uac80\uc99d\ud558\uae30 \uc704\ud55c <a href=\"https:\/\/developer.android.com\/jetpack\/compose\/testing\" target=\"_blank\" rel=\"noreferrer noopener\">\ud14c\uc2a4\ud2b8 API \uc138\ud2b8<\/a>\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c API\ub294 \ub370\uc2a4\ud06c\ud1b1\uc73c\ub85c \ud3ec\ud305\ub418\uc5c8\uc73c\uba70 \uc774\uc804 \ub9b4\ub9ac\uc2a4\uc5d0\uc11c \uc0ac\uc6a9 \uac00\ub2a5\ud588\uc9c0\ub9cc \uc81c\ud55c\uc801\uc774\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc81c \uc774\ub7ec\ud55c \uc81c\ud55c \uc0ac\ud56d\uc774 \uc81c\uac70\ub418\uc5b4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0 \ub300\ud55c \ud3ec\uad04\uc801\uc778 UI \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud14c\uc2a4\ud2b8 \uae30\ub2a5\uc744 \uac04\ub7b5\ud558\uac8c \uc54c\uc544\ubcf4\uae30 \uc704\ud574 \uac04\ub2e8\ud55c UI\ub97c \ub9cc\ub4e4\uace0 \ud14c\uc2a4\ud2b8\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc740 \uc608\uc2dc Composable\uc785\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\n@Composable\nfun App() {\n   var searchText by remember { mutableStateOf(&quot;cats&quot;) }\n   val searchHistory = remember { mutableStateListOf&lt;String&gt;() }\n\n\n   Column(modifier = Modifier.padding(30.dp)) {\n       TextField(\n           modifier = Modifier.testTag(&quot;searchText&quot;),\n           value = searchText,\n           onValueChange = {\n               searchText = it\n           }\n       )\n       Button(\n           modifier = Modifier.testTag(&quot;search&quot;),\n           onClick = {\n               searchHistory.add(&quot;You searched for: $searchText&quot;)\n           }\n       ) {\n           Text(&quot;Search&quot;)\n       }\n       LazyColumn {\n           items(searchHistory) {\n               Text(\n                   text = it,\n                   fontSize = 20.sp,\n                   modifier = Modifier.padding(start = 10.dp).testTag(&quot;attempt&quot;)\n               )\n           }\n       }\n   }\n}\n<\/pre>\n\n\n<p>\uc5ec\uae30\uc11c\ub294 \uac80\uc0c9 \uc2dc\ub3c4\ub97c \uae30\ub85d\ud558\ub294 \uac04\ub2e8\ud55c UI\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/SearchApp-resized-1.png\" alt=\"\ud14c\uc2a4\ud2b8\uc6a9\uc73c\ub85c \uc0ac\uc6a9\ub41c \uac80\uc0c9 \uc571\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/SearchApp-resized-1.gif\"><\/p>\n<p><code>Modifier.testTag<\/code>\ub294 <code>TextField<\/code>, <code>Button<\/code> \ubc0f <code>LazyColumn<\/code>\uc758 \ud56d\ubaa9\uc5d0 \uc774\ub984\uc744 \ud560\ub2f9\ud558\ub294 \ub370 \uc0ac\uc6a9\ub418\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub7f0 \ub2e4\uc74c JUnit \ud14c\uc2a4\ud2b8 \ub0b4\uc5d0\uc11c UI\ub97c \uc870\uc791\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nclass SearchAppTest {\n   @get:Rule\n   val compose = createComposeRule()\n\n\n   @Test\n   fun `Should display search attempts`() {\n       compose.setContent {\n           App()\n       }\n\n\n       val testSearches = listOf(&quot;cats&quot;, &quot;dogs&quot;, &quot;fish&quot;, &quot;birds&quot;)\n\n\n       for (text in testSearches) {\n           compose.onNodeWithTag(&quot;searchText&quot;).performTextReplacement(text)\n           compose.onNodeWithTag(&quot;search&quot;).performClick()\n       }\n\n\n       val lastAttempt = compose\n           .onAllNodesWithTag(&quot;attempt&quot;)\n           .assertCountEquals(testSearches.size)\n           .onLast()\n\n\n       val expectedText = &quot;You searched for: ${testSearches.last()}&quot;\n       lastAttempt.assert(hasText(expectedText))\n   }\n}\n<\/pre>\n\n\n<p>Compose \uad00\ub828 JUnit \uaddc\uce59\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub2e4\uc74c\uc744 \uc218\ud589\ud569\ub2c8\ub2e4.<\/p>\n<ol>\n<li>UI\uc758 \ucf58\ud150\uce20\ub97c App Composable\ub85c \uc124\uc815\ud569\ub2c8\ub2e4.<\/li>\n<li><code>onNodeWithTag<\/code>\ub97c \ud1b5\ud574 \ud14d\uc2a4\ud2b8 \ud544\ub4dc\uc640 \ubc84\ud2bc\uc758 \uc704\uce58\ub97c \ucc3e\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ud14d\uc2a4\ud2b8 \ud544\ub4dc\uc5d0 \uc0d8\ud50c \uac12\uc744 \ubc18\ubcf5\ud574\uc11c \uc785\ub825\ud558\uace0 \ubc84\ud2bc\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4.<\/li>\n<li><code>onAllNodesWithTag<\/code>\ub97c \ud1b5\ud574 \uc0dd\uc131\ub41c \ubaa8\ub4e0 \ud14d\uc2a4\ud2b8 \ub178\ub4dc\ub97c \ucc3e\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ud604\uc7ac \ud14d\uc2a4\ud2b8 \ub178\ub4dc \uc218\uac00 \uc0dd\uc131\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud558\uace0 \ub9c8\uc9c0\ub9c9 \ub178\ub4dc\ub97c \uac00\uc838\uc635\ub2c8\ub2e4.<\/li>\n<li>\uc774 \ub9c8\uc9c0\ub9c9 \uc2dc\ub3c4\uc5d0 \ud544\uc694\ud55c \uba54\uc2dc\uc9c0\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n<h3 class=\"wp-block-heading\">Swing \uc0c1\ud638 \uc6b4\uc6a9\uc131 \uac1c\uc120<\/h3>\n<p>\uc774\ubc88 \ub9b4\ub9ac\uc2a4\uc5d0\ub294 Swing \uad6c\uc131 \uc694\uc18c \ub0b4\uc5d0 \uad6c\uc131 \ud328\ub110 \ub80c\ub354\ub9c1\uc744 \uac1c\uc120\ud558\uae30 \uc704\ud55c \uc2e4\ud5d8\uc801 \uc9c0\uc6d0\uc774 \ub3c4\uc785\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ud328\ub110\uc744 \ud45c\uc2dc\ud558\uac70\ub098 \uc228\uae30\uac70\ub098 \ud06c\uae30\ub97c \uc870\uc815\ud560 \ub54c \uc804\ud658 \ub80c\ub354\ub9c1 \ubb38\uc81c\uac00 \ubc29\uc9c0\ub429\ub2c8\ub2e4. \ub610\ud55c Swing \uad6c\uc131 \uc694\uc18c\uc640 \uad6c\uc131 \ud328\ub110\uc744 \uacb0\ud569\ud560 \ub54c \uc801\uc808\ud55c \ub808\uc774\uc5b4 \uad6c\uc131\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4. \uc774\uc81c Swing \uad6c\uc131 \uc694\uc18c\ub97c <code>ComposePanel<\/code> \uc704\ub098 \uc544\ub798\uc5d0 \ud45c\uc2dc\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub97c \uc124\uba85\ud55c \uc544\ub798 \uc608\ub97c \uc0b4\ud3b4\ubcf4\uc138\uc694.<\/p>\n\n\n<pre class=\"kotlin-code\" data-highlight-only=\"true\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\nfun main() {\n   System.setProperty(&quot;compose.swing.render.on.graphics&quot;, &quot;true&quot;)\n   SwingUtilities.invokeLater {\n       val composePanel = ComposePanel().apply {\n           setContent {\n               Box(modifier = Modifier.background(Color.Black).fillMaxSize())\n           }\n       }\n\n\n       val popup = object : JComponent() { ... }\n\n\n       val rightPanel = JLayeredPane().apply {\n           add(composePanel)\n           add(popup)\n           ...\n       }\n\n\n       val leftPanel = JPanel().apply { background = CYAN }\n\n\n       val splitter = JSplitPane(..., leftPanel,rightPanel)\n\n\n       JFrame().apply {\n           add(splitter)\n           setSize(600, 600)\n           isVisible = true\n       }\n   }\n}\n<\/pre>\n\n\n<p>\uc774 \ucf54\ub4dc\uc5d0\uc11c\ub294 \ub2e4\uc74c \ucf58\ud150\uce20\ub85c \uad6c\uc131\ub41c Swing <code>JFrame<\/code>\uc744 \uc0dd\uc131\ud558\uace0 \ud45c\uc2dc\ud569\ub2c8\ub2e4.<\/p>\n<ol>\n<li>JFrame\uc5d0\ub294 \uc218\uc9c1 \ubd84\ud560\uc120\uc774 \uc788\ub294 <code>JSplitPane<\/code>\uc774 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\ubd84\ud560 \ucc3d \uc67c\ucabd\uc5d0\ub294 \uccad\ub85d\uc0c9\uc758 \ud45c\uc900 <code>JPanel<\/code>\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\uc624\ub978\ucabd\uc5d0\ub294 \ub450 \uac1c\uc758 \ub808\uc774\uc5b4\ub85c \uad6c\uc131\ub41c <code>JLayeredPane<\/code>\uc774 \uc788\uc2b5\ub2c8\ub2e4.\n<ul>\n<li><code>Box<\/code> \ucef4\ud3ec\uc800\ube14\uc774 \ud3ec\ud568\ub41c \uac80\uc815\uc0c9 <code>ComposePanel<\/code><\/li>\n<li>\ud770\uc0c9 \uc9c1\uc0ac\uac01\ud615 \uc548\uc5d0 &#8216;Popup&#8217;\uc774\ub77c\ub294 \ud14d\uc2a4\ud2b8\uac00 \uc788\ub294 \uc0ac\uc6a9\uc790 \uc9c0\uc815 Swing \uad6c\uc131 \uc694\uc18c. \uc774\ub294 <code>paintComponent<\/code> \uba54\uc11c\ub4dc\ub97c \uc7ac\uc815\uc758\ud558\uc5ec \uad6c\ud604\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><code>compose.swing.render.on.graphics<\/code> \ud504\ub85c\ud37c\ud2f0\uac00 true\ub85c \uc124\uc815\ub418\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ub429\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc0ac\uc6a9\uc790 \uc9c0\uc815 Swing \uad6c\uc131 \uc694\uc18c\uac00 <code>Box<\/code> Composable \uc704\uc5d0 \ud45c\uc2dc\ub429\ub2c8\ub2e4.<\/li>\n<li>\uc2ac\ub77c\uc774\ub354\ub97c \uc774\ub3d9\ud560 \ub54c \uc804\ud658\ub418\ub294 \uadf8\ub798\ud53d \uc544\ud2f0\ud329\ud2b8\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/SpringInteropTrue0resized.png\" alt=\"Swing \uc0c1\ud638\uc6b4\uc6a9\uc131 \ub370\ubaa8 \uc791\ub3d9\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/SpringInteropTrue0resized.gif\" \/><\/p>\n<p>\uc774 \ud50c\ub798\uadf8\uac00 \uc124\uc815\ub418\uc9c0 \uc54a\uc740 \uacbd\uc6b0, \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uad6c\uc131 \uc694\uc18c\uac00 \ud45c\uc2dc\ub418\uc9c0 \uc54a\uc73c\uba70 \uc2ac\ub77c\uc774\ub354\ub97c \uc774\ub3d9\ud560 \ub54c \uc804\ud658 \uc544\ud2f0\ud329\ud2b8\uac00 \uc788\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/SpringInteropFalse.png\" alt=\"Swing \uc0c1\ud638\uc6b4\uc6a9\uc131 \ub370\ubaa8 \uc791\ub3d9 \uc548 \ud568\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/08\/SpringInteropFalse.gif\" \/><\/p>\n<p>Compose Multiplatform\uc5d0 \ub300\ud55c \uc758\uacac\uc744 \uacf5\uc720\ud574 \uc8fc\uc138\uc694. Compose Multiplatform \ubc0f Jetpack Compose\uc640 \uad00\ub828\ub41c \uc77c\ubc18\uc801\uc778 \uc8fc\uc81c\ub97c \ub17c\uc758\ud560 \uc218 \uc788\ub294 <a href=\"https:\/\/slack-chats.kotlinlang.org\/c\/compose\" target=\"_blank\" rel=\"noopener\">#compose<\/a> \ucc44\ub110\uc758 Kotlin Slack \ud1a0\ub860\uc5d0 \ucd08\ub300\ud569\ub2c8\ub2e4. <a href=\"https:\/\/slack-chats.kotlinlang.org\/c\/compose-ios\" target=\"_blank\" rel=\"noopener\">#compose-ios<\/a>\uc5d0\uc11c\ub294 Compose Multiplatform for iOS\uc640 \uad00\ub828\ub41c \ub17c\uc758\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p align=\"center\"><a class=\"ek-link jb-download-button\" title=\"Compose Multiplatform 1.5.0 \uc0ac\uc6a9\ud574 \ubcf4\uae30\" href=\"https:\/\/github.com\/JetBrains\/compose-multiplatform\/releases\/tag\/v1.5.0\" target=\"_blank\" rel=\"noopener\">Compose Multiplatform 1.5.0 \uc0ac\uc6a9\ud574 \ubcf4\uae30<\/a><\/p>\n<h2 class=\"wp-block-heading\">\uae30\ud0c0 \uc720\uc6a9\ud55c \uae00\uacfc \uc601\uc0c1<\/h2>\n<ul>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/05\/compose-multiplatform-for-ios-is-in-alpha\/\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/kotlin\/2023\/05\/compose-multiplatform-for-ios-is-in-alpha\/\">Compose Multiplatform for iOS \uc54c\ud30c \ubc84\uc804 \ucd9c\uc2dc<\/a><\/li>\n<\/ul>\n<ul>\n<li><a href=\"https:\/\/www.jetbrains.com\/ko-kr\/lp\/compose-multiplatform\/\" target=\"_blank\" rel=\"noreferrer noopener\">Compose Multiplatform \uac1c\uc694<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=5_W5YKPShZ4&amp;t=3s\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"link\" data-id=\"https:\/\/www.youtube.com\/watch?v=5_W5YKPShZ4&amp;t=3s\">Compose Multiplatform\uc744 \uc0ac\uc6a9\ud558\uc5ec iOS \ubc0f Android \uc571 \ube4c\ub4dc <\/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":382342,"comment_status":"closed","ping_status":"closed","template":"","categories":[956],"tags":[6481,8144,6706],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/388026"}],"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=388026"}],"version-history":[{"count":7,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/388026\/revisions"}],"predecessor-version":[{"id":388044,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/kotlin\/388026\/revisions\/388044"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media\/382342"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=388026"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=388026"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=388026"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=388026"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}