Skip to content

xeejin/KekKek

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

1,061 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

1  KekKek_์ธํŠธ๋กœ(์•„ํ‚คํ…์ฒ˜ ํฌํ•จ) 2  KekKek_ํ”„๋กœ์ ํŠธ ๊ธฐ์ˆ  ์Šคํƒ(3)



๐Ÿ™‚ STOPSMOKE TEAM์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค!





๊น€๋ฏผ์ค€


์ž„ํฌ์ง„


์–‘๋™์›


๋ฐ•์„ธ์˜

Leader
Core-Dev
Test(Unit)
๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ •

Sub-Leader
TF/์ผ์ •๊ด€๋ฆฌ
๊ฐœ๋ฐœ
UI/UX/Design

๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ •(์ค‘์žฌ)

member
Core-Dev
Test(Unit)
๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ •

member
QA
Test(Product)
๊ฐœ๋ฐœ
๋ฐฐํฌ






๐Ÿ› ๏ธ ๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ •


โ–ถ ํด๋ฆฐ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ ํƒํ•œ ์ด์œ 

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

๋„๋ฉ”์ธ ์ค‘์‹ฌ ์„ค๊ณ„ ์•„ํ‚คํ…์ฒ˜์—๋Š” ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜ , ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜, ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜ ๋“ฑ์ด ๋Œ€ํ‘œ์ ์œผ๋กœ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ค‘์—์„œ ์ €ํฌ๋Š” ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜๋Š” ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๋ฉด์„œ ์˜์—ญ ๊ฐ„์— ์˜ค์—ผ๋  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ ์ด ์žˆ์–ด ์ œ์™ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜๋Š” ํฌํŠธ์™€ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ •ํ™•ํ•œ ๊ตฌํ˜„ ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•˜์ง€๋งŒ, ์†Œ๊ทœ๋ชจ ๋„๋ฉ”์ธ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์‹œ๋‚˜ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ œ์™ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ ๋กœ์ง ๋ถ€๋ถ„์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ, ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋…๋ฆฝ์ ์ธ ์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง€๊ณ , ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•ด์ง€๋ฉฐ, ๋‹ค๋ฅธ ์‹œ์Šคํ…œ ์š”์†Œ๋“ค์˜ ๋ณ€๊ฒฝ์— ๋Œ€ํ•ด ๋” OCP ์›์น™(Open-Closed Principle) ์„ ์ค€์ˆ˜ํ•˜๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋” ์ด์ƒ ์ง€์›๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด ๋“ฑ์žฅํ–ˆ์„ ๋•Œ, ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋Š” ๊ธฐ์กด ์ฝ”๋“œ์˜ ์˜์กด์„ฑ ๋ฐฉํ–ฅ์„ฑ์ด ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด๋ฅผ ํ–ฅํ•˜๋ฏ€๋กœ, ๋Œ€๋Œ€์ ์ธ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ์—†์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋Š” ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ฆ‰์‹œ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ ๊ณผ ์ œํ•œ์ ์ธ ์‹œ๊ฐ„์—์„œ ๋ณ€๊ฒฝ์ด ์ตœ์†Œํ™”๋œ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ ๋•๋ถ„์— ํ˜„์žฌ ์ €ํฌ ํŒ€์—์„œ ์ ํ•ฉํ•œ ์•„ํ‚คํ…์ฒ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.


โ–ถ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— Algolia๋ฅผ ์„ ํƒํ•œ ์ด์œ 

