๊ธฐ์กด์ UIKit ํ๋ก์ ํธ๋ฅผ MVVM + RxSwift + TDD ๋ฐฉ์์ผ๋ก ์๋กญ๊ฒ ๊ตฌํํ ํ๋ก์ ํธ์ ๋๋ค.
์ฃผ์ค ์ฃผ๋ฌธ, ์ฃผ๋ฌธ ์ฌ๊ณ ์ฐจ๊ฐ, ๊ณผ์ผ ์ฌ๊ณ ๊ด๋ฆฌ ๋ฑ
- RxSwift
- MVVM
- TDD
- UnitTest
- Input/Output
- MVVM + RxSwift๋ฅผ ์ง์ ์ ์ฉํด๋ณด๋ฉฐ ํ์ต
- ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ ๋ฐฉ์ ๊ฒฝํ
- ์ฃผ์ค ์ฃผ๋ฌธ ๋ฒํผ์ ํตํด ์ฃผ๋ฌธํ ์ ์์ต๋๋ค.
- ๊ณผ์ผ์ ์ฃผ์ค์ ํ์ํ ๊ฐ์๋งํผ ์ฐจ๊ฐ๋ฉ๋๋ค.
- ์ฌ๊ณ ๊ฐ ๋ถ์กฑํ ๊ฒฝ์ฐ ์ฃผ๋ฌธ์ด ๋ถ๊ฐํ๋ฉฐ ์๋ฆผ ๋ฉ์ธ์ง๊ฐ ๋ฐ์ํฉ๋๋ค.
- ๊ณผ์ผ์ ์ฌ๊ณ ๋ฅผ Stepper๋ฅผ ํตํด์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- RxTest: ์ต์ ๋ฒ๋ธ์ ์๊ฐ ๊ฐ๋ ์ ์ฃผ์ ํ์ฌ ์ํ๋ ์๊ฐ์ ๋ฐฉ์ถ๋๋ ์ด๋ฒคํธ๋ฅผ ๊ฒ์ฆ
- RxBlocking: ์ต์ ๋ฒ๋ธ์ ํน์ ์๊ฐ ๋ด์ ์ด๋ฒคํธ ๋ฐฉ์ถ๋ง์ ๊ฒ์ฆ
์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ๋ฐฉ์ถ๋๋ ์ด๋ฒคํธ๋ฅผ ๊ฒ์ฆํ๋ RxTest๋ณด๋ค๋, ๋จ์ํ ๋ฐฉ์ถ๋๋ ์ด๋ฒคํธ๋ง์ ๊ฒ์ฆํ๋ RxBlocking์ด ์ ํฉํ๋ค๊ณ ํ๋จํ์ฌ ์ด๋ฅผ ์ด์ฉํ ํ
์คํธ๋ฅผ ์งํํ์ต๋๋ค.
์ด๋ฐ ๊ตฌํ์๋ ViewModel๊ณผ UseCase์์ ์ต์ ๋ฒ๋ธ์ ๊ตฌ๋ ํ๊ณ ์๋กญ๊ฒ ์์ฑํด์ ์ ๋ฌํ๋ ๋ฐฉ์์ ์ฝ๋๊ฐ ์กด์ฌํ์ต๋๋ค. ์คํธ๋ฆผ์ด ์ค๊ฐ์์ ๋๊ธฐ๋ ์ด๋ฌํ ๋ฐฉ์์ ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง ๊ฒฝ์ฐ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์๊ณ , ํ๋ฆ์ด ์ค๊ฐ์ ์ ์ค๋ ๊ฐ๋ฅ์ฑ๋ ์๋ค๊ณ ํ๋จํ์ต๋๋ค.
์ด์ ํ๋์ ์คํธ๋ฆผ์ ํ๋ฒ๋ง ์๋น๋๋๋ก ์ ์ํ๋ฉฐ, ํ๋ฐฉํฅ์ผ๋ก ๋์ด์ง์ง ์๋ ํ๋ฆ์ด ์ ์ง๋๋๋ก ๋ฆฌํฉํ ๋ง ํ์ต๋๋ค.
ํ์ฌ ์ฝ๋์์๋ ์ฌ๊ณ ๊ฐ ๋ถ์กฑํ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ, ์ต์ ๋ฒ๋ธ์์ ์๋ฌ๊ฐ ๋ฐฉ์ถ๋์ด๋ ์คํธ๋ฆผ์ด ์ข
๋ฃ๋์ง ์๋๋ก retry
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์๋ฌ๊ฐ ๋ฐฉ์ถ ๋ ํ dipose
ํ๊ณ ๋ค์ subscribe
๊ฐ ํธ์ถ๋์ด์ ์คํธ๋ฆผ์ ๊ณ์ ์ด์ด๋๊ฐ ์ ์๋๋ก ๊ตฌํํ์ต๋๋ค.
EditViewModel์์ ๋ฐ์ธ๋ฉ์ ํ ๋์ stepperValue๋ ์ด๊ธฐ์ํ, ์ฆ 0์ด๊ธฐ ๋๋ฌธ์ ์ฌ๊ณ ๊ฐ์ 0์ด ์ ๋ฐ์ดํธ ๋๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋์ ์๋๋ฅผ ํ์ต๋๋ค.
- Output์ ํ์ฌ์ ์ฌ๊ณ ๊ฐ์ ๋ด๋ ๋์ ๋๋ฆฌ ํ์ ์ ํ๋กํผํฐ currentStock์ ์ถ๊ฐ
- transform์์ ํ์ฌ ์ฌ๊ณ ๊ฐ์ currentStock ํ๋กํผํฐ์ ๋ด์ Output์ ํตํด์ [Fruit: Double] ํํ๋ก ๋ทฐ์ ์ ๋ฌ
๋ค๋ง, ์์ ๊ฐ์ ๋ฐฉ์์ ๋ทฐ๋ชจ๋ธ์์ ์ต์ ๋ฒ๋ธ์ ์๋นํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ skip(1)
์คํผ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฒซ๋ฒ์งธ ์ด๋ฒคํธ๋ ๋ฌด์ํ๋๋ก ๊ตฌํํ์ฌ ํด๊ฒฐํ์ต๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๋๋ TDD์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ๊ฐ์ง ๊ธฐ๋ฅ๋ง์ ํ ์คํธํ๋ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์ญํ , ๊ธฐ๋ฅ ๋ถ๋ฆฌ๊ฐ ์์ํด์ง๋ค.
- Low Level์ ์ฝ๋๋ถํฐ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉฐ ๋ฐ์ํ๋ ๊ด๋ จ ๋ฉ์๋ ๋ฆฌํฉํ ๋ง ๋น์ฉ์ด ๊ฐ์ํ๋ค.
- ์ค์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ค์ํ ์ํฉ์ ํ ์คํธํด๋ณผ ์ ์๋ค.
- ๋๋ฒ๊น ์ด ์์ํ๋ค.
TDD์ ๋จ์ ์ผ๋ก๋ ๊ฐ๋ฐ ์์ ์๊ฐ์ด ์ฆ๊ฐํ๋ค ๋ผ๊ณ ์๊ณ ์๋๋ฐ, ํ๋ฆฌํฐ๋ณด๋ค ๋น ๋ฅธ ๊ฒฐ๊ณผ๋ฌผ์ด ํ์ํ ์ํฉ์ด๋ผ๋ฉด ์ ํฉํ์ง ์์ ์ ์๋ค๊ณ ๋๊ผ์ต๋๋ค.
ํ์ง๋ง ๋๋ฒ๊น
์ ์์๋๋ ์๊ฐ๊ณผ ๋
ธ๋ ฅ์ ๋จ์ถ์ํฌ ์ ์๋ค๋ ์ ์์, ๋๋ฒ๊น
์ ์์ฃผ ๋ง์ฃผ์น๋ ์ด๋ณด ๊ฐ๋ฐ์์ผ์๋ก ํ
์คํธ ์ฝ๋๋ฅผ ํตํด ์์
์ ํจ์จ์ ํฌ๊ฒ ์ฌ๋ฆด ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
์ฅ์
- ๋น์ฆ๋์ค ๋ก์ง์ ๋ทฐ๋ชจ๋ธ์ด ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ทฐ์ ์ฌ์ฌ์ฉ์ฑ์ด ์ข๋ค.
- ๋ทฐ์ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ถ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ํ ์คํธ์ ์ฉ์ดํ๋ค.
- ํ๋ฒ์ ๊ตฌ๋ ๊ณผ ๋ค์ํ ์คํผ๋ ์ดํฐ์ ์ฌ์ฉ์ผ๋ก ์ฝ๋๊ฐ ๊น๋ํด์ง๋ค.
๋จ์
- ์ต์ ๋ฒ๋ธ์ ํ๋ฆ์ด ํ๋ฒ์ ๋ณด์ด๊ธฐ ์ด๋ ค์ธ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ ์ ์ํด์ผํ๋ค.
๋น๋๊ธฐ ๋คํธ์ํน์ ํ๋ ์ฑ์์ ๋ ํ์คํ ์ฅ์ ์ ๋ฐํํ ์ ์๋ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ํต์ ์ด ์ฐ๊ฒฐ๋ ๋ค ๋์ด์ง๊ธฐ ์ ๊น์ง ํ๋ฆ์ ์ ์งํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ๊ฒ์ ์ ํฉํ ๋ฐฉ์์ผ ๊ฒ ๊ฐ์ต๋๋ค. ๋ํ ๋ค์ํ ์คํผ๋ ์ดํฐ๋ฅผ ์ ์ ํ ์ํฉ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ ๋ง์ ๊ณต๋ถ์ ๊ฒฝํ์ด ํ์ํ๋ค๊ณ ๋๊ผ์ต๋๋ค.