Skip to content

Jetpack Compose Convention

Inhyeop Lee edited this page Dec 11, 2025 · 2 revisions

ํŒจํ‚ค์ง€ ๊ตฌ์กฐ

feature:xxx
 โ”œโ”€ ๐Ÿ“ navigation
 โ””โ”€ ๐Ÿ“ ui
     โ”œโ”€ ๐Ÿ“ component
     โ”œโ”€ ๐Ÿ“„ Screen
     โ”œโ”€ ๐Ÿ“„ UiEvent
     โ”œโ”€ ๐Ÿ“„ UiState
     โ”œโ”€ ๐Ÿ“„ ViewModel
     โ””โ”€ ...
Bottari
 โ”œโ”€ app // ์•ฑ ์ง„์ž…์ 
 โ”œโ”€ build-logic // ๊ณตํ†ต Gradle ์„ค์ •, ํ”Œ๋Ÿฌ๊ทธ์ธ ์ •์˜
 โ”œโ”€ core
 โ”‚   โ”œโ”€ core:designsystem // ์ƒ‰์ƒยทํƒ€์ดํฌยท์ปดํฌ๋„ŒํŠธ ๋“ฑ ๊ณตํ†ต ๋””์ž์ธ ์‹œ์Šคํ…œ
 โ”‚   โ”œโ”€ core:ui // FadeEdge, Sheet ๋“ฑ ๋„๋ฉ”์ธ ๋…๋ฆฝ UI ์œ ํ‹ธ
 โ”‚   โ”œโ”€ core:model // ์ˆœ์ˆ˜ Kotlin ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค ์ •์˜
 โ”‚   โ”œโ”€ core:domain // UseCase ๋“ฑ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ธํ„ฐํŽ˜์ด์Šค
 โ”‚   โ”œโ”€ core:data // Repository ๊ตฌํ˜„ ๋ฐ ๋ฐ์ดํ„ฐ ์กฐํ•ฉ ๊ณ„์ธต
 โ”‚   โ”œโ”€ core:network // RetrofitยทOkHttp ๊ธฐ๋ฐ˜ API ํ†ต์‹  ์ •์˜
 โ”‚   โ””โ”€ core:local // RoomยทDataStore ๋“ฑ ๋กœ์ปฌ ์ €์žฅ ๊ตฌํ˜„
 โ””โ”€ feature
     โ”œโ”€ feature:main       // ์ฒซ ์ง„์ž… + ๋ฉ”์ธ NavHost
     โ””โ”€ ... (๊ธฐ๋Šฅ๋ณ„ ์ถ”๊ฐ€)

์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ

Screen โ†’ ScreenContent โ†’ Section(Header, Body โ€ฆ) โ†’ Element(Button, Image โ€ฆ)

๊ทœ์น™ 1. ์—ญํ• ์ด ๋‘ ๊ฐœ ์ด์ƒ ๋ณด์ด๋ฉด ์ž˜๋ผ๋‚ธ๋‹ค (๋‹จ์ผ ์ฑ…์ž„)

๊ทœ์น™ 2. ๋™์ผ/์œ ์‚ฌํ•œ UI๊ฐ€ 2๋ฒˆ ์ด์ƒ ๋“ฑ์žฅํ•˜๋ฉด ๋ถ„๋ฆฌ (Common or Element)

๊ทœ์น™ 3. ์ค‘์ฒฉ ๊นŠ์ด ๊ธฐ์ค€

