๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ฑ| Android51

[Android] ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์—์„œ ๋ฌด์„  ๋””๋ฒ„๊น…์ด ๋˜์ง€ ์•Š์„ ๋•Œ, ์ˆ˜๋™์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• ์•ˆ๋…•ํ•˜์‹œ์ฃ ?ํšŒ์‚ฌ์ƒํ™œ์„ ํ•˜๋Š๋ผ ๋„ˆ๋ฌด ์˜ค๋žœ๋งŒ์— ํฌ์ŠคํŒ…์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.์•ž์œผ๋กœ๋Š” ์ตœ์†Œ 2์ฃผ์— 1๋ฒˆ์”ฉ์€ ํฌ์ŠคํŒ…์„ ํ•ด๋ณด๋„๋ก ๋…ธ๋ ฅํ•ด ๋ณด๊ฒ ๋‹ค. ๋‚ด๊ฐ€ ์ด์ „์— ์ด ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์• ๋จน์—ˆ๋‹ค๊ฐ€ ์ตœ๊ทผ์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ ๊นŒ๋จน๊ธฐ ์œ„ํ•ด ํฌ์ŠคํŒ…์„ ๋‚จ๊ธด๋‹ค.์ด๋ฒˆ์— ํ•ด๊ฒฐํ•œ ๋ฌธ์ œ๋Š” android studio์—์„œ ๋ฌด์„  ๋””๋ฒ„๊น…(wifi, pairing code)์ด ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๋•Œ, ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ ์–ด๋ณด๊ฒ ๋‹ค. ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๋ฌด์„  ๋””๋ฒ„๊น…์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡๋ช‡์˜ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์—ˆ๋Š”๋ฐ(๋ฐฉํ™”๋ฒฝ ํ•ด์ œ, android studio ์žฌ์‹œ์ž‘ ๋“ฑ๋“ฑ) ๋‚˜์—๊ฒŒ ์ ์šฉ๋˜์ง€ ์•Š์•„์„œ cmd(๋ช…๋ น ํ”„๋กฌํฌํŠธ)๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ํ•ด๊ฒฐ์ด ๋˜์—ˆ๋‹ค. 1. platform-tools๋กœ ์ด๋™ํ•˜๊ธฐ์šฐ์„  ๋ช…๋ น ํ”„๋กฌํฌํŠธ๋ฅผ ์ผ  ํ›„์ž์‹ ์ด ์„ค์น˜ํ•œ.. 2024. 4. 6.
[Android, Kotlin] Retrofit์—์„œ LocalDateTime ๋ฐ์ดํ„ฐ ๋ฐ›์•„์˜ค๊ธฐ 1. ์˜ค๋ฅ˜ ์ƒํ™ฉ retrofit์—์„œ localDateTime ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋˜ ์ค‘ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. ์œ„์˜ ์˜ค๋ฅ˜๋Š” LocalDateTime parsing์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์ด๋‹ค. ์ด ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์ž๋Š” ๊ฒ€์ƒ‰์„ ๊ธฐ๋ฐ˜์œผ๋กœ gson์— ๊ธฐ์กด์˜ localDatetime์„ parsing ํ•˜๋Š” ์ž‘์—…์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. val gson = GsonBuilder() .setDateFormat("yyyy-MM-dd'T'HH:mm:ss") .create() return GsonConverterFactory.create(gson) ์œ„์˜ ๋ฐฉ๋ฒ•์€ ๋‚˜์—๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ํ•œ ๋ธ”๋กœ๊ทธ์—์„œ ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. https://lemontia.tistory.com/997 [r.. 2023. 11. 6.
[Android] ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ์˜ Sha Key๋ฅผ ์•Œ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ• ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ํ”„๋กœ์ ํŠธ์—์„œ sha-1 ํ‚ค๋ฅผ ์•Œ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ๊นŒ ํ•œ๋‹ค. ์ด ๊ธ€์„ ๋ณด์‹œ๋Š” ๋ถ„๋“ค์€ sha-1 key๋ฅผ ๋ณด๋Š” ๊ฒŒ ๊ธ‰ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด ๋ฐ”๋กœ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค. 1. sha ํ‚ค ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์„ ๋ณด๋ฉด, gradle์„ ํฌํ•จํ•ด ๋‹ค์–‘ํ•œ ํƒญ์„ ์—ด ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ gradle์„ ํด๋ฆญํ•ด์„œ ๋“ค์–ด๊ฐ„๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™”๋ฉด์ด ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค. ์ด ํ™”๋ฉด์ด ์ •์ƒ์ ์œผ๋กœ ๋–ด์œผ๋ฉด, Execute Gradle Task๋ผ๋Š” ์•„๋ž˜์˜ icon๋“ค ์ค‘ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” icon์„ ํด๋ฆญํ•ด ์ค€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜จ๋‹ค. ์œ„์˜ ์ž…๋ ฅํ•˜๋Š” ๊ณณ์— signingReport๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด sha-1 key๋ž‘ sha-256 key๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์ด์ œ.. 2023. 10. 12.
[Android, Kotlin] Compose์—์„œ glance๋ฅผ ์ด์šฉํ•ด ์œ„์ ฏ ๋งŒ๋“ค๊ธฐ ์ด๋ฒˆ์— ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์€ compose๋กœ ์œ„์ ฏ์„ ๋งŒ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ glance์ด๋‹ค. glance์˜ ์กด์žฌ(?)๋Š” ์ด์ „์— ๋“ค์œผ๋Ÿฌ ๊ฐ”๋˜ ์ปจํผ๋Ÿฐ์Šค ๊ฐ•์—ฐ์—์„œ glance์— ๊ด€๋ จ๋œ ๊ฐ•์—ฐ์„ ๋“ค๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๊ทธ๋•Œ๋ถ€ํ„ฐ ๊ธฐํšŒ๊ฐ€ ๋˜๋ฉด ๊ณต๋ถ€ํ•ด ๋ณด์ž ๋ผ๋Š” ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๊ฒŒ ์ง€๊ธˆ์ด๋‹ค. glance๋Š” compose์—์„œ ์œ„์ ฏ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ณ  2023๋…„ 8~9์›”์— 1.0.0์„ ์ถœ์‹œํ•œ ๋”ฐ๋ˆ๋”ฐ๋ˆํ•œ ์‹ ์ƒ(?) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์•„๋ฌดํŠผ ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์— compose glance๋ฅผ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ๋ธ”๋กœ๊ทธ์— ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค. ๊ทธ๋Ÿผ ๋ฐ”๋กœ glance ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. 1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋จผ์ € glance ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค. // glance implementation("androidx.glance:gla.. 2023. 10. 6.
[Android, Kotlin] android์—์„œ Junit์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ ์ด๋ฒˆ์— ์ •๋ฆฌํ•  ๋‚ด์šฉ์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์ด๋‹ค. ๋‹ค๋“ค ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ผ๋Š” ๋ง์„ ๋“ค์–ด๋ณธ ์ ์€ ์žˆ์–ด๋„ ์‚ฌ์šฉ๋ฒ•์„ ๋ชฐ๋ผ์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ์„ ๊ฒƒ์ด๊ณ , ์žฅ์ ์— ๋Œ€ํ•ด์„œ๋Š” ๋“ค์—ˆ์ง€๋งŒ ํ™• ์™€๋‹ฟ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•„์ž์˜ ๊ฒฝ์šฐ์—๋Š” 2๊ฐ€์ง€ ๋ชจ๋‘ ํ•ด๋‹น์‚ฌํ•ญ์ด์—ˆ๋‹ค ใ…Žใ…Ž ํ•˜์ง€๋งŒ ์ด๋ฒˆ์— ์นœ๊ตฌ๋“ค์ด๋ž‘ ํ•˜๋Š” ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ ํŒŒํŠธ๋ณ„ ๊ฐœ๋ฐœ์„ ํ•˜๋˜ ์ค‘ ๋‚ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž˜ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š” ๊ฑธ๊นŒ?๋ผ๋Š” ์˜๋ฌธ์ด ๋“ค์–ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๊ณ  ์ด๋ฒˆ ๊ธฐํšŒ์— ํฌ์ŠคํŒ…์œผ๋กœ ๋‚จ๊ฒจ๋ณผ๊นŒ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฐ”๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด๊ณ  ์ฝ”๋“œ ์˜ˆ์ œ๋กœ ๊ฐ™์ด ํ™•์ธํ•ด ๋ณด๋„๋ก ํ•˜์ž. 1. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ด์œ ? ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ํŠน์ • ๋กœ์ง์„ ํ…Œ์ŠคํŠธํ•˜๋ฉด์„œ ๊ธฐ๋Šฅ์˜ ๋ฌธ์ œ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋‚ด ์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ๋œปํ•œ๋‹ค. ํ…Œ์Šค.. 2023. 9. 28.
[Android, Kotlin] ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ line chart ๋งŒ๋“ค๊ธฐ ์ด๋ฒˆ์— ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์€ android studio์—์„œ ์ฐจํŠธ(๊ทธ๋ž˜ํ”„)๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด ๋ณด์•˜๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์— ์ฐจํŠธ ๋งŒ๋“ค๊ธฐ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ–ˆ๋˜ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค. ์‚ฌ์‹ค ์ž‘๋…„์—๋„ ์ฐจํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒฝํ—˜์ด ์žˆ์—ˆ์ง€๋งŒ, ์ด๋ฒˆ์— ๋‹ค์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ฒผ๊ธฐ์— ์ด๋ฒˆ ๊ธฐํšŒ์— ์ •๋ฆฌํ•ด ๋ณด๋ ค ํ•œ๋‹ค.(์ž‘๋…„์— ๊ณต๋ถ€ํ–ˆ๋˜ ๋‚ด์šฉ์„ ๊ฑฐ์˜ ๋‹ค ๊นŒ๋จน์–ด์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ณต๋ถ€ํ–ˆ์—ˆ๋‹ค >:( ) ์ฐจํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋‹ค๋ฅธ ๋ถ„๋“ค์ด ๋งŒ๋“ค์–ด์ค€ ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํŽธํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ƒฅ android chart library๋ผ๊ณ  ๊ฒ€์ƒ‰ํ•ด๋„ ๋‹ค๋ฅธ ๋ถ„๋“ค์ด ์ด๋ฏธ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉ ์ค‘์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‹ค์ˆ˜ ์กด์žฌํ•œ๋‹ค. ์•„๋‹ˆ๋ฉด ์ž์‹ ์ด ์ง์ ‘ custom ํ•ด์„œ ๋งŒ๋“ค๊ณ  ์‹ถ์œผ๋ฉด android์—์„œ ์ œ๊ณตํ•˜๋Š” canvas๋ฅผ ์ด์šฉํ•ด .. 2023. 9. 28.
[Android, Kotlin] jetpack navigation์—์„œ safe args๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๊ธฐ ์ตœ๊ทผ ํฌ์ŠคํŒ…์—์„œ compose์—์„œ jetpack navigation์„ ์ด์šฉํ•  ๋•Œ, data class type์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ดค์—ˆ๋‹ค. ์ € ๊ธฐ์ˆ ์„ ์ตœ๊ทผ์— xml์—์„œ ํ•œ ๋ฒˆ ๋” ์‚ฌ์šฉํ•  ์ผ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋ฆ„์ด safe args๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์•„๋งˆ compose์—์„œ ์‚ฌ์šฉํ•œ ๊ธฐ์ˆ ๋„ safe args๋กœ ๋ถˆ๋ฆฌ๋Š” ๋“ฏํ•œ๋‹ค. https://rkdrkd-history.tistory.com/57 [Android, Kotlin] compose navigation์—์„œ data class tpye ๋„˜๊ธฐ๊ธฐ compose์—์„œ navigation์„ ์‚ฌ์šฉํ•  ๋•Œ, ํ™”๋ฉด ์ „ํ™˜ ์‹œ ๋ณ€ํ™˜๋  ํ™”๋ฉด์— ๊ธฐ์กด์˜ ํ™”๋ฉด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿด ๋•Œ์—๋Š” Navcontroller.navigate()์—๋‹ค๊ฐ€ ๋„˜๊ธธ.. 2023. 9. 26.
[Android, Kotlin] android์—์„œ in-app updates๋กœ ์•ฑ ์—…๋ฐ์ดํŠธ ๊ด€๋ฆฌํ•˜๊ธฐ ์ด๋ฒˆ์— ์ •๋ฆฌํ•  ์ฃผ์ œ๋Š” ๋ฐ”๋กœ ์•ฑ ์—…๋ฐ์ดํŠธ์— ๊ด€ํ•œ ์‚ฌํ•ญ์ด๋‹ค. ๋‚ด๊ฐ€ ์ด๋ฒˆ์— ์•ฑ ์—…๋ฐ์ดํŠธ์— ๊ด€ํ•ด ์ •๋ฆฌ๋ฅผ ํ•œ ์ด์œ ๋Š” ํ•„์ž๊ฐ€ ์•ฑ์„ ํ•˜๋‚˜ ์ถœ์‹œํ•˜์˜€๋Š”๋ฐ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์‚ฌ์šฉ์ž๋“ค์ด ์•ฑ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งŽ์ด ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 0. ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ? ์ด๋Ÿฐ ๊ฒฝ์šฐ ์•ฑ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ์ƒ๊ด€์—†๋‹ค๋Š” ์ด์•ผ๊ธฐ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ ๋ฒ„์ „์„ ์ถœ์‹œํ•˜๋ฉด์„œ ์ˆ˜์ •ํ–ˆ๋˜ ์˜ค๋ฅ˜๋ฅผ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š์€ ๊ธฐ์กด ์•ฑ์—์„œ๋Š” ๊ทธ๋Œ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋‚จ์•„์žˆ์„ ํ™•๋ฅ ์ด ๋†’๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ in-app updates๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒฝํ—˜์„ ๊ธฐ๋ก์œผ๋กœ ๋‚จ๊ฒจ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. 1. in-app updates๋Š” ๋ฌด์—‡์ผ๊นŒ? in-app updates๋Š” ๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ ๋‚ด.. 2023. 9. 9.
[Android, Kotlin] exoplayer์™€ media3๋ฅผ ์ด์šฉํ•ด ์˜์ƒ ์žฌ์ƒํ•˜๊ธฐ ์ด๋ฒˆ์—๋Š” ํ•„์ž๊ฐ€ ์ž์ฃผ ์‹œ์ฒญํ•˜๋Š” youtube๋ฅผ ๋ณด๊ณ  youtube๊ฐ€ exoplayer๋ฅผ ์ด์šฉํ•ด ์ œ์ž‘๋˜์—ˆ๋‹ค๋Š” ๋ง์„ ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ ๊ธฐํšŒ์— exoplayer๋ฅผ ๊ณต๋ถ€ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ด๋ฒˆ์˜ exoplayer ์˜ˆ์ œ๋Š” ํ”„๋กœ์ ํŠธ ์•ˆ์˜ mp4 ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ณผ์ •์„ ๋‹ด์•˜๋‹ค. ์ฐธ๊ณ ๋กœ ํ˜„์žฌ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” compose๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ๋‹ค. exoplayer๋ž€ ๋ฌด์—‡์ผ๊นŒ? exoplayer๋Š” android์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฏธ๋””์–ด ์žฌ์ƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. 1. dependency ์ถ”๊ฐ€ exoplayer์™€ media3์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด dependency๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. // exoplayer compose implementation("com.google.android.exoplayer:exoplayer:2.19.1") impl.. 2023. 8. 25.
[Android] MVI ํŒจํ„ด์€ ๋ฌด์—‡์ผ๊นŒ? ์š”์ฆ˜์€ compose๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ด๋‹ค. ํ•„์ž๋„ compose๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ํ•„์ž๊ฐ€ ์ง€์ธ๋“ค์—๊ฒŒ compose์™€ mvi๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค๋Š” ์†Œ์‹์„ ๋“ฃ๊ณ  ๋ฐ”๋กœ mvi ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ง€๊ธˆ ๋ฐ”๋กœ mvi์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. 1. mvi๋ž€? mvi ์•„ํ‚คํ…์ฒ˜๋Š” mvc, mvp, mvvm์™€ ๊ฐ™์€ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๊ฐœ๋ฐœ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์˜ ์ผ์ข…์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. mvi์˜ ๊ตฌ์กฐ๋Š” model - view - intent๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ๊ฐ layer๋Š” ์„œ๋กœ ์™„์ „ํžˆ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค. sideEffects๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…(api ํ†ต์‹ , ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•  ๋กœ์ง)๊ณผ ์ธ์Šคํ„ด์Šค ๋ทฐ(screen ๊ฐ„ ์ด๋™, toast์™€ dialog)๋“ฑ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. sideEffects.. 2023. 8. 21.
[Android, Kotlin] compose custom theme ๋งŒ๋“ค๊ธฐ ์ด๋ฒˆ ํฌ์ŠคํŒ…์€ ์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ ๋งํ–ˆ๋‹ค์‹œํ”ผ ์ปค์Šคํ…€ ํ…Œ๋งˆ์— ๋Œ€ํ•œ ๊ฐ„๋‹จ ์„ค๋ช…๊ณผ ์ฝ”๋“œ๋ฅผ ์•Œ๋ ค์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค. ์ปค์Šคํ…€ ํ…Œ๋งˆ๋ฅผ ์™œ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•œ ์‚ฌ๋žŒ๋“ค์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค ๋ณด๋ฉด color๊ฐ€ ๋‹ค์–‘ํ•ด์งˆ ์ˆ˜ ์žˆ๊ธฐ์— ๊ธฐ๋ณธ์ ์œผ๋กœ android studio์—์„œ ์ œ๊ณตํ•˜๋Š” color palette๊ฐ€ ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋””์ž์ด๋„ˆ๊ฐ€ ์ •ํ•œ color๋ช…์„ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•˜๊ธฐ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Ÿด ๋•Œ์—๋Š” custom theme๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•„์ž๋Š” ์ด๋ฒˆ ๋Œ€ํ˜• ํ”„๋กœ์ ํŠธ์— ๋Œ€๋น„ํ•ด ์ปค์Šคํ…€ ํ…Œ๋งˆ๋ฅผ ์ œ์ž‘ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ž ๊ทธ๋Ÿผ ์ด์ œ ์ฝ”๋“œ๋กœ ํ•„์ž๊ฐ€ custom theme๋ฅผ ๋งŒ๋“ค์—ˆ๋˜ ๊ณผ์ •์„ ํ™•์ธํ•ด ๋ณด์ž. ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—! ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” theme ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” en.. 2023. 8. 18.
[Android, Kotlin] compose๋กœ custom checkbox ๋งŒ๋“ค๊ธฐ ์ด๋ฒˆ์— design system์„ ๋งŒ๋“œ๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ checkbox๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•  ์ผ์ด ์žˆ์—ˆ๋‹ค. ์ด๋ฒˆ์— ํ•„์ž ๊ฐ™์€ ๊ฒฝ์šฐ ๋ง๊ณ ๋„ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ์—๋„ checkbox๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ผ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ checkbox์˜ ๋ชจ์–‘์œผ๋กœ๋Š” ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์— ํ•„์ž๋Š” custom checkbox๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค. ํ•„์ž๊ฐ€ checkbox๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด ๋ณด์ž. 1. custom checkbox๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ค€๋น„๋ฌผ(?) ์ผ๋‹จ ์ฒ˜์Œ ๋งŒ๋“ค ๋•Œ ํ•„์ž๋Š” custom dialog๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€ ์ƒ๊ฐํ•ด ๋ณด์•˜๋‹ค. ๊ทธ๋ž˜์„œ ํ•˜๋‚˜์˜ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ๋‹ค! check ๋˜์—ˆ์„ ๋•Œ์˜ checkbox layout, check ๋˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ chec.. 2023. 8. 18.
[Android, Kotlin] compose๋กœ tablayout ๊ตฌํ˜„ํ•˜๊ธฐ ์ด๋ฒˆ์— youtube open api๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ xml์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ tablayout์„ ์ ์šฉํ•˜๊ณ  ์‹ถ์–ด์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” compose tablayout ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. compose์—์„œ tablayout ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” composable function์€ tabRow์ด๋‹ค. tabrow๋Š” list๋ฅผ ์ด์šฉํ•ด ํ™”๋ฉด(tab) ๊ฐ„์˜ ์ด๋™์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์œผ๋กœ bottom navigation๊ณผ ๋น„์Šทํ•˜๋‹ค. ์ด๋ฒˆ์— tabrow๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜๋Š”๋ฐ ๊ธฐ์กด์— xml์—์„œ๋Š” screen๋งˆ๋‹ค fragment๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ์ƒ์„ฑํ•ด์„œ ์—ฐ๊ฒฐํ•ด์•ผ ํ–ˆ์—ˆ๋Š”๋ฐ, compose์—์„œ๋Š” ๋”ฐ๋กœ screen์„ ๋งŒ๋“ค์ง€ ๋ง์ง€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํŽธํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฒˆ ๊ธฐํšŒ์— ํ•„์ž๋Š” screen์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์€ ta.. 2023. 8. 15.
[Android, Kotlin] compose navigation์—์„œ data class tpye ๋„˜๊ธฐ๊ธฐ compose์—์„œ navigation์„ ์‚ฌ์šฉํ•  ๋•Œ, ํ™”๋ฉด ์ „ํ™˜ ์‹œ ๋ณ€ํ™˜๋  ํ™”๋ฉด์— ๊ธฐ์กด์˜ ํ™”๋ฉด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿด ๋•Œ์—๋Š” Navcontroller.navigate()์—๋‹ค๊ฐ€ ๋„˜๊ธธ ๋ฐ์ดํ„ฐ๋ฅผ param์œผ๋กœ ๋„ฃ์€ ๋‹ค์Œ์— NavHost์—์„œ composable()๋กœ navigate logic์„ ์ž‘์„ฑํ•˜๋ฉด ๋์—ˆ๋‹ค. navigation ์ค‘ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์— ๊ด€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๋“ฏํ•˜๋‹ค. https://rkdrkd-history.tistory.com/51 [Android, Kotlin] Compose UI ์ •๋ฆฌ(7) ์ด์ „ ํฌ์ŠคํŒ… https://rkdrkd-history.tistory.com/50 [Android, Kotlin] Compose UI ์ •๋ฆฌ(6) ์ด๋ฒˆ ํฌ์ŠคํŒ….. 2023. 8. 11.
[Android, Kotlin] compose์—์„œ api ํ†ต์‹ ํ•˜๊ธฐ ์ด์ „ ํฌ์ŠคํŒ…์˜ ์—ฐ์žฅ์„ ์ž…๋‹ˆ๋‹ค. https://rkdrkd-history.tistory.com/55 [Android, Kotlin] Android clean architecture ํ”„๋กœ์ ํŠธ์—์„œ api ์—๋Ÿฌ ํ•ธ๋“ค๋งํ•˜๊ธฐ clean architecture ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์ƒํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด api error ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? ์˜ˆ์ „์˜ ํ•„์ž๋Š” ๊ทธ๋ƒฅ ๋ฌด์ง€์„ฑ์œผ๋กœ(?) presentation layer์— try catch๋ฅผ ์ด์šฉํ•ด ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ์—ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋ฐฉ๋ฒ•์„ rkdrkd-history.tistory.com ์ด์ „ ํฌ์ŠคํŒ…์—์„œ clean architecture ๊ด€์ ์—์„œ api error handling ๋ฐฉ๋ฒ•์„ ๊ณต๋ถ€ํ•ด ๋ดค๋Š”๋ฐ, ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ง€๋‚œ ๊ธ€์˜ ์—ฐ์žฅ์„ ์ธ clean architecture ๊ด€์ ์—์„œ compo.. 2023. 8. 3.
728x90