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

๐Ÿ“ฑ| Android55

[Android] thread์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณด๋Š” coroutine, flow์— ๋Œ€ํ•œ ๊ณ ์ฐฐ ์ด๋ฒˆ ๊ณ ์ฐฐ์˜ ์ฃผ์ œ๋Š” coroutine์ด๋‹ค.kotlin์„ ์‚ฌ์šฉํ–ˆ๊ฑฐ๋‚˜, ์‚ฌ์šฉ ์ค‘์ธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ๋Š” ํ•ญ์ƒ ๋”ฐ๋ผ๋‹ค๋‹ˆ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฐœ๋…์ด๋‹ค.์ด๋ฒˆ ํฌ์ŠคํŒ…์œผ๋กœ ํ™•์‹คํ•˜๊ฒŒ ๊ถ๊ธˆํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์งš๊ณ  ๋„˜์–ด๊ฐˆ ์˜ˆ์ •์ด๋‹ค. coroutine์ด๋ž€?coroutine์€ thread ์•ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ์ผ์‹œ ์ค‘๋‹จ ๊ฐ€๋Šฅํ•œ ์ž‘์—… ๋‹จ์œ„์ด๋‹ค.ํ•˜๋‚˜์˜ thread์—์„œ ์—ฌ๋Ÿฌ coroutine์ด ์„œ๋กœ thread๋ฅผ ์–‘๋ณดํ•ด ๊ฐ€๋ฉฐ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ด์งธ์„œ coroutine์ด ์ƒ๊ฒจ๋‚˜๊ฒŒ ๋œ ๊ฑธ๊นŒ? coroutine์€ ์™œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์„๊นŒ?thread ๊ธฐ๋ฐ˜์˜ ๋‹ค์ค‘ thread ์ž‘์—…์˜ ํ•œ๊ณ„coroutine ์ด์ „์˜ ๋™์‹œ์„ฑ ์ž‘์—…์€ ๋ชจ๋“œ thread ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๋‹ค.thread ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด thread 1์˜ ์ž‘์—…์ด ์ง„ํ–‰๋˜๋Š” ์ค‘์— ๋‹ค๋ฅธ.. 2024. 11. 12.
[Android] liveData, stateFlow์™€ ํ•จ๊ป˜ ๋ณด๋Š” MVVM์— ๋Œ€ํ•œ ๊ณ ์ฐฐ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ์–ธ๊ธ‰ํ–ˆ๋‹ค์‹œํ”ผ, clean architecture์™€ ํ•จ๊ป˜ ์‹ค๋ฌด์—์„œ ๋ฐ˜ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ธ mvvm์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด์„œ ์ ์–ด๋ณด๊ณ ์ž ํ•œ๋‹ค.๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ฐธ๊ณ ํ•œ ํฌ์ŠคํŒ…๋„ ๊ฐ™์ด ๋งํฌ๋กœ ๋‚จ๊ฒจ ๋†“๊ฒ ๋‹ค. MVVM์€ ๋ฌด์—‡์ผ๊นŒ?MVVM์— ๊ด€ํ•ด์„œ๋Š” ์ฐพ์•„๋ณด๋ฉด ์ž๋ฃŒ๊ฐ€ ๋งŽ์ด ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •์˜ํ•ด ๋ณด๋ฉด,MVC์™€ MVP์—์„œ view์™€ ์—ฎ์ด๋Š” ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด view model์„ ๋„์ž…ํ•œ ๋””์ž์ธ ํŒจํ„ด.MVVM์€ model, view, view model์˜ ์•ฝ์ž๋‹ค. ์—ฌ๊ธฐ์„œ view model๊ณผ view๋Š” 1 : n์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์„ ์ง€๋‹Œ๋‹ค. MVVM์„ ์™œ ์“ฐ๋Š” ๊ฑธ๊นŒ?mvvm ๋””์ž์ธ ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ๊ฐ€์ง„๋‹ค.์˜์กด์„ฑ ์ตœ์†Œํ™”view๋Š” view model์„.. 2024. 11. 11.
[Android] hilt์™€ ํ•จ๊ป˜ ๋ณด๋Š” clean architecture์— ๋Œ€ํ•œ ๊ณ ์ฐฐ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Android ๊ฐœ๋ฐœ์—์„œ ์™œ clean architecture๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ clean architecture์— ๊ด€ํ•ด์„œ ๊ถ๊ธˆํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ๊ณต๋ถ€ํ•ด์„œ ์ ์–ด ๋ณด๊ณ ์ž ํ•œ๋‹ค. ๋‚ด๊ฐ€ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ฐธ๊ณ ํ•œ ํฌ์ŠคํŒ…๋„ ํ•จ๊ป˜ ๋‚จ๊ธธ ํ…Œ๋‹ˆ ๋”ํ•œ ๋‚ด์šฉ์ด ๊ถ๊ธˆํ•˜๋ฉด ํ™•์ธํ•ด ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹๊ฒ ๋‹ค. clean architecture์˜ ์ •์˜์ •์˜๋Š” ๋‹ค๋ฅธ ํฌ์ŠคํŒ…์—๋„ ์ž์ฃผ ์–ธ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.clean architecture๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์˜ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ง€์ผœ์•ผ ํ•  ์›์น™๊ณผ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ ๊ฐœ๋….๋ณต์žกํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์„ ๋ณด๋‹ค ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€ ๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์š”์•ฝํ•˜์ž๋ฉด, ๊ทœ๋ชจ๊ฐ€ ํฐ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์ง€์ผœ์•ผ ํ•˜๋Š” ๊ตฌ์กฐ ๊ฐ™์€ ๊ฑฐ๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™.. 2024. 11. 8.
[Android, Kotlin] RecyclerView๋ฅผ ListAdapter๋ฅผ ์ด์šฉํ•ด ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—๋Š” ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„์—์„œ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ListAdapter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์•Œ๊ฒŒ ๋œ ListAdapter๋ฅผ ์ด์šฉํ•ด RecyclerView๋ฅผ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉ๋ฒ•๊ณผ ํ•จ๊ป˜ ์ ์–ด๋ณด๊ฒ ๋‹ค.์‚ฌ์‹ค ๊ธˆ์š”์ผ ํŠน๊ฐ•์„ ์ „๋ถ€ ๋“ฃ์ง€ ๋ชปํ•ด์„œ ๊ฐœ์ธ์ ์œผ๋กœ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ๊ณผ ๋…ธ์…˜์— ์ ํžŒ ๊ธ€, ๋…นํ™” ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์ ์€ ํ˜ผํ•ฉ๋ฌผ(?)์ด๋‹ค. ListAdapter๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์ „์— ์™œ ListAdapter๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋˜์—ˆ๋Š”์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž. ์˜ˆ์ „์˜ RecyclerView ์ž‘๋™ ์ฒด์ œ๊ธฐ์กด์˜ RecyclerView์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ฆฌ์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œํ•˜๊ณ ์ž ํ•  ๋•Œ, adapter์— notifyDataSetChanged()๋ฅผ ์‚ฌ์šฉํ•ด adapter์— ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์•Œ๋ ค์•ผ ํ•œ๋‹ค.์•Œ๋ฆผ์„ ๋ฐ›์€ adpater์—์„œ๋Š” ์ถ”๊ฐ€, ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ.. 2024. 7. 15.
[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.
728x90