Column {
    // ์—ฌ๊ธฐ ๋ถ„๋ฆฌ
    Row {
        Column {
            Row { ... }
            Text()
        }
    }
    
    Text()
}`

์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜

Composable ํ•จ์ˆ˜ ๋ช…๋ช…

๊ทœ์น™

  • UI๋ฅผ ๊ทธ๋ฆฌ๋Š” @Composable ํ•จ์ˆ˜ ์ด๋ฆ„์€ PascalCase + ๋ช…์‚ฌํ˜•์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • ๋ฐ˜ํ™˜๊ฐ’์ด Unit์ด๋ฉด ๋ช…์‚ฌํ˜•์œผ๋กœ, ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด ๋™์‚ฌํ˜•์œผ๋กœ ์ž‘์„ฑํ•ด๋„ ๋œ๋‹ค.

์ด์œ 

  • Composable์€ โ€œUI ๊ฐ์ฒด ์ƒ์„ฑ์žโ€์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋ฏ€๋กœ ๋ช…์‚ฌํ˜•์ด ๋” ์ง๊ด€์ ์ด๋‹ค.
  • Kotlin ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜๊ณผ Material ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Button, Card, Text) ์Šคํƒ€์ผ์„ ๋”ฐ๋ฅธ๋‹ค.
// โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ
@Composable
fun ProfileCard(userName: String, modifier: Modifier = Modifier) {
    Text(text = userName)
}

// ๐Ÿšซ ์ž˜๋ชป๋œ ์˜ˆ์‹œ
@Composable
fun drawProfileCard(userName: String) { // ๋™์‚ฌ ์‹œ์ž‘ X
    Text(text = userName)
}

ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ

๊ทœ์น™

  • ์ปดํฌ์ €๋ธ” ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆœ์„œ๋ฅผ ์ค€์ˆ˜ํ•œ๋‹ค.
    • ํ•„์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ โ†’ Modifier โ†’ ์„ ํƒ์  ํŒŒ๋ผ๋ฏธํ„ฐ
  • ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์„ ์–ธ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ „๋‹ฌํ•œ๋‹ค.

์ด์œ 

  • ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ, ๋ ˆ์ด์•„์›ƒ ๊ด€๋ จ ์„ค์ •, UI ์˜ต์…˜ ์ˆœ์„œ๋Œ€๋กœ ์ž‘์„ฑํ•˜๋ฉด โ€œ๋ฌด์—‡์„ ๋ณด์—ฌ์ค„์ง€, ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ• ์ง€, ์–ด๋–ค ์ƒํƒœ๋กœ ๋ณด์—ฌ์ค„์ง€โ€ ๋ผ๋Š” ๋…ผ๋ฆฌ์  ํ๋ฆ„์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ˆœ์„œ๊ฐ€ ํ†ต์ผ๋˜์–ด์•ผ ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค.

    @Composable
    fun Text(
        text: String,
        modifier: Modifier = Modifier,
        color: Color = Color.Unspecified,
        fontSize: TextUnit = TextUnit.Unspecified,
        fontStyle: FontStyle? = null,
        fontWeight: FontWeight? = null,
        fontFamily: FontFamily? = null,
        letterSpacing: TextUnit = TextUnit.Unspecified,
        textDecoration: TextDecoration? = null,
        textAlign: TextAlign? = null,
        lineHeight: TextUnit = TextUnit.Unspecified,
        overflow: TextOverflow = TextOverflow.Clip,
        softWrap: Boolean = true,
        maxLines: Int = Int.MAX_VALUE,
        minLines: Int = 1,
        onTextLayout: ((TextLayoutResult) -> Unit)? = null,
        style: TextStyle = LocalTextStyle.current
    )
    
    // โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ
    Text(
    	text = "ํ…์ŠคํŠธ",
    	modifier = modifier,
    	color = Color.Black,
    	maxLines = 1,
    )
    
    // ๐Ÿšซ ์ž˜๋ชป๋œ ์˜ˆ์‹œ
    Text(
    	color = Color.Black,
    	modifier = modifier,
    	text = "ํ…์ŠคํŠธ",
    	maxLines = 1,
    )

ํŒŒ๋ผ๋ฏธํ„ฐ ๋„ค์ด๋ฐ

๊ทœ์น™

  • ํŒŒ๋ผ๋ฏธํ„ฐ ๋ช…์— ์ž๋ฃŒํ˜•์„ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ด์œ 

  • Kotlin์€ ํƒ€์ž… ์ถ”๋ก  ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ž๋ฃŒํ˜•์ด ๋ช…ํ™•ํ•œ ๊ฒฝ์šฐ ์ด๋ฆ„์— ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • Jetpack Compose๋Š” ์„ ์–ธํ˜• UI๋ฅผ ์ง€ํ–ฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, โ€œ๋ฌด์—‡์„ ๋ณด์—ฌ์ฃผ๋Š”๊ฐ€โ€์— ์ง‘์ค‘ํ•ด์•ผ ํ•œ๋‹ค.

    // โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ
    @Composable
    fun ItemEditLazyColumn(
        items: List<PersonalChecklistItemUiModel>,
        onDeleteClick: (Long) -> Unit,
        listState: LazyListState,
        modifier: Modifier = Modifier,
    )
    
    // ๐Ÿšซ ์ž˜๋ชป๋œ ์˜ˆ์‹œ
    @Composable
    fun ItemEditLazyColumn(
        itemList: List<PersonalChecklistItemUiModel>,
        onDeleteClick: (Long) -> Unit,
        listState: LazyListState,
        modifier: Modifier = Modifier,
    )

๊ทœ์น™

  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ (๋žŒ๋‹ค ํ•จ์ˆ˜) ๋Š” on + ์ฃผ์–ด + ๋™์‚ฌ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
    • ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ(())๊ฐ€ ์•ˆ์˜ ์š”์†Œ๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๋•Œ (name: String, id: Long) -> Unit ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ณณ์—์„œ๋Š” on + ๋™์‚ฌ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค. (์ปดํฌ์ €๋ธ”์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ)

์ด์œ 

  • โ€œ๋ฌด์–ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑโ€์ด๋ฏ€๋กœ, ๊ทธ ์ด๋ฆ„์€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ์‹œ์ ์„ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด์•ผ ํ•œ๋‹ค.

  • Jetpack Compose์˜ ๊ณต์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ชจ๋‘ ์œ„ ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค.

  • ์ „๋‹ฌ๋˜๋Š” ๋กœ์ง์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์™ธ๋ถ€์— ์•Œ๋ฆฌ๋Š” ์—ญํ• ์ด๋ผ๋Š” ์ ์„ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

    // โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ
    @Composable
    fun RepeatDaySelector(
        alarm: AlarmUiModel,
        onRepeatDaysChange: (RepeatDayUiModel) -> Unit,
        modifier: Modifier = Modifier,
    )
    
    // ๐Ÿšซ ์ž˜๋ชป๋œ ์˜ˆ์‹œ 1 : ๋™์‚ฌ + ์ฃผ์–ด ํ˜•ํƒœ์ธ ๊ฒฝ์šฐ
    @Composable
    fun RepeatDaySelector(
        alarm: AlarmUiModel,
        onChangeRepeatDays: (RepeatDayUiModel) -> Unit,
        modifier: Modifier = Modifier,
    )
    
    // ๐Ÿšซ ์ž˜๋ชป๋œ ์˜ˆ์‹œ 2 : ๋™์‚ฌ๊ฐ€ ๊ณผ๊ฑฐํ˜•์ธ ๊ฒฝ์šฐ
    @Composable
    fun RepeatDaySelector(
        alarm: AlarmUiModel,
        onChangedRepeatDays: (RepeatDayUiModel) -> Unit,
        modifier: Modifier = Modifier,
    )

Modifier

Modifier ํŒŒ๋ผ๋ฏธํ„ฐ

๊ทœ์น™

  • UI๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ชจ๋“  Composable์—๋Š” modifier: Modifier = Modifier ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค.
  • ์œ„์น˜๋Š” ํ•„์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๋’ค, ์ฒซ ๋ฒˆ์งธ ์„ ํƒ์  ํŒŒ๋ผ๋ฏธํ„ฐ์—ฌ์•ผ ํ•œ๋‹ค.
// โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ
@Composable
fun ProfileCard(
    name: String,
    modifier: Modifier = Modifier,
) {
    Text(
        text = name,
        modifier = modifier
            .padding(8.dp)
            .background(Color.LightGray)
    )
}

// ๐Ÿšซ ์ž˜๋ชป๋œ ์˜ˆ์‹œ โ€” modifier ์œ„์น˜๊ฐ€ ๋’ค์ชฝ
@Composable
fun ProfileCard(
    name: String,
    backgroundColor: Color = Color.Gray,
    modifier: Modifier = Modifier,
) { ... }

State

State ํ˜ธ์ด์ŠคํŒ… (Hoisting)

๊ทœ์น™

  • MutableState๋‚˜ State๋ฅผ ์ง์ ‘ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

  • ๋Œ€์‹  ํ˜„์žฌ ๊ฐ’ + ๋ณ€๊ฒฝ ์ฝœ๋ฐฑ ํ˜•ํƒœ๋กœ ๋ฐ›๋Š”๋‹ค.

    ์˜ˆ: (value: String, onValueChange: (String) -> Unit)

์ด์œ 

  • ์ƒํƒœ ์†Œ์œ ๊ถŒ์ด ๋ช…ํ™•ํ•ด์ง€๊ณ , ViewModel ๋˜๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
  • Compose recomposition ์ด ์ตœ์ ํ™”๋œ๋‹ค.
// โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ
@Composable
fun NameField(
    value: String,
    onValueChange: (String) -> Unit,
    modifier: Modifier = Modifier,
) {
    TextField(
        value = value,
        onValueChange = onValueChange,
        modifier = modifier
    )
}

// ๐Ÿšซ ์ž˜๋ชป๋œ ์˜ˆ์‹œ
@Composable
fun NameField(
    nameState: MutableState<String>, // ์ƒํƒœ ์ง์ ‘ ์ „๋‹ฌ โŒ
    modifier: Modifier = Modifier,
) {
    TextField(
        value = nameState.value,
        onValueChange = { nameState.value = it },
        modifier = modifier
    )
}

๊ธฐ๋ณธ๊ฐ’ ๊ด€๋ฆฌ

๊ทœ์น™

  • ๊ธฐ๋ณธ๊ฐ’์€ Companion object ๋˜๋Š” ComponentDefaults ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.
  • null์„ โ€œ๊ธฐ๋ณธ๊ฐ’โ€์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. null์€ โ€œ์—†์Œโ€์„ ์˜๋ฏธํ•ด์•ผ ํ•œ๋‹ค.

์ด์œ 

  • ๋‚ด๋ถ€ ๋กœ์ง๊ณผ ๊ธฐ๋ณธ๊ฐ’ ์ •์˜๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ํ…Œ์ŠคํŠธ์™€ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.
  • ๋ช…์‹œ์  ๊ธฐ๋ณธ๊ฐ’์€ ์ฝ”๋“œ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ธ๋‹ค.
object CardDefaults {
    val ContainerColor = Color.White
    val Shape = RoundedCornerShape(12.dp)
}

@Composable
fun InfoCard(
    modifier: Modifier = Modifier,
    containerColor: Color = CardDefaults.ContainerColor,
    shape: Shape = CardDefaults.Shape,
    content: @Composable () -> Unit,
) {
    Surface(
        modifier = modifier,
        color = containerColor,
        shape = shape,
    ) {
        content()
    }
}

Stateless vs Stateful ๊ตฌ๋ถ„

๊ทœ์น™

  • ๊ฐ€๋Šฅํ•œ ํ•œ stateless ์ปดํฌ๋„ŒํŠธ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์ƒํƒœ๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…๋ฐ›๋„๋ก ์„ค๊ณ„ํ•œ๋‹ค.

์ด์œ 

  • ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ํ–ฅ์ƒ
  • Preview, UI Test, Snapshot Test์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ViewModel๊ณผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ
// โœ… Stateless
@Composable
fun Counter(
    count: Int,
    onIncrement: () -> Unit,
) {
    Button(onClick = onIncrement) {
        Text("Count: $count")
    }
}

// ๐Ÿšซ Stateful โ€” ๋‚ด๋ถ€์—์„œ remember ์‚ฌ์šฉ (ํ˜ธ์ถœ์ž ์ œ์–ด ๋ถˆ๊ฐ€)
@Composable
fun Counter() {
    var count by remember { mutableStateOf(0) }
    Button(onClick = { count++ }) {
        Text("Count: $count")
    }
}

Slot API

๊ทœ์น™

  • ํ•˜์œ„ UI๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด @Composable () -> Unit ํ˜•ํƒœ์˜ Slot ์ œ๊ณต.
  • SlotScope (RowScope, BoxScope ๋“ฑ)๋ฅผ ํ•จ๊ป˜ ์ „๋‹ฌํ•˜๋ฉด ๋”์šฑ ์œ ์—ฐํ•˜๋‹ค.

์ด์œ 

  • Button, Card, Scaffold ๋“ฑ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์  ์ปดํฌ๋„ŒํŠธ๋Š” ์Šฌ๋กฏ์ด ํ™•์žฅ์„ฑ์„ ๊ฒฐ์ •ํ•œ๋‹ค.
@Composable
fun AlertDialogCard(
    title: String,
    modifier: Modifier = Modifier,
    content: @Composable ColumnScope.() -> Unit,
) {
    Column(
        modifier = modifier
            .padding(16.dp)
            .background(Color.White, RoundedCornerShape(8.dp))
    ) {
        Text(text = title, style = MaterialTheme.typography.titleMedium)
        Spacer(Modifier.height(8.dp))
        content()
    }
}

์ ‘๊ทผ์„ฑ

๊ทœ์น™

  • ์ด๋ฏธ์ง€๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์—๋Š” contentDescription ์ž‘์„ฑ.
  • ์ด๋ฏธ์ง€๊ฐ€ ์ˆœ์ „ํžˆ ์žฅ์‹์šฉ์ด๊ณ  ํด๋ฆญ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ฝ˜ํ…์ธ ์™€ ๊ด€๋ จ์ด ์—†๋‹ค๋ฉด contentDescription์„ null๋กœ ์„ค์ •.
  • ํด๋ฆญ ๊ฐ€๋Šฅ ์š”์†Œ๋Š” Modifier.semantics ๋˜๋Š” Modifier.clickable ๋กœ ์‹œ๋งจํ‹ฑ ์ •๋ณด ํฌํ•จ.

์ด์œ 

  • ์Šคํฌ๋ฆฐ ๋ฆฌ๋”, ์Œ์„ฑ ์•ˆ๋‚ด ๋“ฑ ๋ณด์กฐ๊ธฐ๊ธฐ ์ ‘๊ทผ์„ฑ ํ™•๋ณด๋ฅผ ์œ„ํ•œ ์ตœ์†Œ ์กฐ๊ฑด์ด๋‹ค.
@Composable
fun Avatar(
    imageUrl: String,
    contentDescription: String?,
    modifier: Modifier = Modifier,
) {
    Image(
        painter = rememberAsyncImagePainter(imageUrl),
        contentDescription = contentDescription,
        modifier = modifier
            .size(40.dp)
            .clip(CircleShape)
    )
}

API ๋ณ€๊ฒฝ ์‹œ ์›์น™

๊ทœ์น™

  • ๊ธฐ์กด ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ ˆ๋Œ€ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ƒˆ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ธฐ๋ณธ๊ฐ’(default)์„ ์ง€์ •ํ•œ๋‹ค.
  • ํ•„์š” ์‹œ ์˜ค๋ฒ„๋กœ๋“œ๋กœ ๋Œ€์ฒดํ•˜๊ณ , ๊ธฐ์กด ํ•จ์ˆ˜๋Š” @Deprecated ์ฒ˜๋ฆฌํ•œ๋‹ค.

์ด์œ 

  • Compose๋Š” ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ API์ด๋ฏ€๋กœ, ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ญ์ œ๊ฐ€ ๋ฐ”๋กœ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋กœ ์ด์–ด์ง„๋‹ค.
  • ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํŒ€ ๋‚ด/์™ธ๋ถ€ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์œ ์ง€๋œ๋‹ค.
// โœ… ์ƒˆ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ ๋ฒ„์ „
@Composable
fun Badge(
    count: Int,
    modifier: Modifier = Modifier,
    backgroundColor: Color = Color.Red, // ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ํŒŒ๋ผ๋ฏธํ„ฐ
) { ... }

// ๐Ÿšซ ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค
@Deprecated("Use Badge(count, modifier, backgroundColor) instead",
    level = DeprecationLevel.HIDDEN)
@Composable
fun Badge(count: Int, modifier: Modifier = Modifier) =
    Badge(count, modifier, backgroundColor = Color.Red)

์ฐธ๊ณ  ์ž๋ฃŒ

Compose API Guideline

Compose Component API Guideline

https://hongbeomi.medium.com/๋ฒˆ์—ญ-compose-api-๊ฐ€์ด๋“œ๋ผ์ธ-e6d999408d92

๐Ÿงณ ๋ณด๋”ฐ๋ฆฌ


๊ณตํ†ต


AN (Android)


BE (Backend)

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…


Clone this wiki locally