#1 ๊ฐ๋ฐ ๋ชฉํ (Iteration Goal)
#1-1 ์ด์(Ideal)๊ณผ ์ง๊ฒ๋ค๋ฆฌ
์ด์(Ideal)
๋ด๊ฐ ์ง์ ์ฐ๊ณ ์ถ์ ์ฑ์ด ์๋๋ฐ, ๋จ์๊ฒ ์ด๋ป๊ฒ ๊ถ์ ํ ์ ์์๊น? ์์ผ๋ก ์ถ๊ฐํ ๊ธฐ๋ฅ์ ์์ด๋์ด๋ฅผ ์ป๊ธฐ ์ํด์๋ , ๊ฐ๋ฐ ์์์ ์ํด์๋ , ๋ฒ๊ทธ ๋ฐ๊ฒฌ์ ์ํด์๋ ์ ์์์ ์ค์ฌ์ฉ์ ํ์๋ค.
์ง๊ธ๊น์ง์ ์์
๊ฒฐ๊ณผ๋ฌผ์ ํ ๋๋ก, ๋น์ฅ ๋ด๊ฐ ์ฌ์ฉํ ์ ์๋ ์ฑ์ ๋ง๋ ๋ค. ๋ฉ๋ชจ์ฅ ๋์ฉ์ผ๋ก ์ฌ์ฉํ ์ ์๊ธฐ๋ง ํ๋ฉด ๊ทธ๋ง์ด๋ฏ๋ก, ์์ฑ๋์๋ ์ ๊ฒฝ ์ฐ์ง ์์์ผ ํ ๊ฒ์ด๋ค. CategoryใMemoใMemoContent ๊ฐ๊ฐ์ ๋ํ CRUD๋ง์ ๊ตฌํํ๋ค.
Iteration 4: MVP 1 ๊ตฌํ (1/3)
ํ์ฌ๊น์ง ๊ตฌํํ ๊ฒ์ ์ค๊ฐ ๋ง๋ฌด๋ฆฌํ์ฌ ์ฒซ ๋ฒ์งธ MVP๋ฅผ ๋ง๋ ๋ค. Iteration 4์์๋ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ถ๊ฐ ๋ฐ ํด๋น DB์ ๋ฉ๋ชจ๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ๊น์ง๋ง ๊ตฌํํ๋ค. ์ด์ด์ง๋ Iteration 5์์ ๋๋จธ์ง ๊ธฐ๋ฅ๋ค๊น์ง ๊ตฌํํ๊ณ Iteration 6์์ ์ฝ๋ ๋ฆฌํฉํ ๋ง๊น์ง ํ ํ์, ์ฒซ ๋ฒ์งธ MVP๋ฅผ ๋ง๋ฌด๋ฆฌํ๊ฒ ๋ค.
#1-2 ๊ฐ๋ฐ ๋ฒ์
์ด๋ฒ ๊ฐ๋ฐ ๋ฒ์ (In Scope)
- ์ค์ Database ๊ตฌํ
- ๋ฉ๋ชจ ์ถ๊ฐ ๊ธฐ๋ฅ
- MVP๋ฅผ ์ํ UI ์
๋ฐ์ดํธ
- IME์ ๋ฐ์ํ๋ UI
- LabelChipGroup ์ ๊ฑฐ
- ์์ด๋์ด ์์ฒด๋ฅผ ํ๊ธฐํ๋ ๊ฒ ์๋๋ผ, ๋น์ฅ์ MVP ๊ตฌํ์ ์ํด ์ ๊ฑฐ
- Iteration 4์์ ์ ๊ฑฐ ํ ๋์ค์ ๋ค์ ์ถ๊ฐ
๋ฒ์ ์ธ (Out of Scope)
- ๋ฉ๋ชจ ์ญ์ ๊ธฐ๋ฅ
- ๋ฉ๋ชจ ์ MemoContent ๊ฐ๋ณ ์ญ์ ๊ธฐ๋ฅ
- ๋ฉ๋ชจ ์์ ๊ธฐ๋ฅ
- ์นดํ ๊ณ ๋ฆฌ ์ถ๊ฐ ๊ธฐ๋ฅ
- ์นดํ ๊ณ ๋ฆฌ ์ญ์ ๊ธฐ๋ฅ
- ์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ ์์ ๊ธฐ๋ฅ
#2 ๋ณ๊ฒฝ ๋ด์ญ (์ปค๋ฐ ๋ชฉ๋ก)
#2-1 Iteration 4-1: IME์ ๋ฐ์ํ๋ UI
์ค์ฌ์ฉ์ ์ํด์, ์ฐ์ UI๊ฐ IME์ ๋ฐ์ํ์ง ์๋ ์ ์ ์์ ํ๋ค.
๊ด๋ จ ๊ฐ๋ฐ ๋ฒ์
- MVP๋ฅผ ์ํ UI ์
๋ฐ์ดํธ
- IME์ ๋ฐ์ํ๋ UI
์ฃผ์ ๋ณ๊ฒฝ์
- App์ Window๊ฐ IME์ ์ํฅ๋ฐ์ง ์๋๋ก ์ค์
- MemoEditor๊ฐ IME์ ๋ง์ถฐ ์์ง์ด๋๋ก ๊ตฌํ
- Iteration 1-3์์ ํ ์คํธ์ฉ์ผ๋ก ๋๋ topBar ์ ๋ฒํผ์ ์ ๊ฑฐํ๊ณ , ํด๋น ๋ฒํผ์ด ์ง๋ ๋ ๊ธฐ๋ฅ์ MemoEditor ์ "Send" ๋ฒํผ์ ํ ๋น
์คํฌ๋ฆฐ์ท

