DEU-Smiley / Smiley-Android-App

์Šค๋งˆํŠธ ๊ต์ •๊ธฐ & ๊ต์ • ๊ด€๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
1 stars 2 forks source link
clean-architecture-android coroutines-flow kotlin-android mlkit-face-detection mvvm-android

Smiley-Android-App


  

๐Ÿ† ์ˆ˜์ƒ ๋‚ด์—ญ


๐Ÿ’กย ์ฃผ์ œ


๐Ÿ“ย ์„ค๋ช…


๐Ÿ–ฅ๏ธ ์‹œ์—ฐ ์˜์ƒ

Video Label

โœจย ์ฃผ์š” ๊ธฐ๋Šฅ


๐Ÿ’ซ ํŒ€ ํ˜‘์—… ๋ฐฉ์‹



๐Ÿ˜€ ์ƒˆ๋กœ ์ ์šฉ๋œ ๊ธฐ์ˆ 

1. Clean Architecture, Multi-Module


[ ๋ฌธ์ œ ]

MVVM ํŒจํ„ด๋งŒ ์ ์šฉํ–ˆ์„ ๋•Œ, ์•ฑ์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜๋ก ์ฝ”๋“œ์˜ ์ข…์†์„ฑ์ด ๋†’์•„์ง€๊ณ , ์ฝ”๋“œ์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ ์  ๋” ์–ด๋ ค์›Œ์ง€๋Š” ๊ฒƒ์„ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

[ ์ ์šฉ ]

[ ๊ฒฐ๊ณผ ]

๊ณ„์ธต ๋ถ„๋ฆฌ๋กœ ์ฝ”๋“œ์˜ ๋ถ„๋ฆฌ๊ฐ€ ํ™•์‹คํžˆ ์ด๋ฃจ์–ด์ ธ, ๊ธฐ๋Šฅ ์ถ”๊ฐ€์—๋„ ๋ถ€๋‹ด์ด ์—†๋Š” ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜๋„ ์šฉ์ดํ•ด์กŒ์Šต๋‹ˆ๋‹ค.



2. Github Actions๋ฅผ ํ†ตํ•œ CI/CD


[ ๋ฌธ์ œ ]

๋””์ž์ด๋„ˆ ๋ฐ ๋ฉ˜ํ† ๋ถ„๊ณผ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ…Œ์ŠคํŠธ ๋ฐ ํ”ผ๋“œ๋ฐฑ ์šฉ๋„๋กœ Apk ํŒŒ์ผ์„ ์ „์†กํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ง์ ‘ Apk ํŒŒ์ผ์„ ์ถ”์ถœํ•ด์„œ ์ „์†กํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ๋ฒˆ๊ฑฐ๋Ÿฝ๊ณ  ๋น„ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— Github Actions๋กœ ์ด๋ฅผ ์ž๋™ํ™”ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

[ ์ ์šฉ ]

Github Actions์„ ํ†ตํ•ด CI/CD๋ฅผ ์ ์šฉํ•˜๊ณ , Github์— Release๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด ๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์นด์นด์˜คํ†ก ๋ฉ”์„ธ์ง€๊ฐ€ ์ „์†ก๋˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

[ ๊ฒฐ๊ณผ ]

์ž๋™ํ™” ๋œ ์ž‘์—…์œผ๋กœ ์ธํ•ด์„œ ์—…๋ฌด์˜ ํšจ์œจ์„ฑ์ด ๋†’์•„์กŒ์œผ๋ฉฐ, ์ด์— ๋”ฐ๋ผ ์—…๋ฌด์˜ ๋ณต์žก๋„๋„ ๊ฐ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

3. Coroutine-Flow


[ ๋ฌธ์ œ ]

Coroutine-Flow๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š๊ณ , ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ํ•˜๋Š” ๊ฒฝ์šฐ Callback์ด ์ค‘์ฒฉ ๋˜์–ด Callback Hell์— ๋น ์ง€๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ฝ”๋“œ๊ฐ€ ๋‹ค์ˆ˜์˜ Callback๊ณผ Thread๋กœ ์ด๋ฃจ์–ด์ ธ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ๋„ ๋‚ฎ์•„์ง€๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

[ ์ ์šฉ ]

Coroutine-Flow๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํŠน์ •ํ•œ ์กฐ๊ฑด์— ๋งž๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

