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

๐Ÿ“ฑ| Android/๐Ÿ“˜ | ๊ธฐ๋ก20

[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, 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] 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] Android clean architecture ํ”„๋กœ์ ํŠธ์—์„œ api ์—๋Ÿฌ ํ•ธ๋“ค๋งํ•˜๊ธฐ clean architecture ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์ƒํ•˜๊ณ  ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด api error ์ฒ˜๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๊ณ  ์žˆ๋Š”๊ฐ€? ์˜ˆ์ „์˜ ํ•„์ž๋Š” ๊ทธ๋ƒฅ ๋ฌด์ง€์„ฑ์œผ๋กœ(?) presentation layer์— try catch๋ฅผ ์ด์šฉํ•ด ์ฒ˜๋ฆฌ๋ฅผ ํ–ˆ์—ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ, ์ผ์ผ์ด try catch๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ๊ณผ presentation layer์—์„œ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‚˜ ์ด๋Ÿฐ ์˜๋ฌธ๋“ค์ด ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ clean architecture project์—์„œ api error handling logic์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณต๋ถ€ํ•˜๊ณ  ์ ์–ด๋ณด์•˜๋‹ค. 1. error handling ๋กœ์ง์€ ์–ด๋–ค layer์— ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€?? ํ•„์ž๋Š” data layer์—์„œ http status code์— ๋”ฐ๋ฅธ ์˜ˆ.. 2023. 8. 1.
[Android, Kotlin] Android MVVM ๋‹ค๋ค„๋ณด๊ธฐ ์ด๋ฒˆ์— ํ•„์ž๊ฐ€ ๊ณต๋ถ€ํ•ด๋ณธ ๊ฒƒ์€ MVVM์ด๋‹ค. MVVM์€ View - Model - ViewModel์˜ ์•ฝ์ž์ธ๊ฑด ๋‹ค ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ์‹ค์ด๋‹ˆ ๊ทธ๋ƒฅ ๋„˜๊ธฐ๊ณ (?) ํ•„์ž๋Š” ์˜ค๋ž˜์ „๋ถ€ํ„ฐ ์‚ฌ์šฉํ•ด์™”๋˜ ์•ˆ๋“œ๋กœ์ด๋“œ ์•„ํ‚คํ…์ฒ˜์ด์ง€๋งŒ ์“ฐ๋Š” ์ด์œ ์™€ ๊ฐ ํŒŒ์ผ๋“ค์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์œ„ํ•œ ํŒŒ์ผ๋“ค์ธ์ง€ ์ž˜ ์•Œ์ง€ ๋ชปํ–ˆ๊ธฐ์— ์ด๋ฒˆ ๊ธฐํšŒ์— ์ œ๋ฐ๋กœ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. 1. MVVM์˜ ๊ตฌ์กฐ MVVM์€ ์ด๋ฆ„์—์„œ๋„ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด View, Model, ViewModel๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. View: ์ด๋ฒคํŠธ ๋ฐœ์ƒ, liveData ๊ฐ์ง€ํ•ด ๋ทฐ์— ์ถœ๋ ฅํ•œ๋‹ค(์ถœ๋ ฅ์‹ธ๊ฐœ). Model: ์‹ค์ง์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ณณ(DB, Api ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜(?)ํ•œ๋‹ค.) ViewModel: ํ”„๋กœ์ ํŠธ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ด€๋ฆฌํ•œ๋‹ค(Api ํ˜ธ์ถœ, DBํ˜ธ์ถœ ์ด๋Ÿฐ๊ฑฐ). ์ฃผ์˜ํ•  ์ ์€ View์™€ Mod.. 2023. 3. 18.
[Android, Kotlin] Zxing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ QR์ฝ”๋“œ ์Šค์บ”ํ•˜๊ธฐ ์˜ค๋žœ๋งŒ์— ํฌ์ŠคํŒ…์„ ํ•ด๋ณธ๋‹ค. ์š”์ฆ˜ ์ข€ ๋ฐ”๋น ์„œ ใ…Žใ…Ž(์‚ฌ์‹ค ๊ท€์ฐฎ๊ธฐ๋„ ํ–ˆ๊ณ  ๊นŒ๋จน์—ˆ์–ด์„œ ๋ชป ์˜ฌ๋ ธ๋‹ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.) ์•„๋ฌดํŠผ ์ด๋ฒˆ์— ์‚ฌ์šฉํ•ด ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” zxing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ๋ฐ, ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— QR์ฝ”๋“œ ์Šค์บ” ๊ธฐ๋Šฅ์ด ๋“ค์–ด๊ฐˆ ์˜ˆ์ •์ด๋ผ ๊ฒ€์ƒ‰์„ ํ•ด๋ดค๋”๋‹ˆ, Zxing ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๊ธธ๋ž˜ ๋ฐ”๋กœ ์‚ฌ์šฉํ•ด ๋ณด์•˜๋‹ค(ํ—คํ—ค) ๊ฐœ์†Œ๋ฆฌ๋Š” ์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๊ณ  ๋ฐ”๋กœ Zxing์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž 1. dependency ์ถ”๊ฐ€,์„ธํŒ… build.gradle(app)build.gradle(app) // zxing implementation 'com.journeyapps:zxing-android-embedded:4.2.0' // circle imageview(์˜ˆ์ œ์—์„œ ์‚ฌ์šฉ) implementation 'de.hdodenhof:circleimageview:3.. 2023. 3. 11.
[Android, Kotlin] android custom dialog ๋งŒ๋“ค๊ธฐ custom dialog๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์ž์ฃผ ์“ฐ์ด๋Š” ํŒ์—… ์ฐฝ์„ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ํ•„์ž๋„ ๋งŽ์ด ์ž์ฃผ ์“ฐ์ง€๋งŒ, ๋งŽ์ด ๊นŒ๋จน๊ธฐ(?) ๋•Œ๋ฌธ์— ์ด๋ฒˆ์— ๊ธฐ๋ก์„ ๋‚จ๊ฒจ๋ณด๋ ค ํ•œ๋‹ค. custom dialog ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 1. custom dialog๋กœ ์‚ฌ์šฉํ•  xml ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ ๋จผ์ € dialog์˜ xml๋กœ ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“ค์–ด ์ค€๋‹ค. 2. ๋‹ค์ด์–ผ๋กœ๊ทธ ์ƒ์„ฑํ•˜๊ธฐ ์ผ๋‹จ ํ•„์ž๋Š” ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๋ทฐ ๋ฐ”์ธ๋”ฉ์œผ๋กœ ๊ตฌํ˜„ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ž˜๋“ค์— ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค. viewBinding { enabled = true } ๊ทธ ๋‹ค์Œ์— ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.(ํ•„์ž๋Š” fragment์— ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.) activity?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) v.. 2022. 11. 20.
[Android, Kotlin] Android์—์„œ Apollo๋ฅผ ์ด์šฉํ•œ GraphQL์‚ฌ์šฉํ•˜๊ธฐ ํ˜„์žฌ ํ•„์ž๋Š” graphql๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ค€๋น„ ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— graphql์„ ์ด์šฉํ•œ apollo์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. Apollo๋Š” android์—์„œ graphql์„ ๋” ์‰ฝ๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. 1. Apollo ์„ค์น˜ํ•˜๊ธฐ apollo๋ฅผ android์—์„œ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” node.js๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค. https://javacpro.tistory.com/62 [Node.js] Node.js ์„ค์น˜ํ•˜๊ธฐ (Windows10) Node.js ์„ค์น˜ํ•˜๊ธฐ Node.js ์„ค์น˜๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค . ์šฐ์„  ์•„๋ž˜ URL ์„ ๋”ฐ๋ผ Node.js ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•œ๋‹ค. https://nodejs.org/en/ ๊ทธ๋Ÿผ ์œ„์™€ ๊ฐ™์ด ํ™”๋ฉด์ด ๋‚˜์˜ค๋Š”๋ฐ ๋จผ์ € ์ขŒ์ธก์œผ๋กœ๋Š” ์ตœ์‹ ๋ฒ„์ „ ์ธ๋ฐ ๊ฐœ๋ฐœ๊ณต๋ถ€๋ฅผ ๋ชฉ.. 2022. 10. 23.
[Android, Kotlin] editText์˜ toggle icon์ด ๋ฐ˜๋Œ€๋กœ ๋˜์—ˆ์„ ๋•Œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• TextInputEditText ๊ธฐ๋ณธ edittext์™€ ๋‹ค๋ฅด๊ฒŒ ๋” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” edit text์˜ ํ•œ ์ข…๋ฅ˜์ด๋‹ค. TextInputEditText์—๋Š” ๊ฐ€๋ ค์•ผ ํ•  ํ…์ŠคํŠธ(๋น„๋ฐ€๋ฒˆํ˜ธ)๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ passwordToggleEnabled๋ผ๋Š” ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ passwordToggleEnabled ์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์ด์ƒํ•œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ฐ”๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋ณด์ด์ง€๋งŒ ์•„์ด์ฝ˜์€ ๋ˆˆ์„ ๊ฐ€๋ฆฌ๊ณ (?) ์žˆ๊ฒŒ ๋œจ๋Š” ๋ฌธ์ œ! ์ด๋ฒˆ์—๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๋‚ด๊ฐ€ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํฌ์ŠคํŒ…์„ ํ•˜๊ฒ ๋‹ค. ๋จผ์ € toggle icon์ด ํด๋ฆญ๋˜์—ˆ์„ ๋•Œ ๋‚˜์˜ค๊ฒŒ ํ•˜๋Š” ์•„์ด์ฝ˜๋“ค์„ ์„ค์ •ํ•œ๋‹ค. toogle_icon_status.xml ํด๋ฆญ๋˜์—ˆ๊ฑฐ๋‚˜ ์•„๋‹ ๋•Œ์˜ ์•„์ด์ฝ˜์€ ์•„๋ฌด๊ฑฐ๋‚˜ ์ •ํ•ด๋„ ์ƒ๊ด€์—†๋‹ค. ํ˜„์žฌ edittext๊ฐ€ ์žˆ๋Š” xml ํŒŒ์ผ.. 2022. 8. 31.
728x90