์ €ํฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Firestore์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ƒ‰ ์ธ๋ฑ์‹ฑ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ Elasticsearch์™€ Algolia ๋‘ ๊ฐ€์ง€ ํ›„๋ณด๋ฅผ ๊ณ ๋ คํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ €ํฌ๊ฐ€ Algolia๋ฅผ ์„ ํƒํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. Firestore์™€์˜ ์‰ฌ์šด ํ†ตํ•ฉ: Algolia๋Š” Firestore์™€์˜ ์—ฐ๊ฒฐ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ„ํŽธํ•˜์—ฌ, ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค ๊ตฌ์ถ•๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋” ์ˆ˜์›”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, Elasticsearch๋Š” Firestore์™€์˜ ํ†ตํ•ฉ์ด ๋ณต์žกํ•  ์ˆ˜ ์žˆ์–ด ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  2. Pagination ์ง€์›: Algolia๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Pagination์„ ์ง€์›ํ•˜๋ฉฐ, ์ด๋Š” Paging3.0 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ž˜ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด UI ๊ตฌํ˜„์ด ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ์‰ฌ์›Œ์ง€๋ฉฐ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ–ฅ์ƒ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  3. ๋น ๋ฅธ ๊ฒ€์ƒ‰ ์†๋„: Algolia๋Š” ๋†’์€ ๊ฒ€์ƒ‰ ์†๋„์™€ ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ค‘์š”ํ•œ ์š”์†Œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  4. ๊ด€๋ฆฌ์™€ ์šด์˜์˜ ์šฉ์ด์„ฑ: Algolia๋Š” ๊ด€๋ฆฌ ๋Œ€์‹œ๋ณด๋“œ์™€ API๊ฐ€ ์ž˜ ์„ค๊ณ„๋˜์–ด ์žˆ์–ด, ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค์˜ ๊ด€๋ฆฌ์™€ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค. Elasticsearch์— ๋น„ํ•ด ์„ค์ •๊ณผ ์šด์˜์ด ๋น„๊ต์  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ €ํฌ๋Š” Algolia๋ฅผ ์„ ํƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. Algolia์˜ ๊ฐ•๋ ฅํ•œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ๊ณผ ์‚ฌ์šฉ์˜ ์šฉ์ด์„ฑ ๋•๋ถ„์— ํ”„๋กœ์ ํŠธ์˜ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


โ–ถ SharedViewModel์„ ์‚ฌ์šฉํ•œ ์ด์œ 

์•ˆ๋“œ๋กœ์ด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•˜๋‚˜์˜ Activity์™€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Fragment๊ฐ€ ์žˆ์„ ๋•Œ, ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ Activity๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ViewModel์„ ๊ณต์œ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹

  1. Bundle๊ณผ FragmentManager๋ฅผ ์‚ฌ์šฉํ•œ ์ „๋‹ฌ
  2. Fragment Result API๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
  3. ๊ณตํ†ต์˜ ViewModel (์˜ˆ: HostActivity์˜ ViewModel)์„ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
  4. Jetpack Navigation์˜ Safe-Args๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

๋ฐฉ์‹๋ณ„ ์žฅ๋‹จ์ 

  1. Bundle๊ณผ FragmentManager:
    • ์žฅ์ : ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹จ์ : ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›์€ Fragment์—์„œ ViewModel์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ViewModel์—์„œ UI ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Fragment Result API:
    • ์žฅ์ : ๋ช…ํ™•ํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹์œผ๋กœ, ์ „๋‹ฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋‹จ์ : Fragment๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ณผ์ •์ด ๋‹ค์†Œ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๊ณตํ†ต์˜ ViewModel (SharedViewModel):
    • ์žฅ์ : ์—ฌ๋Ÿฌ Fragment๊ฐ€ ๋™์ผํ•œ ViewModel ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•จ์œผ๋กœ์จ, ํ•˜๋‚˜์˜ Fragment์—์„œ ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋‚˜ ์ƒํƒœ๊ฐ€ ๋‹ค๋ฅธ Fragment์—์„œ๋„ ์ฆ‰์‹œ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ์™€ ์ƒํƒœ ๊ด€๋ฆฌ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹จ์ : ViewModel์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ์ผ๋ถ€ ๊ฒฝ์šฐ์—๋Š” Activity๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ViewModel์ด ์‚ฌ๋ผ์ง€๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  4. Safe-Args (Jetpack Navigation):
    • ์žฅ์ : ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ์‹œ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ์˜๋„ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹จ์ : ์„ค์ •๊ณผ ์ดํ•ดํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ์ด ๋งŽ์•„ ํ™˜๊ฒฝ ์„ธํŒ…์ด ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SharedViewModel์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ Activity์—์„œ ์—ฌ๋Ÿฌ Fragment ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ViewModel์€ Activity์˜ ๋ผ์ดํ”„์‚ฌ์ดํด๋ณด๋‹ค ๋” ์˜ค๋ž˜ ์‚ด์•„๋‚จ๊ธฐ ๋•Œ๋ฌธ์—, ๊ณตํ†ต์˜ Activity ViewModel์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โ–ถ CloudFunction์„ ์‚ฌ์šฉํ•œ ์ด์œ 

