Skip to content

2024 11 11_daily_scrum

์ž„ํ˜•์ค€ edited this page Nov 14, 2024 · 2 revisions

์ผ์‹œ: 2024-11-11

์ฐธ์„์ž: ์ •์œ ์ง„, ์ž„ํ˜•์ค€, ๋…ธ์ง„ํ™˜, ๊น€๋„์œค, ๊น€์ •ํ˜ธ

๐Ÿ’ก ์ฃผ๋ง ์ง„ํ–‰ ์ƒํ™ฉ ๋ณด๊ณ 

K005_๊น€๋„์œค, K020_๋…ธ์ง„ํ™˜, K043_์ž„ํ˜•์ค€

  • ํœด์‹

K012_๊น€์ •ํ˜ธ

  • ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ์ง„ํ–‰

K046_์ •์œ ์ง„

  • ๊ฐœ์ธ ๊ณต๋ถ€ ์ง„ํ–‰ํ–ˆ์Œ

๐Ÿ’ก๋…ผ์˜ํ•  ์‚ฌํ•ญ

โœ… ๊ทธ๋ผ์šด๋“œ ๋ฃฐ ๋ฐ ๊ทœ์น™ ์ ๊ฒ€ํ•˜๊ธฐ

์ž์‹ ์ด ์ž˜ ๋ชจ๋ฅด๋Š” ํ† ๋ก  ์ฃผ์ œ์ผ ๋•Œ

  • ๋ชจ๋ฅธ๋‹ค๊ณ  ์†”์งํžˆ ๋งํ•˜๊ธฐ
  • ์กฐ์‚ฌํ•˜๋Š” ์‹œ๊ฐ„ ๊ฐ–๊ณ  ๋งˆ์ € ํ† ๋ก ํ•˜๊ธฐ

PR ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ

  • ๋ธŒ๋žœ์น˜ ๋ณ„ ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด์„œ ๋จธ์ง€ํ•  ๋•Œ ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋ฉด ์ข‹์„๊นŒ?
    • ๊ด€๋ จ๋œ ๊ฒƒ์— PR์„ ๋‚ ๋ฆฌ๋Š” ๋ฐฉ์•ˆ

      โ†’ ํ•˜๋‚˜์˜ ๋ธŒ๋žœ์น˜์—์„œ๋งŒ pull์„ ๋ฐ›์•„์™€์•ผํ•จ

      โ†’ task ๋ถ„๋ฐฐ๊ฐ€ ์ค‘์š”

    • ์ž‘์—…์˜ ๋‹จ์œ„๋ฅผ ๋ถ„๋ฆฌ

๋ผ๋ฒจ & ๋งˆ์ผ์Šคํ†ค ์ง€์ •ํ•˜๊ธฐ

โ†’ ์—ํ”ฝ, ์Šคํ† ๋ฆฌ๋กœ ์ง€์ •ํ•˜๊ธฐ

๐Ÿ“‘ ๊ฐœ๋ฐœ ๊ด€๋ จ

์ง€๋‚œ ์ฃผ

  • task ์ž‘์„ฑ์„ ์ถ”ํ›„ ์ง„ํ–‰ํ•œ ๊ฒฐ๊ณผ ๊ธฐ์กด ์ž‘์„ฑ task์™€ ๋‹ค๋ฅด๊ฑฐ๋‚˜ ์™„์„ฑ๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€ ์•Š๋Š”๊ฐ€
  • task๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค์–ด๋ด์•ผ ํ•˜์ง€ ์•Š๋Š”๊ฐ€
  • ๊ฒน์น˜๋Š” ๊ธฐ๋Šฅ์˜ ์‚ฌ๋žŒ์˜ ์†Œํ†ต ํ•„์š”
  • ๋‚˜๋จธ์ง€๋Š” okay