[ ๊ฒฐ๊ณผ ]

  1. ๊ฐ€๋…์„ฑ ์ฆ๊ฐ€ : Callback Hell์„ ๋ฒ—์–ด๋‚˜ Coroutine-Flow๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  2. ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ ์ฆ๊ฐ€ : Coroutine-Flow๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ๋น„๋™๊ธฐํ™”ํ•˜๋ฉด์„œ, ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ๋„ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

4. Hilt


[ ๋ฌธ์ œ ]

Hilt๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ, ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฉฐ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๋Š” ๊ฒฝํ—˜์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Hilt๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด, ์ดˆ๊ธฐํ™”์˜ ์ˆœ์„œ, ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ ๋“ฑ์ด ๋ชจ๋‘ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋ฏ€๋กœ Hilt๋ฅผ ์ ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

[ ์ ์šฉ ]

Hilt๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ์„ ์ตœ์†Œํ™”ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

[ ๊ฒฐ๊ณผ ]

  1. ์œ ์ง€ ๋ณด์ˆ˜์„ฑ ์ฆ๊ฐ€ : Hilt๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๊ฐ„ํŽธํ•ด์กŒ์Šต๋‹ˆ๋‹ค.
  2. ๊ฐ€๋…์„ฑ ์ฆ๊ฐ€ : Hilt๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ฒด ์ƒ์„ฑ ๊ณผ์ •์„ ์ตœ์ ํ™”ํ•˜์—ฌ, ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.



5. StateFlow๋ฅผ ํ†ตํ•œ UI ์ƒํƒœ ๊ด€๋ฆฌ


[ ๋ฌธ์ œ ]

StateFlow์™€ State ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ, UI ์ƒํƒœ ์ฒ˜๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ์ƒํ™ฉ์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค.

ํ†ต์‹  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด ๋‹ค์ˆ˜์˜ LiveData ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์˜€๊ณ , ์ด๋Š” ๊ณง ๊ฐ€๋…์„ฑ ๋ฐ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ํฐ ์›์ธ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ํด๋ฆฐ ์•„ํ‚คํ…์ณ๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ ์•ˆ๋“œ๋กœ์ด๋“œ ํ”Œ๋žซํผ์— ์ข…์†์ ์ธ LiveData ๋Œ€์‹  StateFlow๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

[ ์ ์šฉ ]

  1. StateFlow๋กœ UI ์ƒํƒœ ์ „๋‹ฌ : UI์˜ ์ƒํƒœ๋ฅผ StateFlow๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด UI ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ์–ดํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  2. State ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ UI ์ƒํƒœ ๊ด€๋ฆฌ : ์ƒํƒœ ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์ƒํƒœ๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋กœ์ง์„ ์บก์Šํ™”ํ•˜์—ฌ UI ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

[ ๊ฒฐ๊ณผ ]

  1. ์ƒํƒœ ๊ด€๋ฆฌ ํšจ์œจ์„ฑ ์ฆ๊ฐ€ : ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋„ ์‰ฌ์›Œ์กŒ์œผ๋ฉฐ, ์ƒํƒœ๊ฐ€ ์ถ”๊ฐ€ ๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ ๋˜๋Š” ๊ฒฝ์šฐ์— ๋ฐ›๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.



๐Ÿค—ย ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

๐Ÿ’ก ๋‚ด๋ถ€ DB๋ฅผ ํ™œ์šฉํ•œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ตœ์ ํ™”

๐Ÿ’ก ๊ฒ€์ƒ‰ ์‹œ ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ๊ณ ๋ คํ•œ ์บ์‹œ ์ „๋žต (ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„ 2,000ms โ†’ 200ms)

๐Ÿ’ก ์ฃผ๋ณ€ ๋ณ‘์› ๋ฐ์ดํ„ฐ ์š”์ฒญ ์ตœ์ ํ™”

๐Ÿ’ก StateFlow ์ค‘๊ฐ„๊ฐ’ ์ด์Šˆ

๐Ÿ“˜ย ERD

ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋„

Smiley Erd - Night

๐Ÿ‘จโ€๐Ÿ‘ฆํŒ€ ๊ตฌ์„ฑ

|๊น€๋™ํ˜„ ``` Android Dev ```| ๊น€์ค€ ```Backend Dev``` | ๊น€์„ฑ์ฐฌ ```Backend Dev``` | |:-:|:-:|:-:| || | | |[@donghyeon0915](https://github.com/Donghyeon0915)| [@rlawns0327](https://github.com/rlawns0327)| [@tjdckscert](https://github.com/tjdckscert)|