![]() ๊น๋ฏผ์ค |
![]() ์ํฌ์ง |
![]() ์๋์ |
![]() ๋ฐ์ธ์ |
Leader |
Sub-Leader |
member |
member |
์ ํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๊ธฐ ๊ฐ๋ฐ ๋จ๊ณ์์ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํ๊ณผ ์ง์์ ์ผ๋ก ๋ณํํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์๋ฒ, UI๋ฅผ ๋์ํด์ผ ํ๋ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์ ํฌ๋ ๋๋ฉ์ธ ์ค์ฌ ์ค๊ณ ์ํคํ ์ฒ๋ฅผ ์ฐพ๊ฒ ๋์์ต๋๋ค.
๋๋ฉ์ธ ์ค์ฌ ์ค๊ณ ์ํคํ
์ฒ์๋ ๋ ์ด์ด๋ ์ํคํ
์ฒ , ํด๋ฆฐ ์ํคํ
์ฒ, ํฅ์ฌ๊ณ ๋ ์ํคํ
์ฒ ๋ฑ์ด ๋ํ์ ์ผ๋ก ์์ต๋๋ค. ์ด ์ค์์ ์ ํฌ๋ ํด๋ฆฐ ์ํคํ
์ฒ๋ฅผ ์ ํํ๊ฒ ๋์์ต๋๋ค. ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ ์ด์ด๋ ์ํคํ ์ฒ๋ ๋๋ฉ์ธ ๋ ์ด์ด๊ฐ ๋น๋ํด์ง๋ฉด์ ์์ญ ๊ฐ์ ์ค์ผ๋ ์ ์๋ ๋จ์ ์ด ์์ด ์ ์ธํ์์ต๋๋ค.
- ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ ํฌํธ์ ์ด๋ํฐ๋ฅผ ์ ํํ ๊ตฌํ ํํ๋ก ์ ๊ณตํ์ง๋ง, ์๊ท๋ชจ ๋๋ฉ์ธ ํ๋ก์ ํธ ์งํ ์๋ ์๋๋ก์ด๋์์๋ ์ ํฉํ์ง ์๋ค๊ณ ํ๋จํ์ฌ ์ ์ธํ์์ต๋๋ค.
ํด๋ฆฐ ์ํคํ
์ฒ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ฐ์ดํฐ ๋ก์ง ๋ถ๋ถ์ ๋ถ๋ฆฌํจ์ผ๋ก์จ, ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ๋์ํ ์ ์๋๋ก ์ค๊ณํ์์ต๋๋ค. ์ด๋ก ์ธํด ๋
๋ฆฝ์ ์ธ ์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๊ณ , ํ
์คํธ๊ฐ ์ฉ์ดํด์ง๋ฉฐ, ๋ค๋ฅธ ์์คํ
์์๋ค์ ๋ณ๊ฒฝ์ ๋ํด ๋ OCP ์์น(Open-Closed Principle) ์ ์ค์ํ๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ํ, ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ ์ด์ ์ง์๋์ง ์๊ฑฐ๋ ๋ ๋์ ๋์์ด ๋ฑ์ฅํ์ ๋, ํด๋ฆฐ ์ํคํ ์ฒ๋ ๊ธฐ์กด ์ฝ๋์ ์์กด์ฑ ๋ฐฉํฅ์ฑ์ด ๋๋ฉ์ธ ๋ ์ด์ด๋ฅผ ํฅํ๋ฏ๋ก, ๋๋์ ์ธ ์ฝ๋ ๋ฆฌํฉํ ๋ง ์์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ํด๋ฆฐ ์ํคํ
์ฒ๋ ์ธ๋ถ์ฌํญ์ ์ฆ์ ๊ณ ๋ คํ์ง ์์๋ ๋๋ ์ ๊ณผ ์ ํ์ ์ธ ์๊ฐ์์ ๋ณ๊ฒฝ์ด ์ต์ํ๋ ์์กด์ฑ ๊ทธ๋ํ ๋๋ถ์ ํ์ฌ ์ ํฌ ํ์์ ์ ํฉํ ์ํคํ
์ฒ๋ผ๊ณ ์๊ฐํ์๊ธฐ ๋๋ฌธ์ ์ ํํ์์ต๋๋ค.
์ ํฌ ํ๋ก์ ํธ์์๋ Firestore์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ ์ธ๋ฑ์ฑ ์๋ฒ๋ฅผ ๊ตฌ์ถํด์ผ ํ์ต๋๋ค. ์ด ๊ณผ์ ์์ Elasticsearch์ Algolia ๋ ๊ฐ์ง ํ๋ณด๋ฅผ ๊ณ ๋ คํ์์ต๋๋ค.
์ ํฌ๊ฐ Algolia๋ฅผ ์ ํํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Firestore์์ ์ฌ์ด ํตํฉ: Algolia๋ Firestore์์ ์ฐ๊ฒฐ์ด ์๋์ ์ผ๋ก ๊ฐํธํ์ฌ, ๊ฒ์ ์ธ๋ฑ์ค ๊ตฌ์ถ๊ณผ ์ ์ง ๊ด๋ฆฌ๊ฐ ๋ ์์ํฉ๋๋ค. ๋ฐ๋ฉด, Elasticsearch๋ Firestore์์ ํตํฉ์ด ๋ณต์กํ ์ ์์ด ์ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํฉ๋๋ค.
- Pagination ์ง์: Algolia๋ ๊ธฐ๋ณธ์ ์ผ๋ก Pagination์ ์ง์ํ๋ฉฐ, ์ด๋ Paging3.0 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํตํฉ๋ฉ๋๋ค. ์ด๋ก ์ธํด UI ๊ตฌํ์ด ๋ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ ๋๋ค. ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ด์ง ๋จ์๋ก ๋๋์ด ํ์ํ๋ ๊ฒ์ด ์ฌ์์ง๋ฉฐ, ์ฌ์ฉ์ ๊ฒฝํ์ด ํฅ์๋๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- ๋น ๋ฅธ ๊ฒ์ ์๋: Algolia๋ ๋์ ๊ฒ์ ์๋์ ์ค์๊ฐ ๊ฒ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ, ์ฌ์ฉ์์๊ฒ ๋น ๋ฅด๊ณ ์ ํํ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ์ค์ํ ์์๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
- ๊ด๋ฆฌ์ ์ด์์ ์ฉ์ด์ฑ: Algolia๋ ๊ด๋ฆฌ ๋์๋ณด๋์ API๊ฐ ์ ์ค๊ณ๋์ด ์์ด, ๊ฒ์ ์ธ๋ฑ์ค์ ๊ด๋ฆฌ์ ๋ชจ๋ํฐ๋ง์ด ์ฉ์ดํฉ๋๋ค. Elasticsearch์ ๋นํด ์ค์ ๊ณผ ์ด์์ด ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ์ ํฌ๋ Algolia๋ฅผ ์ ํํ์์ต๋๋ค. Algolia์ ๊ฐ๋ ฅํ ๊ฒ์ ๊ธฐ๋ฅ๊ณผ ์ฌ์ฉ์ ์ฉ์ด์ฑ ๋๋ถ์ ํ๋ก์ ํธ์ ๊ฒ์ ๊ธฐ๋ฅ์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์์์ต๋๋ค.
์๋๋ก์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์์ ํ๋์ Activity์ ์ฌ๋ฌ ๊ฐ์ Fragment๊ฐ ์์ ๋, ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ Activity๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ ViewModel์ ๊ณต์ ํ์ฌ ๋ฐ์ดํฐ ์ ๋ฌ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ์์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ผ๋ฉฐ, ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ์์ต๋๋ค.
- Bundle๊ณผ FragmentManager๋ฅผ ์ฌ์ฉํ ์ ๋ฌ
- Fragment Result API๋ฅผ ์ฌ์ฉํ ๋ฐ์ดํฐ ์ ๋ฌ
- ๊ณตํต์ ViewModel (์: HostActivity์ ViewModel)์ ์ฌ์ฉํ ๋ฐ์ดํฐ ์ ๋ฌ
- Jetpack Navigation์ Safe-Args๋ฅผ ์ฌ์ฉํ ๋ฐ์ดํฐ ์ ๋ฌ
- Bundle๊ณผ FragmentManager:
- ์ฅ์ : ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํ๊ฒ ๋ฐ์ดํฐ ์ ๋ฌ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๋จ์ : ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์
Fragment์์ViewModel์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ,ViewModel์์ UI ์ํ๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ต๋๋ค.
- Fragment Result API:
- ์ฅ์ : ๋ช ํํ ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ์์ผ๋ก, ์ ๋ฌํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ฐ์ ์ ์์ต๋๋ค.
- ๋จ์ : Fragment๊ฐ์ ๋ฐ์ดํฐ ์ ๋ฌ ๊ณผ์ ์ด ๋ค์ ๋ณต์กํ ์ ์์ต๋๋ค.
- ๊ณตํต์ ViewModel (SharedViewModel):
- ์ฅ์ : ์ฌ๋ฌ
Fragment๊ฐ ๋์ผํViewModel์ธ์คํด์ค๋ฅผ ๊ณต์ ํจ์ผ๋ก์จ, ํ๋์Fragment์์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ ์ํ๊ฐ ๋ค๋ฅธFragment์์๋ ์ฆ์ ๋ฐ์๋ฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ์ ์ํ ๊ด๋ฆฌ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค. - ๋จ์ :
ViewModel์ ๋ผ์ดํ์ฌ์ดํด์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ฉฐ, ์ผ๋ถ ๊ฒฝ์ฐ์๋Activity๊ฐ ์ข ๋ฃ๋ ๋ViewModel์ด ์ฌ๋ผ์ง๋ฏ๋ก ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
- ์ฅ์ : ์ฌ๋ฌ
- Safe-Args (Jetpack Navigation):
- ์ฅ์ : ๋ฐ์ดํฐ ์ ๋ฌ ์ ํ์ ์์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค. ๋ฐ์ดํฐ ํ์ ์ด ๋ค๋ฅผ ๊ฒฝ์ฐ ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์์ผ ์๋ํ์ง ์์ ์ํฉ์ ๋ฐฉ์งํฉ๋๋ค.
- ๋จ์ : ์ค์ ๊ณผ ์ดํดํด์ผ ํ ๊ธฐ๋ฅ์ด ๋ง์ ํ๊ฒฝ ์ธํ ์ด ๋ณต์กํ ์ ์์ต๋๋ค.
SharedViewModel์ ์ฌ์ฉํ์ฌ ํ๋์ Activity์์ ์ฌ๋ฌ Fragment ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ณต์ ํ ์ ์์ต๋๋ค. ViewModel์ Activity์ ๋ผ์ดํ์ฌ์ดํด๋ณด๋ค ๋ ์ค๋ ์ด์๋จ๊ธฐ ๋๋ฌธ์, ๊ณตํต์ Activity ViewModel์ ์ฌ์ฉํ์ฌ ์์ ํ๊ฒ ๋ฐ์ดํฐ ์ ๋ฌ๊ณผ ์ํ ๊ด๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
Cloud Functions๋ ์๋ฒ ๊ด๋ฆฌ์ ์ ์ง๋ณด์๋ฅผ ํด๋ผ์ฐ๋ ์๋น์ค ์ ๊ณต์ ์ฒด์ ๋งก๊ธฐ๊ณ , ๊ฐ๋ฐ์๋ ์ฝ๋ ์์ฑ์๋ง ์ง์คํ ์ ์๋ ์๋น์ค์ ๋๋ค. ์ด ์๋น์ค๋ ์ด๋ฒคํธ ํธ๋ฆฌ๊ฑฐ ๊ธฐ๋ฅ์ ํตํด Firebase์์ ์ ๊ณตํ๋ ์๋น์ค์ ๋ฐ์ดํฐ ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ , ํด๋น ์ด๋ฒคํธ์ ๋ฐ์ํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ฏธ๋ฆฌ ์์ฑํด๋ ํจ์๋ฅผ ์๋์ผ๋ก ์คํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ค์ํ ์ํฉ์ ๋ง์ถฐ ํ์ํ ๊ธฐ๋ฅ์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
FireBase Cloud Function์ ์ฌ์ฉํ ๊ธฐ๋ฅ
์๋ฆผ ์ ๊ณต: ์๋ก์ด ๋ฉ์์ง๊ฐ ๋์ฐฉํ๊ฑฐ๋ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ฌ์ฉ์์๊ฒ ํธ์ ์๋ฆผ์ ์ ์กํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฒ์๊ธ์ ๋๊ธ์ด ๋ฌ๋ฆด ๊ฒฝ์ฐ ์๋ฆผ ์ ๊ณต ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ฆฌ ๋ฐ ์ ์ง๋ณด์: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ฉด ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ํ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ๋กํ ์ด๋ฏธ์ง ๋ณ๊ฒฝ ์ ๋๊ธ, ๊ฒ์๊ธ ๋ฑ์ ํ๋กํ ์ด๋ฏธ์ง ๋ณ๊ฒฝ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
ํํดํ ์ฌ์ฉ์ ๋์: ์ฌ์ฉ์๊ฐ ํํดํ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ ๋ณด, ํ ํฐ, uid ๊ฐ ๋ฑ์ ์ ๋ฆฌ ํด์ผ ํ๋ ๊ณผ์ ์ ๋จ์ํ ์ฑ์์ ์ฒ๋ฆฌํ๊ธฐ์๋ firebase ์ ์ฑ ์ 10๋ถ ์ด๋ด์ ์ฌ ๋ก๊ทธ์ธ ์ฌ์ฉ์์๊ฒ ๋ง ํ์ฉ์ด ๋์๊ณ , ํํด๋ฅผ ํ๋ ๊ณผ์ ์์ ์ฌ ์ธ์ฆ์ ์์ฒญํ๋ UI/UX๋ ์ข์ง ์๋ค๊ณ ์๊ฐํด์ ์ด๋ฌํ ๋ฐฉํฅ์ฑ์ผ๋ก ๊ตฌํํ์์ต๋๋ค.
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๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋๋ก ํ์์ต๋๋ค. ์ด ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์ฝ๋ ์ ์ง ๋ณด์์ ๋ณต์ก๋๊ฐ ์ค์ด๋ค์์ต๋๋ค.
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ํ๋ ์ ํ
์ด์
์์ ํ์ํ ์๋ฌ๋ฅผ throw ์ฒ๋ฆฌํ์ฌ ViewModel์์ catch ํ๋๋ก ๋ณ๊ฒฝํ์์ต๋๋ค. ๊ทธ๋ ๊ฒ catchํ ์๋ฌ๋ฅผ
-
๋ฌธ์ ์ํฉ (FirebaseAuth Recent Login Required Exception)
- firebase๋ ๊ณ์ ์ญ์ , ๊ธฐ๋ณธ ์ด๋ฉ์ผ ์ฃผ์ ์ค์ , ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ด ๋ณด์์ ๋ฏผ๊ฐํ ์์
์ ํ๋ ค๋ฉด ์ฌ์ฉ์๊ฐ ์ต๊ทผ์ ๋ก๊ทธ์ธํ ์ ์ด ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ก์ธํด ๊ฐ์
๋ ์ ์ ๊ฐ ํ์ ํํด๋ฅผ ์์ฒญํ๋ ๊ฒฝ์ฐ ์ฌ์ธ์ฆํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์์ค์ ์๋ ์ฑ ์ค์์ ์นด์นด์ค ๋ก๊ทธ์ธ, ๊ตฌ๊ธ ๋ก๊ทธ์ธ ํ์ ํ์ ํํด ํ์ ๊ฒฝ์ฐ์ ์ฌ์ธ์ฆ์ ์์ฒญํ๋ ์ฑ์ ๋ณด์ง ๋ชปํ์๊ธฐ ๋๋ฌธ์, ์ด ๋ฌธ์ ๊ฐ ์ ์ ๊ฒฝํ์ ๋จ์ด๋จ๋ฆด ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค๊ณ ํ๋จํ์์ต๋๋ค.
- firebase๋ ๊ณ์ ์ญ์ , ๊ธฐ๋ณธ ์ด๋ฉ์ผ ์ฃผ์ ์ค์ , ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ๊ณผ ๊ฐ์ด ๋ณด์์ ๋ฏผ๊ฐํ ์์
์ ํ๋ ค๋ฉด ์ฌ์ฉ์๊ฐ ์ต๊ทผ์ ๋ก๊ทธ์ธํ ์ ์ด ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ก์ธํด ๊ฐ์
๋ ์ ์ ๊ฐ ํ์ ํํด๋ฅผ ์์ฒญํ๋ ๊ฒฝ์ฐ ์ฌ์ธ์ฆํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์์ค์ ์๋ ์ฑ ์ค์์ ์นด์นด์ค ๋ก๊ทธ์ธ, ๊ตฌ๊ธ ๋ก๊ทธ์ธ ํ์ ํ์ ํํด ํ์ ๊ฒฝ์ฐ์ ์ฌ์ธ์ฆ์ ์์ฒญํ๋ ์ฑ์ ๋ณด์ง ๋ชปํ์๊ธฐ ๋๋ฌธ์, ์ด ๋ฌธ์ ๊ฐ ์ ์ ๊ฒฝํ์ ๋จ์ด๋จ๋ฆด ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค๊ณ ํ๋จํ์์ต๋๋ค.
-
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ํ๋ก ํธ์์๋ ์ ๋ขฐํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌ ํ ๊ฒฝ์ฐ์ ์ด๋ฌํ ์ ์ฑ
์ ๋ด๋์ ๊ฒ์ผ๋ก ํ๋จํ์์ต๋๋ค. ๋ฐ๋ผ์,
Cloud Function์ ์ฌ์ฉํ์ฌ ์๋ฒ์ ์ญ์ ์์ฒญ์ ํ๋ ๋ฐฉํฅ์ฑ์ผ๋ก ๋ณ๊ฒฝํ์์ต๋๋ค.
- ํ๋ก ํธ์์๋ ์ ๋ขฐํ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌ ํ ๊ฒฝ์ฐ์ ์ด๋ฌํ ์ ์ฑ
์ ๋ด๋์ ๊ฒ์ผ๋ก ํ๋จํ์์ต๋๋ค. ๋ฐ๋ผ์,
-
๋ฌธ์ ์ํฉ
- PagingData๋ ์์ดํ
์ ์ถ๊ฐํ๊ธฐ ์ํด์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ์์ต๋๋ค. ์ฒซ๋ฒ์งธ๋
PagingAdapter๋ฅผRefreshํ๋ ๋ฐฉ์, ๋๋ฒ์งธ๋RemoteMediator๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๋ฐฉ์์ ๋๋ค. ์ ์๋ API ์์ฒญ์ด ๋น์ฉ์ด ๋๋ฌด ํฌ๋ค๋ ๊ฒ์ ๋ํ ๋ฌธ์ ์ ์ด ์กด์ฌํ์๊ณ , ํ์๋ ์คํ๋ผ์ธ ๋ชจ๋๋ฅผ ์ง์ํ ์๊ฐ์ด ์์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ ๋ํ ๋น์ฉ์ด ํฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐ ํ์ต๋๋ค.
- PagingData๋ ์์ดํ
์ ์ถ๊ฐํ๊ธฐ ์ํด์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ์์ต๋๋ค. ์ฒซ๋ฒ์งธ๋
-
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด,
ConcatAdapter๋ฅผ ์ฌ์ฉํด์ ๊ธฐ์กด ์์ดํ ๊ณผ ์๋ก์ด ์์ดํ ์ RecyclerView Adapter๋ฅผ ๋๋์์ต๋๋ค. ์๋ก์ด ์์ดํ ์ ์ ๋ฐ์ดํธ ํ ๊ฒฝ์ฐ์, ์ ์ฒด ์์ดํ ์ Refresh ํ์ง ์๊ณ ์๋ก์ด ์์ดํ ๋ถ๋ถ๋ง ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์งํํ์์ต๋๋ค.
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด,
-
๋ฌธ์ ์ํฉ
- ๋ง์ด ํ์ด์ง์ ๊ณ์ ์ด๋, ๊ธ์ฐ๊ธฐ์ ์๋ํฐ ๊ธฐ๋ฅ์์ ์ฌ์ง์ ์ฒจ๋ถํ๋ ๊ณผ์ ์์ ์ด๋ค ์ด๋ฏธ์ง๋ 90๋๊ฐ ๋์๊ฐ๋ ํ์์ด ๋ฐ์ํ์์ต๋๋ค. ์ด๋ ์ด๋ฏธ์ง ํ์ผ์ ๋ด์ฅ๋ EXIF ๋ฐฉํฅ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์์ธ์ด์์ต๋๋ค. ActivityResultContracts.PickVisualMedia๋ฅผ ์ฌ์ฉํ ๋ EXIF ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ์ง ํ์ผ์ ํฌํจ๋๋๋ฐ ์ด๋ฅผ ์ ์ ํ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ด๋ฏธ์ง๊ฐ ํ์ ๋์ด ๋ณด์ผ ์ ์์ต๋๋ค.
- ๋ง์ด ํ์ด์ง์ ๊ณ์ ์ด๋, ๊ธ์ฐ๊ธฐ์ ์๋ํฐ ๊ธฐ๋ฅ์์ ์ฌ์ง์ ์ฒจ๋ถํ๋ ๊ณผ์ ์์ ์ด๋ค ์ด๋ฏธ์ง๋ 90๋๊ฐ ๋์๊ฐ๋ ํ์์ด ๋ฐ์ํ์์ต๋๋ค. ์ด๋ ์ด๋ฏธ์ง ํ์ผ์ ๋ด์ฅ๋ EXIF ๋ฐฉํฅ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์์ธ์ด์์ต๋๋ค. ActivityResultContracts.PickVisualMedia๋ฅผ ์ฌ์ฉํ ๋ EXIF ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ์ง ํ์ผ์ ํฌํจ๋๋๋ฐ ์ด๋ฅผ ์ ์ ํ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ด๋ฏธ์ง๊ฐ ํ์ ๋์ด ๋ณด์ผ ์ ์์ต๋๋ค.
-
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, uri๋ก๋ถํฐ inputstream์ ๊ตฌํ๊ณ , inputstream์ผ๋ก๋ถํฐ ExifInterface ๋ฅผ ๊ตฌํ๊ณ , getAttributeInt ๋ฅผ ์ด์ฉํด ์ด๋ฏธ์ง์ ๋ฐฉํฅ ๊ฐ์ ๊ตฌํ์์ต๋๋ค. ๋ฐฉํฅ๊ฐ์ matrix ์ ์์ฑ์ผ๋ก ๋ฃ๊ณ ํด๋น matrix ๋ก ๋ฐฉํฅ์ด ์์ ๋ ๋นํธ๋งต ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์์ต๋๋ค.
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, uri๋ก๋ถํฐ inputstream์ ๊ตฌํ๊ณ , inputstream์ผ๋ก๋ถํฐ ExifInterface ๋ฅผ ๊ตฌํ๊ณ , getAttributeInt ๋ฅผ ์ด์ฉํด ์ด๋ฏธ์ง์ ๋ฐฉํฅ ๊ฐ์ ๊ตฌํ์์ต๋๋ค. ๋ฐฉํฅ๊ฐ์ matrix ์ ์์ฑ์ผ๋ก ๋ฃ๊ณ ํด๋น matrix ๋ก ๋ฐฉํฅ์ด ์์ ๋ ๋นํธ๋งต ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์์ต๋๋ค.
โถ ๊ธ์ฐ ํ
์คํธ ํ๋ฉด ๊ตฌํ ์ค ๋ทฐํ์ด์ ์ด๋ํฐ๊ฐ ์ ๋๋ก ์๋ํ์ง ์๋ ๋ฌธ์
-
๋ฌธ์ ์ํฉ
- Question Fragment์์ ViewPagerFragment์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ binding ์ด null ์ด์ด์ NullPointerException์ด ๋ฐ์ํ์์ต๋๋ค. (parentFragment as? ViewPagerFragment)?.moveToNextQuestionPage() ๋ฅผ ์ฌ์ฉํด ์ ๊ทผํด๋ณด๋ ค๊ณ ํ์ง๋ง, ๋ก๊ทธ๋ฅผ ์ฐ์ด๋ณธ ๊ฒฐ๊ณผ ViewPagerFragment๋ ๋ถ๋ชจ ํ๋๊ทธ๋จผํธ๊ฐ ์๋์์ต๋๋ค.
- Question Fragment์์ ViewPagerFragment์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ binding ์ด null ์ด์ด์ NullPointerException์ด ๋ฐ์ํ์์ต๋๋ค. (parentFragment as? ViewPagerFragment)?.moveToNextQuestionPage() ๋ฅผ ์ฌ์ฉํด ์ ๊ทผํด๋ณด๋ ค๊ณ ํ์ง๋ง, ๋ก๊ทธ๋ฅผ ์ฐ์ด๋ณธ ๊ฒฐ๊ณผ ViewPagerFragment๋ ๋ถ๋ชจ ํ๋๊ทธ๋จผํธ๊ฐ ์๋์์ต๋๋ค.
-
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ํ๋๊ทธ๋จผํธ๊ฐ ๊ณ์ธต ๊ด๊ณ๋ฅผ ํผํ๊ธฐ ์ํด shared view model ์ ์ฌ์ฉํด์ Question Fragment์์ live data๋ฅผ ์ธํ
ํ๊ณ , ViewPagerFragment์์ ์ต์ ๋น ํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ๋๊ทธ๋จผํธ๊ฐ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋
Shared view model์ ๊ณ ๋ คํด๋ณด๋ ๊ฒ์ด ์ข๊ฒ ๋ค๊ณ ๋๊ผ์ต๋๋ค.
- ํ๋๊ทธ๋จผํธ๊ฐ ๊ณ์ธต ๊ด๊ณ๋ฅผ ํผํ๊ธฐ ์ํด shared view model ์ ์ฌ์ฉํด์ Question Fragment์์ live data๋ฅผ ์ธํ
ํ๊ณ , ViewPagerFragment์์ ์ต์ ๋น ํ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ๋๊ทธ๋จผํธ๊ฐ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋
-
๋ฌธ์ ์ํฉ
- DialogFragment์์ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์งํ๋๋ ๋์
dismiss()๊ฐ ํธ์ถ๋์ด viewModel์ด ์ฃฝ๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ด๋ก ์ธํด ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์ ์์ ์ผ๋ก ์ด๋ฃจ์ด์ง์ง ์์์ต๋๋ค.
- DialogFragment์์ ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์งํ๋๋ ๋์
-
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, parameter๋ก ์ ๋ฌํด์ค์ viewModel ๋ด๋ถ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋ฃ ํ
dismiss()๋ฅผ ํธ์ถํ๋๋ก ํ์์ต๋๋ค.
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, parameter๋ก ์ ๋ฌํด์ค์ viewModel ๋ด๋ถ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋ฃ ํ
-
๋ฌธ์ ์ํฉ
Cloud Firestore๋ ์ด๋น ์ต๋ 1ํ ๋ฌธ์ ์ ๋ฐ์ดํธ๋ฅผ ๋ณด์ฆํ๋ฏ๋ก, ์กฐํ์๋ฅผ ์นด์ดํธํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ด๋ Firestore์ ํ๊ณ๋ก ์ธํ ๋ฌธ์ ์์ต๋๋ค.
-
ํด๊ฒฐ ๋ฐฉ๋ฒ
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ๋ถ์ฐ ์นด์ดํฐ ์๋ฃจ์
์ ๋์
ํ์์ต๋๋ค. ์ด ๋ฐฉ์์ ์ค๋๋ก ๊ตฌ์ฑ๋ ํ์ ์ปฌ๋ ์
์ ์ฌ์ฉํ์ฌ ๊ฐ ์ค๋์ ๊ฐ์ ํฉ์ฐํ๋ ๋ฐฉ์์ ์ ์ฉํ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋จ์ผ ์นด์ดํฐ๋ณด๋ค 10๋ฐฐ ๋ง์ ์ฐ๊ธฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ๋์์ต๋๋ค. ์์ผ๋ก Firestore์์ ์กฐํ์๋ฅผ ์นด์ดํธํ ๋๋ ์ด ๋ถ์ฐ ์นด์ดํฐ ์๋ฃจ์
์ ๋์
ํ์ฌ ์ฌ์ฉํ ๊ณํ์
๋๋ค.
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ๋ถ์ฐ ์นด์ดํฐ ์๋ฃจ์
์ ๋์
ํ์์ต๋๋ค. ์ด ๋ฐฉ์์ ์ค๋๋ก ๊ตฌ์ฑ๋ ํ์ ์ปฌ๋ ์
์ ์ฌ์ฉํ์ฌ ๊ฐ ์ค๋์ ๊ฐ์ ํฉ์ฐํ๋ ๋ฐฉ์์ ์ ์ฉํ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋จ์ผ ์นด์ดํฐ๋ณด๋ค 10๋ฐฐ ๋ง์ ์ฐ๊ธฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ๋์์ต๋๋ค. ์์ผ๋ก Firestore์์ ์กฐํ์๋ฅผ ์นด์ดํธํ ๋๋ ์ด ๋ถ์ฐ ์นด์ดํฐ ์๋ฃจ์
์ ๋์
ํ์ฌ ์ฌ์ฉํ ๊ณํ์
๋๋ค.
-
๋ฌธ์ ์ํฉ
- Hilt ์์กด์ฑ ์ฃผ์
์ ์ฌ์ฉํ๋ฉด ์๋ช
์ฃผ๊ธฐ๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋, SingletonComponent::class๋ฅผ ์ ์ธํ์ฌ DataStore๋ฅผ ์์กด์ฑ ์ฃผ์
ํ์ ๋, ์์์น ๋ชปํ ์๋ฌ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
- Hilt ์์กด์ฑ ์ฃผ์
์ ์ฌ์ฉํ๋ฉด ์๋ช
์ฃผ๊ธฐ๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋, SingletonComponent::class๋ฅผ ์ ์ธํ์ฌ DataStore๋ฅผ ์์กด์ฑ ์ฃผ์
ํ์ ๋, ์์์น ๋ชปํ ์๋ฌ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
-
ํด๊ฒฐ ๋ฐฉ๋ฒ
-
Hilt()์ SingletonComponent::class๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ ์๋ช ์ฃผ๊ธฐ์์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง๋ง, ํญ์ ๋์ผํ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ์ง๋ ์๋๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด @Singleton ์ ๋ํ ์ด์ ์ ์ถ๊ฐํ์ฌ ํ๋์ ์ธ์คํด์ค๋ง ์์ฑ๋๋๋ก ์์ ํ์์ต๋๋ค. ์ด๋ก์จ Hilt๋ฅผ ์ฌ์ฉํ ๋@Singleton์ ๋ํ ์ด์ ์ ํตํด ๋จ์ผ ์ธ์คํด์ค๋ฅผ ๋ณด์ฅํ ์ ์๋ค๋ ์ ์ ๊นจ๋ฌ์์ต๋๋ค.
-
- ์ปค๋ฎค๋ํฐ ์ ์ ๋ผ๋ฆฌ์ ํ๋ก์ฐ/ํ๋ก์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ , ์๋ก์ ํ๋กํ์์ ํ์ธํ ์ ์๋๋ก ๊ตฌํํ ๊ณํ์ ๋๋ค.
- ๋ค์ํ ์ธ์ด(์์ด ๋ฑ)์ ๋์ํ๋ ์ธ์ด ์ค์ ์ ์ถ๊ฐํ ๊ณํ์ ๋๋ค.
- ๋คํฌ๋ชจ๋์ ๋์ํ์ฌ, ํ ๋ง ์ค์ ์ ์ถ๊ฐํ ๊ณํ์ ๋๋ค.
- ๋ก๊ทธ์ธ์ ํ์ง ์์๋ ์ปค๋ฎค๋ํฐ์ ์ดํ์ ์ ์ฒด์ ์ผ๋ก ํ์ธํด๋ณผ ์ ์๋๋ก ๊ฒ์คํธ๋ชจ๋๋ฅผ ์ถ๊ฐํ ๊ณํ์ ๋๋ค.
- ์ฑ ๋ด ๊ด๊ณ ๋ฅผ ์ถ๊ฐํ ๊ณํ์ ๋๋ค.
- UI/UX๋ฅผ ๋ณด๋ค ๊ฐ์ ํ๊ณ , ์ฌ์ฉ์ ์นํ์ ์ธ ๋ฐฉํฅ์ผ๋ก ๋ฐ๊พธ์ด๋๊ฐ ์์ ์ ๋๋ค.