์ด๋ฒˆ ์ฃผ ๊ฐœ๋ฐœ ์ง„ํ–‰ ๋ชฉํ‘œ ์ˆ˜๋ฆฝ

  • Figma์— ์žˆ๋Š” ๊ฒƒ ์ „๋ถ€
    • Figma UI ๋””์ž์ธ ๋งˆ๋ฌด๋ฆฌ
    • ๋‹ค ๋ชปํ–ˆ๋˜ ์ž‘์—…๋“ค
      • ๋„๊ฐ ํด๋” ํ™•์ธ + ์‚ฌ์ง„ ์„ ํƒ ๋“ฑ ํ™”๋ฉด
      • Home Screen
      • ๋„๊ฐ ์ €์žฅ ํ™”๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ
      • Splash << ์šฐ์„ ์ˆœ์œ„ ๋‚ฎ์€ ์ž‘์—…
    • ๋กœ๊ทธ์ธ
    • FireBase
    • ์ง€๋„
    • ๋ฐฐํฌ

์Šคํ”„๋ฆฐํŠธ ์ง„ํ–‰ ์˜ˆ์ •

3 โ†’ mvp 1์ฐจ ๋ฐฐํฌ

4 โ†’ AI, ์นœ๊ตฌ ๊ธฐ๋Šฅ ๋„์ž…

5 โ†’ ๋ณด์™„

6 โ†’ ๋งˆ๋ฌด๋ฆฌ + ๋ฐœํ‘œ ์ค€๋น„

๋ฐฑ๋กœ๊ทธ ์—…๋ฌด ๋ถ„๋ฐฐ

์›”์š”์ผ

  • Figma์— ์žˆ๋Š” ๊ฒƒ ์ „๋ถ€
    • Figma UI ๋””์ž์ธ ๋งˆ๋ฌด๋ฆฌ โ‡’ ๋‚˜์ค‘์— ๋ณ€๊ฒฝํ•  ์˜ˆ์ • โ†’ ํ˜•์ค€, ์œ ์ง„
      • ๋ฏธ์  ๊ฐ๊ฐ์„ ์‚ด๋ ค Home Screen UI/UX ๋””์ž์ธ
      • ๋””์ž์ธ ๋œ Home Screen ๊ตฌํ˜„
    • ๋‹ค ๋ชปํ–ˆ๋˜ ์ž‘์—…๋“ค
      • ๋„๊ฐ ํด๋” ํ™•์ธ + ์‚ฌ์ง„ ์„ ํƒ ๋“ฑ ํ™”๋ฉด โ†’ ์ •ํ˜ธ, ๋„์œค

        • UI ํ™”๋ฉด ๊ตฌ์„ฑ ๋จผ์ €
        • ๊ธฐ๋Šฅ ๊ตฌํ˜„

        image

      • ๋„๊ฐ ์ €์žฅ ํ™”๋ฉด ์ƒํƒœ ๊ด€๋ฆฌ โ†’ ์ง„ํ™˜

        image

        • Configuration change ๋Œ€์‘
        • ์œ„์น˜์ •๋ณด, ๋‚ ์งœ์ •๋ณด ์ €์žฅ ํ˜•์‹(๋ฌธ์ž์—ด) : yyyy.
      • Splash + Animation โ†’ ์œ ์ง„

      • Room DB Table ๋น ๋ฅธ ์ˆ˜์ • โ†’ ์ฝ”๋“œ 2์ค„๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋๋‚˜๋Š” ๋ถ€๋ถ„

        • Location์„ ์œ„๋„, ๊ฒฝ๋„ 2ํ•„๋“œ๋กœ ๋‚˜๋ˆ ์„œ ์ €์žฅํ•ด์•ผํ•จ. โ† Double ์ž๋ฃŒํ˜•

          SS
        • datetime์— convert ์‚ฌ์šฉ ๊ณ ๋ ค

      • detail ํ™”๋ฉด โ†’ ์œ ์ง„

ํ™”์š”์ผ

  • ๋กœ๊ทธ์ธ
  • FireBase
  • ์ง€๋„

์ˆ˜์š”์ผ

  • ๋กœ๊ทธ์ธ
  • FireBase
  • ์ง€๋„
  • ๋ฐฐํฌ

๋ชฉ์š”์ผ

  • ๋ฐฐํฌ