์ฐธ๊ณ
#2-2 Iteration 4-2: LabelChipGroup ๋ฑ ์ ๊ฑฐ
- LabelChipGroup์ ์ผ๋จ ์ญ์ ํ๋ค. ๋น์ฅ ๊ตฌํํ MVP์์ ๋ณด์ด๊ธฐ์๋ ์์ฑ๋๊ฐ ๋จ์ด์ง๊ณ ์๊ฐ๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ํ์ง๋ง, LabelChipGroup์ ๋ณธ ์ฑ์ ํต์ฌ UI ์์์ด๊ธฐ ๋๋ฌธ์ ๋์ค์ ์ด๋ค ํํ๋ก๋ ๋ค์ ์ถ๊ฐ๋ ๊ฒ์ด๋ค.
- ์ด์ ์ ๊ตฌ์ํ๋ ์ค๊ณ์ ๊ฑธ๋ง๊ฒ, ์์ดํ ์ด ์ค๋๋ ๋ฉ๋ชจ๋ถํฐ ์๋์ชฝ์์ ์ฌ๋ผ์ค๊ฒ ์์ ํ๋ค.
๊ด๋ จ ๊ฐ๋ฐ ๋ฒ์
- MVP๋ฅผ ์ํ UI ์
๋ฐ์ดํธ
- LabelChipGroup ์ ๊ฑฐ
์ฃผ์ ๋ณ๊ฒฝ์
- MemoFeed์ ์์ดํ ์ด ์๋์์ ์๋ก ์ฌ๋ผ์ค๋ ํํ๋ก ๋ณ๊ฒฝ
- MemoEditor์์ "-" ๋ฒํผ ์ ๊ฑฐ
- LabelChipGroup ์ ๊ฑฐ
- MemoContentTextField ๋์์ธ ์ด์ง ๋ค๋ฌ์
์คํฌ๋ฆฐ์ท

์ฝ๋ ์ค๋ํซ - MemoFeed
package com.example.memo.components
...
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MemoFeed(
memos: List<Memo>,
modifier: Modifier
) {
LazyColumn(
modifier = modifier,
reverseLayout = true,
) {
items(memos.asReversed()) { memo ->
Spacer(modifier = Modifier.height(4.dp))
MemoCard(memo = memo)
}
}
}
reverseLayout = true ๋ก ๋ ์ด์์ ์ปจํ ์ด๋๋ฅผ ๋ค์ง๊ณ , ๊ทธ ๋ค์งํ ์ปจํ ์ด๋์ ์์ดํ ์ ์ญ์(asReversed)์ผ๋ก ์ค๋ค. ์ด๋ฌ๋ฉด ์ต์ ๋ฉ๋ชจ์ผ์๋ก ์๋์ ์๊ณ ์ต์ด ์คํฌ๋กค๋ฐ์ ์์น๋ ๋งจ ์๋์์ ์์ํ๋, ์ด๋ฅธ๋ฐ ์ฑํ UI๊ฐ ๋๋ค.
์ฐธ๊ณ
- [GitHub] ์ด ์์ ์ Commit
- [Tistory] Nutri Capture - ์ฑํ UI
- [Tistory] Swemo - Iteration 2: UI ๋์์ธ ๋ฐฉํฅ ํ์(Exploration)
#2-3 Iteration 4-3: MemoContent ์ถ๊ฐ ๋ฒํผ ๊ตฌํ
- MVP๋ฅผ ์ํ UI ์ ๋ฐ์ดํธ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ค
- MemoEditor๋ฅผ ํตํด FakeMemoRepository์ ๋ฉ๋ชจ๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค
๊ด๋ จ ๊ฐ๋ฐ ๋ฒ์
- MVP๋ฅผ ์ํ UI ์ ๋ฐ์ดํธ
- ๋ฉ๋ชจ ์ถ๊ฐ ๊ธฐ๋ฅ
์ฃผ์ ๋ณ๊ฒฝ์
- MemoEditor ์์ MemoContent ์ถ๊ฐ ๋ฒํผ ๊ตฌํ
- MemoEditor๋ก ๋ฉ๋ชจ ์ ๋ ฅ → (FakeMemoRepository์) ๋ฉ๋ชจ ์ถ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ
์คํฌ๋ฆฐ์ท