Cloud Functions๋Š” ์„œ๋ฒ„ ๊ด€๋ฆฌ์™€ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ์ œ๊ณต์—…์ฒด์— ๋งก๊ธฐ๊ณ , ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ ์ž‘์„ฑ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค๋Š” ์ด๋ฒคํŠธ ํŠธ๋ฆฌ๊ฑฐ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด Firebase์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค์˜ ๋ฐ์ดํ„ฐ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๋ฐ˜์‘ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋‘” ํ•จ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋งž์ถฐ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

FireBase Cloud Function์„ ์‚ฌ์šฉํ•œ ๊ธฐ๋Šฅ

์•Œ๋ฆผ ์ œ๊ณต: ์ƒˆ๋กœ์šด ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฒŒ์‹œ๊ธ€์— ๋Œ“๊ธ€์ด ๋‹ฌ๋ฆด ๊ฒฝ์šฐ ์•Œ๋ฆผ ์ œ๊ณต ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ฆฌ ๋ฐ ์œ ์ง€๋ณด์ˆ˜: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ํ•„์š” ์—†๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ ์‹œ ๋Œ“๊ธ€, ๊ฒŒ์‹œ๊ธ€ ๋“ฑ์— ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํƒˆํ‡ดํ•œ ์‚ฌ์šฉ์ž ๋Œ€์‘: ์‚ฌ์šฉ์ž๊ฐ€ ํƒˆํ‡ดํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ •๋ณด, ํ† ํฐ, uid ๊ฐ’ ๋“ฑ์„ ์ •๋ฆฌ ํ•ด์•ผ ํ•˜๋Š” ๊ณผ์ •์„ ๋‹จ์ˆœํžˆ ์•ฑ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ธฐ์—๋Š” firebase ์ •์ฑ… ์ƒ 10๋ถ„ ์ด๋‚ด์˜ ์žฌ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งŒ ํ—ˆ์šฉ์ด ๋˜์—ˆ๊ณ , ํƒˆํ‡ด๋ฅผ ํ•˜๋Š” ๊ณผ์ •์—์„œ ์žฌ ์ธ์ฆ์„ ์š”์ฒญํ•˜๋Š” UI/UX๋Š” ์ข‹์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์ด๋Ÿฌํ•œ ๋ฐฉํ–ฅ์„ฑ์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.







๐Ÿ’ฅ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…


โ–ถ Result์— ๋”ฐ๋ผ ํ•ธ๋“ค๋ง ์ฒ˜๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง„ ๋ฌธ์ œ


override suspend fun editPost(postEntity: PostEntity): Result<Unit> {
        return try {
            val updateMap = mapOf(
                "category" to postEntity.category,
                "title" to postEntity.title,
                "text" to postEntity.text,
                "date_time" to postEntity.dateTime
            )
            firestore.collection(COLLECTION)
                .document(postEntity.id ?: return Result.Error(NullPointerException()))
                .update(updateMap)
                .await()
            Result.Success(Unit)
        } catch (e: Exception) {
            Result.Error(e)
        }
    }

  • ๋ฌธ์ œ ์ƒํ™ฉ

    • ๊ธฐ์กด์—๋Š” ๋ชจ๋“  ์˜์—ญ์—์„œย Result๋ฅผ ๊ฐ์‹ผ ํ˜•ํƒœ๋กœ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ์„ค๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ ๊ฒฐ๊ณผ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋ฐ๋Š” ํŽธ๋ฆฌํ–ˆ์ง€๋งŒ, ๋‹ค๋ฅธ ์˜์—ญ์—์„œย Result์— ๋”ฐ๋ผ ํ•ธ๋“ค๋ง ์ฒ˜๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    • ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ํ”„๋ ˆ์  ํ…Œ์ด์…˜์—์„œ ํ•„์š”ํ•œ ์—๋Ÿฌ๋ฅผ throw ์ฒ˜๋ฆฌํ•˜์—ฌ ViewModel์—์„œ catch ํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ catchํ•œ ์—๋Ÿฌ๋ฅผ UiState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ ์œ ์ง€ ๋ณด์ˆ˜์™€ ๋ณต์žก๋„๊ฐ€ ์ค„์–ด๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