๊ทธ ์™ธ ์ˆ˜์ •ํ•ด์•ผํ•  ๋ถ€๋ถ„

  • Compose Navigation ์ฝ”๋“œ ๋ฆฌํŽ™ํ† ๋ง
  • viewModel๋กœ ์ธํ•ด Preview๊ฐ€ ์•ˆ๋ณด์ด๋Š” Screen์— ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด Preview๊ฐ€ ๋‹ค์‹œ ๋ณด์ด๋„๋ก ์ˆ˜์ • ์ž‘์—…
  • Room DB ๊ด€๋ จ
    • ๋„คํŠธ์›Œํฌ ๊ด€๋ จ์—์„œ ์บ์‹ฑ, ๋™๊ธฐํ™” ๋“ฑ ๊ณ ๋ คํ•˜๊ธฐ
  • LiveDate๋ฅผ StateFlow/Flow ๋กœ ๋ณ€ํ™˜

Label์— ์ €์žฅ๋œ #์—†๋Š” String์„ ์–ด๋–ป๊ฒŒ Color๋กœ?

  • ์œ ์ง„
package com.and04.naturealbum.utils

import androidx.compose.ui.graphics.Color

fun String.toColor(): Color {
val colorInt = android.graphics.Color.parseColor("#$this")
return Color(colorInt)
}
  • ์ง„ํ™˜
fun String.toColor() = Color(this.toLong(16))
  • ๋„์œค
// color์— # ํฌํ•จ
Color(parseColor(color))

image

โ†’ ColorUtils์— ์ €์žฅํ•˜๊ธฐ

โ†’ Color RGB 6์ž๋ฆฌ ์ €์žฅ ๋Œ€๋ฌธ์ž

โ†’ parseColor๋ฅผ ์จ์•ผ ํ•˜๋Š”๊ฐ€๋Š” ์ง„ํ™˜๋‹˜์ด ์ •๋ฆฌ ํ›„ ๊ฒฐ์ • โ–ผ

โ“ ๊ตณ์ด parseColor ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

@ColorInt
    public static int parseColor(@Size(min=1) String colorString) {
        if (colorString.charAt(0) == '#') {
            // Use a long to avoid rollovers on #ffXXXXXX
            long color = Long.parseLong(colorString.substring(1), 16);
            if (colorString.length() == 7) {
                // Set the alpha value
                color |= 0x00000000ff000000;
            } else if (colorString.length() != 9) {
                throw new IllegalArgumentException("Unknown color");
            }
            return (int)color;
        } else {
            Integer color = sColorNameMap.get(colorString.toLowerCase(Locale.ROOT));
            if (color != null) {
                return color;
            }
        }
        throw new IllegalArgumentException("Unknown color");
    }

โ†’rgb 6์ž๋ฆฌ ์ˆซ์ž์ด๊ฑฐ๋‚˜ argb 8์ž๋ฆฌ ์ˆซ์ž(Alpha๊ฐ’ ํฌํ•จ์‹œ ๋ฐ˜๋“œ์‹œ ๋‘๊ธ€์ž)

โ†’Alpha๊ฐ’์ด ์—†๋Š”๊ฒฝ์šฐ 0xff000000 (๋ถˆํˆฌ๋ช…)์„ ์ถ”๊ฐ€

โ†’int๋กœ ์บ์ŠคํŒ…ํ•ด ๋ฆฌํ„ด

โ‡’ ๋ฌธ์ž์—ด โ†’ Int์ธ๋ฐ ์™œ parseColor?

  • ๊ฐœ์ธ ์ทจํ–ฅ

  • ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž„ํฌํŠธ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Œ

  • ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Œ

  • ์‚ฌ์šฉํ•  ๋•Œ

    import android.graphics.Color as AndroidColor
    import androidx.compose.ui.graphics.Color as ComposeColor
    
    fun String.toColor(): ComposeColor {
        val colorInt = AndroidColor.parseColor("#$this")
        return ComposeColor(colorInt)
    }

    OR

    import android.graphics.Color.parseColor
    import androidx.compose.ui.graphics.Color
    
    fun String.toColor(): Color {
        val colorInt = parseColor("#$this")
        return Color(colorInt)
    }

    OR

    import androidx.compose.ui.graphics.Color
    
    fun String.toColor(): Color {
        val colorInt = android.graphics.Color.parseColor("#$this")
        return Color(colorInt)
    }
  • ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ

    const val OPAQUE = 0xff000000
    fun String.toColor(): Color {
        return Color(
            when {
                length <= 6 -> toLong(16) or OPAQUE
                length <= 8 -> toLong(16)
                else -> throw IllegalArgumentException("Unknown color")
            }
        )
    }