์ฐธ๊ณ
#2-4 Iteration 4-4: id ํ๋กํผํฐ์ ๋ฐ์ดํฐํ ๋ณ๊ฒฝ
- ๋ด๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ์์ ์ด๋ฏ๋ก, id๋ ์๋ฒ ํ๊ฒฝ์ฒ๋ผ String ํ์ ์ผ๋ก ๋ ํ์๊ฐ ํฌ์ง ์๋ค๊ณ ํ๋จํ๋ค. ์คํ๋ ค ์ ํต์ ์ธ ๋ฐฉ์๋๋ก ์ซ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ํธ์ด ์ ์ฅ, ์กฐํ, ๊ด๋ฆฌ ์ธก๋ฉด์์ ๋ ์ ์ ํ๋ค๊ณ ๋ณธ๋ค.
- MemoContent๋ Memo์ ์ข
์๋ ํญ๋ชฉ์ด๊ธฐ ๋๋ฌธ์ ๋ณ๋์ id ํ๋กํผํฐ๋ฅผ ๋์ง ์์๋ค. ๊ทธ๋ฌ๋ ์์ผ๋ก ๋ค๋ฅธ Memo๋ก ์ด๋์ํค๋ ๊ธฐ๋ฅ ๋ฑ์ด ์ถ๊ฐ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๊ณ ํ๋จํด, ์ ์ ์ ์ผ๋ก id ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ค.
- ์๋ณ์๊ฐ ๋ค๋ฆ๊ฒ ํ์ํด์ง๋ฉด ๋ฐ์ดํฐ ๊ตฌ์กฐ + ์ฌ์ฉ์ฒ ์ ๋ฐ์ ํจ๊ป ์์ ํด์ผ ํ ์ ์์ด, ์ฌ๊ธฐ์์ ๋ฏธ๋ฆฌ ๋ฐ์ํ๋ ํธ์ด ๋ ์์ ์ ์ด๋ผ๊ณ ํ๋จํ๋ค.
๊ด๋ จ ๊ฐ๋ฐ ๋ฒ์
- ์ค์ Database ๊ตฌํ
์ฃผ์ ๋ณ๊ฒฝ์
- Model ํด๋์ค๋ค์ String ํ "id" ํ๋กํผํฐ์ ๋ฐ์ดํฐํ์ Long ํ์ผ๋ก ๋ณ๊ฒฝ
- MemoContent์ (Long ํ) "id" ํ๋กํผํฐ ์ถ๊ฐ
์ฐธ๊ณ
#2-5 Iteration 4-5: database ๋ชจ๋ ๊ตฌํ
database ๋ชจ๋์ ์ ์ธ ํ ๊ฐ๋จํ๊ณ ์ ์์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ตฌํํ๋ค
๊ด๋ จ ๊ฐ๋ฐ ๋ฒ์
- ์ค์ Database ๊ตฌํ
์ฃผ์ ๋ณ๊ฒฝ์
- database ๋ชจ๋ ์ถ๊ฐ ๋ฐ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌํ
- .gitignore ์ ๋ฐ์ดํธ
์ฐธ๊ณ
#2-6 Iteration 4-6: ๋ด๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋
Iteration 4-5์์ ๋ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค.
๊ด๋ จ ๊ฐ๋ฐ ๋ฒ์
- ๋ฉ๋ชจ ์ถ๊ฐ ๊ธฐ๋ฅ
์ฃผ์ ๋ณ๊ฒฝ์
- FakeMemoRepository → FakeMemoRepositoryImpl๋ก ์ด๋ฆ ๋ณ๊ฒฝ
- database ๋ชจ๋์ ์์กดํ๋ MemoRepositoryImpl ๊ตฌํ
- MemoViewModel์ FakeMemoRepositoryImpl ๋์ MemoRepositoryImpl ์ฃผ์
์คํฌ๋ฆฐ์ท

์ฐธ๊ณ
'๊ฐ๋ฐ ์ผ์ง ๐ป > Swemo' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Swemo - Iteration 3: ๋ฉ๋ชจ ํ๋ฉด์ State & Event ์ฒด๊ณ ์ ๋ฆฌ (0) | 2026.02.08 |
|---|---|
| Swemo - Iteration 2: UI ๋์์ธ ๋ฐฉํฅ ํ์(Exploration) (0) | 2026.01.13 |
| Swemo - Iteration 1: ๋ฉ๋ชจ ์ฑ์ ์ฒญ์ฌ์ง(๊ธฐ์ด) (0) | 2025.12.28 |
| Swemo - Nutri Capture ๊ฒ์๊ธ ์๋ฆฌ์ฆ๋ก ์ด๋ (0) | 2025.12.09 |
| Nutri Capture - Swemo ๊ฒ์๊ธ ์๋ฆฌ์ฆ๋ก ์ด๋ (0) | 2025.12.09 |