โ–ถ Firebase ํšŒ์› ํƒˆํ‡ด ์ •์ฑ… ๋ฌธ์ œ

  • ๋ฌธ์ œ์ƒํ™ฉ (FirebaseAuth Recent Login Required Exception)

    • firebase๋Š” ๊ณ„์ • ์‚ญ์ œ, ๊ธฐ๋ณธ ์ด๋ฉ”์ผ ์ฃผ์†Œ ์„ค์ •, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ๊ณผ ๊ฐ™์ด ๋ณด์•ˆ์— ๋ฏผ๊ฐํ•œ ์ž‘์—…์„ ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ตœ๊ทผ์— ๋กœ๊ทธ์ธํ•œ ์ ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋กœ์ธํ•ด ๊ฐ€์ž…๋œ ์œ ์ €๊ฐ€ ํšŒ์› ํƒˆํ‡ด๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ ์žฌ์ธ์ฆํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ์ค‘์— ์žˆ๋Š” ์•ฑ ์ค‘์—์„œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ, ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ํ›„์— ํšŒ์› ํƒˆํ‡ด ํ–ˆ์„ ๊ฒฝ์šฐ์— ์žฌ์ธ์ฆ์„ ์š”์ฒญํ•˜๋Š” ์•ฑ์„ ๋ณด์ง€ ๋ชปํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, ์ด ๋ฌธ์ œ๊ฐ€ ์œ ์ € ๊ฒฝํ—˜์„ ๋–จ์–ด๋œจ๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    • ํ”„๋ก ํŠธ์—์„œ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌ ํ•  ๊ฒฝ์šฐ์— ์ด๋Ÿฌํ•œ ์ •์ฑ…์„ ๋‚ด๋†“์€ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, Cloud Function์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์— ์‚ญ์ œ ์š”์ฒญ์„ ํ•˜๋Š” ๋ฐฉํ–ฅ์„ฑ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โ–ถ PagingData ์•„์ดํ…œ ์ถ”๊ฐ€ ๋ฌธ์ œ

  • ๋ฌธ์ œ์ƒํ™ฉ

    • PagingData๋Š” ์•„์ดํ…œ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ๋Š” PagingAdapter ๋ฅผ Refresh ํ•˜๋Š” ๋ฐฉ์‹, ๋‘๋ฒˆ์งธ๋Š” RemoteMediator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ „์ž๋Š” API ์š”์ฒญ์ด ๋น„์šฉ์ด ๋„ˆ๋ฌด ํฌ๋‹ค๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ฌธ์ œ์ ์ด ์กด์žฌํ•˜์˜€๊ณ , ํ›„์ž๋Š” ์˜คํ”„๋ผ์ธ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•  ์ƒ๊ฐ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ ๋˜ํ•œ ๋น„์šฉ์ด ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    • ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ConcatAdapter๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ธฐ์กด ์•„์ดํ…œ๊ณผ ์ƒˆ๋กœ์šด ์•„์ดํ…œ์˜ RecyclerView Adapter๋ฅผ ๋‚˜๋ˆ„์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์•„์ดํ…œ์„ ์—…๋ฐ์ดํŠธ ํ•  ๊ฒฝ์šฐ์—, ์ „์ฒด ์•„์ดํ…œ์„ Refresh ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์•„์ดํ…œ ๋ถ€๋ถ„๋งŒ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โ–ถ EXIF ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฌธ์ œ