๊ฒฐ๋ก 

  • ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ธฐ
import android.graphics.Color.parseColor
import androidx.compose.ui.graphics.Color

fun String.toColor(): Color {
    val colorInt = parseColor("#$this")
    return Color(colorInt)
}

๐Ÿ’กํ™•์ธ ์‚ฌํ•ญ

Room DB ์„ ํƒ ์ด์œ  ๋ณด์™„ํ•˜์—ฌ ๋ฌธ์„œํ™”

[๋ฐœํ‘œ 2์ฐจ ์งˆ๋ฌธ ไธญ] Q. ๋ฃธ๋””๋น„๋ฅผ ์‚ฌ์šฉํ•˜์‹  ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. A. ํ˜„์žฌ ๋น„ํšŒ์› ๋ฐ ๋กœ์ปฌ ์ƒํƒœ์—์„œ์˜ ๋™์ž‘์„ ์šฐ์„ ์ ์œผ๋กœ ๋ชฉํ‘œ๋กœ ์žก์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ํ…Œ์ด๋ธ”์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ์ฟผ๋ฆฌ๋กœ ์ €ํฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” Room DB๋กœ ๋‚ด์žฅ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ Firebase ํ•™์Šต ํ›„ ๋„์ž… ์˜ˆ์ •์ด๋ฉฐ remote ๊ด€๋ จ ๋…ผ์˜ ํ›„ Friebase๋„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋น„ํšŒ์›๋„ FireBase๋กœ ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ Room์„ ์“ธ ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ?
  • ๋น„ํšŒ์›๋ณด๋‹ค๋Š” ๋„คํŠธ์›Œํฌ๊ฐ€ ๋Š๊ฒผ์„ ๋•Œ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•จ์ด ์ด์œ ์— ๋งž์„ ๊ฒƒ ๊ฐ™๋‹ค.
    • ๋™๊ธฐํ™”, ์บ์‹ฑ ๋“ฑ์˜ ์ž‘์—…์ด ์ถ”๊ฐ€๋กœ ๊ณ ๋ ค ๊ฐ€๋Šฅ

๊ฒฝ์šฐ์˜ ์ˆ˜

  • ๋น„ํšŒ์›
    • ๋ฐ์ดํ„ฐ ์ €์žฅ
    • ๋„คํŠธ์›Œํฌ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๋„คํŠธ์›Œํฌ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์‹œ ์„œ๋ฒ„์™€ ๋™๊ธฐํ™” ์ž‘์—… ํ•„์š”

WIKI ๋“ฑ๋ก

  • 1, 2์ฃผ์ฐจ ํŒ€ ํšŒ๊ณ  ์—…๋กœ๋“œ ํ•ด์•ผ ํ•จ

๐Ÿ’ก ์งˆ๋ฌธ ์‚ฌํ•ญ

โ“ ViewModel์— ์ €์žฅํ•  ์ƒํƒœ์™€ Composable์— ์ €์žฅํ•  ์ƒํƒœ์˜ ๊ธฐ์ค€์ด ์–ด๋–ป๊ฒŒ ๋˜์‹œ๋‚˜์š”?

  • Repository : ViewModel
  • Composable ๋‚ด์—์„œ ํ‘œํ˜„ํ•ด์ฃผ๊ณ  ๋๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ Composable ๋‚ด์—์„œ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•จ. ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ณ€๊ฒฝ์ด ๋˜๊ฑฐ๋‚˜ ๋ฐ›์•„์™€์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค์€ ViewModel์—์„œ ์ €์žฅํ•ด์„œ ๊ด€๋ฆฌํ•˜์—ฌ ์ง€์ •.

โœ”๏ธ ViewModel์— ์ €์žฅํ•  ์ƒํƒœ์™€ Composable์— ์ €์žฅํ•  ์ƒํƒœ์˜ ๊ธฐ์ค€ (SavePhotoScreen)

https://github.com/google-developer-training/basic-android-kotlin-compose-training-unscramble/blob/viewmodel/app/src/main/java/com/example/unscramble/ui/GameViewModel.kt

(Stateful Stateless ์ฐจ์ด ์ผ ์ˆ˜ ๋„ + state ํ˜ธ์ด์ŠคํŒ… ์ฐพ์•„๋ณด๊ธฐ)

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๊ธฐ์— ViewModel์— ๊ด€๋ฆฌํ•œ ๊ฒƒ์ธ๊ฐ€?

โ“ ๊ฐœ์ธ ๋ชฉํ‘œ

  • ๋„์œค
    • ์ปดํฌ์ฆˆ ๊ณ ์ˆ˜
      • Recomposition ๊ด€๋ฆฌ ์ž˜ํ•˜๊ธฐ
      • StateFul & StateLess
    • ํ”„๋กœ์ ํŠธ ์ดํ•ด
      • ์–ด๋–ค ๊ธฐ์ˆ ์„ ์™œ ์‚ฌ์šฉํ–ˆ๋Š”์ง€?
      • ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€
      • ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ ๋˜๋Š”์ง€
  • ์œ ์ง„: ์•ˆ๋“œ๋กœ์ด๋“œ ๊ณ ์ˆ˜ ๋˜๊ธฐ
    • XML๋ถ€ํ„ฐ Compose๊นŒ์ง€ ๋ชจ๋“  ๊ณผ์ • ์ดํ•ด
    • ๊ทผ๊ฑฐ ๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ
  • ํ˜•์ค€ : ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•ด ๋ณธ ๊ฒƒ์ด๋ผ๋ฉด ๊ฒ€์ƒ‰ํ•˜์ง€ ์•Š๊ณ ๋„ ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๊ธฐ
    • ์ •ํ™•ํ•œ ์ดํ•ด์™€ ๊ทธ๊ฒƒ์„ ์ž˜ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ
    • ๋ฌธ์„œํ™”์˜ ๊ณ ์ˆ˜๊ฐ€ ๋˜๊ธฐ
  • ์ง„ํ™˜ : ์ด์œ  ์žˆ๋Š” ๊ฐœ๋ฐœ์— ์ต์ˆ™ํ•ด์ง€๊ธฐ
    • ์–ด๋–ค ์ƒ๊ฐ์œผ๋กœ ๊ธฐ์ˆ ์Šคํƒ์„ ์ •ํ•˜๋Š”์ง€, ๋ฌธ์ œ ํ•ด๊ฒฐ๊ณผ์ • ๊ธฐ๋กํ•˜๊ธฐ
  • ์ •ํ˜ธ
    • ๊ทธ๋ƒฅ ๋ชฉํ‘œ : ์™„์„ฑ๋„์žˆ๋Š” ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ โ†’ ์ง€์ธ๋“คํ•œํ…Œ ์†Œ๊ฐœํ•˜๊ณ ์‹ถ๋‹ค
    • ๊ฐœ์ธ ๋ชฉํ‘œ : compose, xml ์ฐจ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ธฐ

๐ŸŽจ ๊ธฐํš ๋ฐ ๋””์ž์ธ


โค๏ธ ๊ทธ๋ผ์šด๋“œ ๋ฃฐ


๐Ÿ“š ๋ฌธ์„œ


๐Ÿ“‘ ๋ฏธํŒ… ๊ธฐ๋ก

๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ

1์ฃผ์ฐจ

2์ฃผ์ฐจ

3์ฃผ์ฐจ

4์ฃผ์ฐจ

5์ฃผ์ฐจ

ํšŒ์˜๋ก

1์ฃผ์ฐจ

2์ฃผ์ฐจ

3์ฃผ์ฐจ

4์ฃผ์ฐจ

5์ฃผ์ฐจ


Clone this wiki locally