Untitled

  • ๋ฌธ์ œ ์ƒํ™ฉ

    • ๋งˆ์ด ํŽ˜์ด์ง€์˜ ๊ณ„์ •์ด๋‚˜, ๊ธ€์“ฐ๊ธฐ์˜ ์—๋””ํ„ฐ ๊ธฐ๋Šฅ์—์„œ ์‚ฌ์ง„์„ ์ฒจ๋ถ€ํ•˜๋Š” ๊ณผ์ •์—์„œ ์–ด๋–ค ์ด๋ฏธ์ง€๋Š” 90๋„๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ผ์— ๋‚ด์žฅ๋œ EXIF ๋ฐฉํ–ฅ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์›์ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ActivityResultContracts.PickVisualMedia๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ EXIF ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋ฏธ์ง€ ํŒŒ์ผ์— ํฌํ•จ๋˜๋Š”๋ฐ ์ด๋ฅผ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ฏธ์ง€๊ฐ€ ํšŒ์ „๋˜์–ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    • ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, uri๋กœ๋ถ€ํ„ฐ inputstream์„ ๊ตฌํ•˜๊ณ , inputstream์œผ๋กœ๋ถ€ํ„ฐ ExifInterface ๋ฅผ ๊ตฌํ•˜๊ณ , getAttributeInt ๋ฅผ ์ด์šฉํ•ด ์ด๋ฏธ์ง€์˜ ๋ฐฉํ–ฅ ๊ฐ’์„ ๊ตฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฐฉํ–ฅ๊ฐ’์„ matrix ์˜ ์†์„ฑ์œผ๋กœ ๋„ฃ๊ณ  ํ•ด๋‹น matrix ๋กœ ๋ฐฉํ–ฅ์ด ์ˆ˜์ •๋œ ๋น„ํŠธ๋งต ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

โ–ถ ๊ธˆ์—ฐ ํ…Œ์ŠคํŠธ ํ™”๋ฉด ๊ตฌํ˜„ ์ค‘ ๋ทฐํŽ˜์ด์ € ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ

  • ๋ฌธ์ œ์ƒํ™ฉ

    • Question Fragment์—์„œ ViewPagerFragment์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ binding ์ด null ์ด์–ด์„œ NullPointerException์ด ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. (parentFragment as? ViewPagerFragment)?.moveToNextQuestionPage() ๋ฅผ ์‚ฌ์šฉํ•ด ์ ‘๊ทผํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์ง€๋งŒ, ๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ณธ ๊ฒฐ๊ณผ ViewPagerFragment๋Š” ๋ถ€๋ชจ ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ ์•„๋‹ˆ์˜€์Šต๋‹ˆ๋‹ค.

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    • ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ„ ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด shared view model ์„ ์‚ฌ์šฉํ•ด์„œ Question Fragment์—์„œ live data๋ฅผ ์„ธํŒ…ํ•˜๊ณ , ViewPagerFragment์—์„œ ์˜ต์ €๋น™ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ„ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋• Shared view model ์„ ๊ณ ๋ คํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.

โ–ถ ViewModel ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ค‘ Fragment ์ข…๋ฃŒ

  • ๋ฌธ์ œ ์ƒํ™ฉ

    • DialogFragment์—์„œ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ dismiss()๊ฐ€ ํ˜ธ์ถœ๋˜์–ด viewModel์ด ์ฃฝ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    • ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, parameter๋กœ ์ „๋‹ฌํ•ด์ค˜์„œ viewModel ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์™„๋ฃŒ ํ›„ dismiss()๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โ–ถ Firestore ์กฐํšŒ์ˆ˜ ์นด์šดํŠธ ํ•˜๋Š” ๋ฌธ์ œ

๊ทธ๋ฆผ02

  • ๋ฌธ์ œ ์ƒํ™ฉ

    • Cloud Firestore๋Š” ์ดˆ๋‹น ์ตœ๋Œ€ 1ํšŒ ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ณด์ฆํ•˜๋ฏ€๋กœ, ์กฐํšŒ์ˆ˜๋ฅผ ์นด์šดํŠธํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” Firestore์˜ ํ•œ๊ณ„๋กœ ์ธํ•œ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    • ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ๋ถ„์‚ฐ ์นด์šดํ„ฐ ์†”๋ฃจ์…˜์„ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ์ƒค๋“œ๋กœ ๊ตฌ์„ฑ๋œ ํ•˜์œ„ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ƒค๋“œ์˜ ๊ฐ’์„ ํ•ฉ์‚ฐํ•˜๋Š” ๋ฐฉ์‹์„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹จ์ผ ์นด์šดํ„ฐ๋ณด๋‹ค 10๋ฐฐ ๋งŽ์€ ์“ฐ๊ธฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ Firestore์—์„œ ์กฐํšŒ์ˆ˜๋ฅผ ์นด์šดํŠธํ•  ๋•Œ๋Š” ์ด ๋ถ„์‚ฐ ์นด์šดํ„ฐ ์†”๋ฃจ์…˜์„ ๋„์ž…ํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

โ–ถ Hilt Single Instance ์ฃผ์ž… ๋ฌธ์ œ

  • ๋ฌธ์ œ ์ƒํ™ฉ

    • Hilt ์˜์กด์„ฑ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, SingletonComponent::class๋ฅผ ์„ ์–ธํ•˜์—ฌ DataStore๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…ํ–ˆ์„ ๋•Œ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    • Hilt()์˜ SingletonComponent::class๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ ์ƒ๋ช…์ฃผ๊ธฐ์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ, ํ•ญ์ƒ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด @Singleton ์• ๋„ˆํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑ๋˜๋„๋ก ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ Hilt๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ @Singleton ์• ๋„ˆํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.







๐ŸŒ ํ”„๋กœ์ ํŠธ MVP ๊ธฐ๋Šฅ๋ณ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ


ํ”„๋กœ์ ํŠธ ๊ธฐ๋Šฅ๋ณ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ (์ฃผ์˜ : ์ด๋ฏธ์ง€ ๊ธธ์ด๊ฐ€ ๋งค์šฐ ๊น๋‹ˆ๋‹ค.)

KekKek_ํ™”๋ฉด์„ค๋ช…_๋กœ๊ทธ์ธ KekKek_ํ™”๋ฉด์„ค๋ช…_ํ™ˆ KekKek_ํ™”๋ฉด์„ค๋ช…_์ปค๋ฎค๋‹ˆํ‹ฐ KekKek_ํ™”๋ฉด์„ค๋ช…_๋งˆ์ดํŽ˜์ด์ง€ KekKek_ํ™”๋ฉด์„ค๋ช…_์„ค์ •








โ˜ ์•ž์œผ๋กœ์˜ ๊ณ„ํš

์•ž์œผ๋กœ์˜ ๊ณ„ํš

  • ์ปค๋ฎค๋‹ˆํ‹ฐ ์œ ์ €๋ผ๋ฆฌ์˜ ํŒ”๋กœ์šฐ/ํŒ”๋กœ์›Œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ , ์„œ๋กœ์˜ ํ”„๋กœํ•„์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์–ธ์–ด(์˜์–ด ๋“ฑ)์— ๋Œ€์‘ํ•˜๋Š” ์–ธ์–ด ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.
  • ๋‹คํฌ๋ชจ๋“œ์— ๋Œ€์‘ํ•˜์—ฌ, ํ…Œ๋งˆ ์„ค์ •์„ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ์„ ํ•˜์ง€ ์•Š์•„๋„ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์–ดํ”Œ์„ ์ „์ฒด์ ์œผ๋กœ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๊ฒŒ์ŠคํŠธ๋ชจ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.
  • ์•ฑ ๋‚ด ๊ด‘๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.
  • UI/UX๋ฅผ ๋ณด๋‹ค ๊ฐœ์„ ํ•˜๊ณ , ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ”๊พธ์–ด๋‚˜๊ฐˆ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.







์ผ์ผ์ด๋Š” ๊ณ„์† ๋ฉ๋‹ˆ๋‹ค ... โ˜

About

A community Android app for sharing motivation among people quitting smoking.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Kotlin 100.0%