- Published on
๐ Swift - MVVM, Clean Architecture.01
- Authors
- Name
- ์ด์ฐฝ์ค
RxSwift๋ฅผ ๋ค๋ฃจ๊ฒ ๋๋ค ๋ณด๋ ๋ถ๊ฐํญ๋ ฅ์ ์ผ๋ก ๋์ ๊ณ์ ๋ณด์ด๋ MVVM ๊ตฌ์กฐ๋ผ๋ ๋์ด ์์ต๋๋ค. View Controller์ ์ญํ ์ด ๋๋ฌด ๋ฌด๊ฑฐ์์ง๊ณ ์๋ ๊ฒ์ ์ฒด๊ฐํ๋ ์ค์ด์ฌ์ ํ๋ก์ ํธ๊ฐ ๋ ์งํ๋๊ธฐ ์ ์ MVVM ๊ตฌ์กฐ๋ฅผ ์ ์ฉํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค.
์๋๋ AWS ์๋น์ค๋ค์ ์ฌ์ฉํด๋ณด๊ณ ์ ์์ํ๋ ํ๋ก์ ํธ์ธ๋ฐ ํ๋ค๋ณด๋ ์ด๊ฒ์ ๊ฒ ๋ง์ด ๊ฑด๋ค์ฌ๋ณด๊ฒ ๋๋ค์ ๐ง
MVVM
MVVM ๊ตฌ์กฐ๋ ์ฌ์ค ๊ตณ์ด RxSwift๊ฐ ์๋์ฌ๋ iOS ์ฑ๊ฐ๋ฐ์ ๊ณต๋ถํ๋ค๋ณด๋ฉด ์์ฃผ ๋ง์ฃผ์น๊ฒ ๋๋ ์ฉ์ด์ ๋๋ค. MVVM์ Model, View, View Model๋ก ์ฝ๋๋ฅผ ๊ตฌ๋ถํ๋ ๊ตฌ์กฐ์ ๋๋ค.
๊ทธ๋ฐ๋ฐ ๊ธฐ์กด์ MVC ๊ตฌ์กฐ์์ ๋ญ๊ฐ๊ฐ ๋ถํธํ์ผ๋๊น ์ด๋ฐ ์๋ก์ด ๊ตฌ์กฐ๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด๊ฒ ์ฃ ? MVC ๊ตฌ์กฐ๋ ์ดํดํ๊ธฐ ์๋นํ ์ฝ๊ณ ์ ํ๋ XCode์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ MVC๋ก ์ค์ ํด๋ ๋ฏ ํฉ๋๋ค. ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋ ํ์ผ์ ์ด๋ฆ์กฐ์ฐจ View Controller์ด๊ธฐ ๋๋ฌธ์ด์ฃ . ํ์ง๋ง MVC ๊ตฌ์กฐ๋ View Controller์๊ฒ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ ๋งก๊น๋๋ค. ์๋ฌด๋ฆฌ class๋ฅผ ๋ถ๋ฆฌํ๋๋ผ๋ ๊ฒฐ๊ตญ์๋ View Controller์์ ์ฐธ์กฐํ์ฌ ์ฌ์ฉํ๊ฒ ๋์ฃ .
MVVM ๊ตฌ์กฐ๋ View Controller๊ฐ ๋ ๋ฐ์ฐ๋ ๊ตฌ์กฐ๋ฅผ ์ธ๊ฐ์ง ๊ตฌ์กฐ๋ก ๋๋๋๋ค.
View & View Controller: ํ๋ฉด์ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋ด๋นํฉ๋๋ค.
View Model: ํ๋ฉด์ผ๋ก ์ ๋ฌ๋๋ ์ ๋ณด๋ค๊ณผ ๊ทธ์ ํ์ํ ๊ธฐ๋ฅ๋ค์ ๋ด๋นํฉ๋๋ค.
Model: ์ค์ง์ ์ธ ๋ฐ์ดํฐ๋ค์ ์ ์ฅ์ ๋ด๋นํฉ๋๋ค.
View Model์ Model์ ๋ฐ์ดํฐ๋ค์ ๊ณ์ํด์ Updateํด์ฃผ๊ณ , View Controller์๋ ํ๋ฉด์ ์ถ๋ ฅํ ์ ๋ณด๋ฅผ ๋ฟ๋ ค์ค๋๋ค.
View Controller๋ View๋ฅผ ๊ตฌ์ฑํด์ ํ๋ฉด์ ๊ตฌ์ฑํฉ๋๋ค.
์ด๋ ๊ฒ ํด์ ์ป๋ ์ด์ ์ด ๋ญ๋?! ํ์๋ฉด
์ด์ View Controller์ View์๋ ์ค์ง ํ๋ฉด ๊ตฌ์ฑ ์ฝ๋๋ง์ด ๋จ๊ฒจ์ง๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ค์ง์ ์ธ ๋์ ์ฝ๋๋ค์ ์ ๋ถ View Model์ ๋ค์ด๊ฐ๊ฒ ๋จ์ผ๋ก์ UI์ ๋ํ ์ ๊ทผ ์์ด๋ ์ด๋ฐ์ ๋ฐ ํ ์คํธ๋ ๊ธฐ๋ฅ ์์ ๋ฑ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ ๋๋ ํ์ผ์ ๋ค์ด๊ณ ์!
ํ์ง๋ง ๊ทธ๋ ๋ค๊ณ MVVM ๊ตฌ์กฐ๊ฐ ๋ง๋ฅ์ธ ๊ฒ์ ์๋๋๋ค..
๊ณ ํต๋ฐ๋ View Model
View Controller๋ ์ด์ ๋ฌด๊ฒ๋ฅผ ์ข ๋ ์ ์๊ฒ ๋์์ต๋๋ค. ํ์ง๋ง ๋ชจ๋ ์ ๋ฌด๋ฅผ ๋ ์๊ฒ ๋ View Modelโฆ ์ฌ์ค์ ๋ฌด๊ฒ๊ณ ๊ณ์ํด์ ์ถ๊ฐ๊ฐ ๋๋ ์ฝ๋๋ค์ ์ด View Model์ด ์ ๋ถ ๋งก๊ฒ ๋์์ต๋๋ค.
๊ทธ๋์ Clean-Architecture๋ก View Model์ ๊ธฐ๋ฅ๋ค๋ ์ชผ๊ฐ๋ด ์๋ค!
Clean Architecture
์ด ๊ทธ๋ํ ํ๋๋ก ๋ชจ๋ ๊ฒ์ ์ค๋ช ํ ์ ์์ต๋๋ค.
- ์ข ์์ฑ์ ์์ชฝ์ผ๋ก๋ง ํฅํ ์ ์๋ค.
- ์์ชฝ์ ์์๋ ๋ฐ๊นฅ์ชฝ ์์์ ๋ํด ์๋ฌด๊ฒ๋ ์ ์ ์๋ค.
- ๋ฐ๊นฅ์ชฝ์์ ์ฌ์ฉ๋ ์ด๋ฆ๋ค์ ์์ชฝ์์ ์ฌ์ฉํ ์ ์๋ค. (๋ณ์, ํจ์, ํด๋์ค ๋ฑ)
์ฌ์ค ์ธ๊ฐ์ง ๋ชจ๋ ๋์ผํ ๋ง์ ํ๊ณ ์์ต๋๋ค. ๋ฐ๊นฅ์ชฝ ์์๋ค์ ์ด๋ค ์ผ์ด ์์ด๋ ์ ๋๋ก ์์ชฝ ์์๋ค๋ก๋ถํฐ์ ์ํฅ์ ๋ฐ์ง ์๋๋ก ํ๋ค๋ ๊ฒ์ด์ฃ .
์ ์ด์ ๊ฐ ๋จ๊ณ๋ณ๋ก ์ด๋ค ์์๋ค์ด ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค.
Entities (Model)
์ด ์์ ์๋ ์์๋ค์ ํน์ง์ ๊ฑฐ์ ๋ณ๊ฒฝ๋ ์ผ์ด ์๋ค๋ ์ ์ ๋๋ค. ์๋ฅผ ๋ค๋ฉด DB์ ๊ตฌ์กฐ..๊ฐ์ ๊ฒ์ด ์๊ฒ ์ฃ ? ๊ทธ๋์ MVC ๋ชจ๋ธ์์ Model๋ก ์ฐ๋ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ ํ์ผ ๋ฑ์ด ์ฌ๊ธฐ์ ์ํฉ๋๋ค.
struct Film {
let id: Int
let name: String
let plot: String?
let image: String?
}
์์ ๊ฐ์ด Film์ด๋ผ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์์ ํ ์๋ก์ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐ/์์ ํ ๊ฒ์ด ์๋๋ผ๋ฉด ๊ฑฐ์ ๊ฑด๋๋ฆด ์ผ์ด ์๋ ์ฝ๋์ ๋๋ค. ์ํ ์ ๋ณด์ฑ์ ๊ธฐ๋ฅ์ด ์๋ฌด๋ฆฌ ๋ฐ๋๋๋ผ๋ ์ํ ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ง ์์ ์ผ์ ์๊ฒ ์ฃ ?
Use Cases
Use Cases๋ ์ฌ์ฉ์๊ฐ ์ง์ โ์ฌ์ฉโํ๋ ์ฑ์ ๋์๊ณผ ์๋๋ฆฌ์ค๋ค์ด๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ์ฒ์ ๋ณด๋ ์ ์๊ฒ๋ ๊ฐ์ฅ ์ดํดํ๊ธฐ ํ๋ค์๋ ๋ถ๋ถ์ ๋๋ค. ์ด๋ฒ์๋ ์ฝ๊ฒ ์์ ์์๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ํ ์ ๋ณด์ฑ์ ์ผ๊ณ ์ฌ์ฉ์๋ ์ด๋ค ํ๋์ ํ ๊น์? ๊ฒ์์ ํ๋, ์ถ์ฒ ์ ๋ณด๋ฅผ ๋ณด๋ ์ํ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ์ผ์ข ์ ๋ฒํผ์ ํด๋ฆญํ๊ฒ ์ฃ ? ์ด ์๋๋ฆฌ์ค๊ฐ ๋ฐ๋ก Use Case์ ๋๋ค.
var isLoginAccepted = BehaviorSubject(value: false)
func loadFilmInfo() {}
func updateFilmInfo() {}
func notifyReceived() {}
๋ณดํต ์์ ๊ฐ์ด ํํ๋ฉ๋๋ค. ์ ์ ์ ํ๋, ์ํ์ ๋ณํ ๋ฑ์ผ๋ก ์ธํด ์ด๋ค ์ถ๋ ฅ๊ฐ์ ๋ณํ๊ฐ ํ์ํ ๋ Use Cases๊ฐ ์ถ๋ํ์ฌ ํด๊ฒฐํด์ค๋ค ๊ณ ๋ณผ ์ ์์ต๋๋ค.
Interface Adapters
์ด ๋ถ๋ถ์ Presentation Layer๋ผ๊ณ ๋ถ๋ฅด๋ ์ฌ๋๋ค๋ ๋ง์ต๋๋ค. ์ด๋์ชฝ์ด๋ ์ด๋ฆ์์ ํ๋ฉด์ ๊ตฌ์ฑ๊ณผ ๊ด๋ จ์ด ์์ ๊ฒ ๊ฐ๋ค๋ ๋๋์ด ๋ค์ฃ ?
MVVM ๋ชจ๋ธ์ View Model์ด ๋ณดํต ์ด ๊ตฌ์ญ์ ํด๋น๋ฉ๋๋ค. Clean Architecture๋ฅผ ์ ์ฉํ MVVM ๊ตฌ์กฐ์์ View Model์ ์ค์ง ํ๋ฉด์ ์ถ๋ ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ต์ข ์ ์ผ๋ก ๊ฐ๊ณตํ๋ ์ญํ ๋ง ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
func setTimestampFormat() {}
func setFilmGradeFormat() {}
๊ทธ๋์ ๋ณดํต ์์ ๊ฐ์ด Use Cases์ output์ผ๋ก ์ป์ ์ ๋ณด๋ฅผ ์ฌ์ฉ์๊ฐ ๋ณด๊ธฐ ์ฝ๊ฒ ๊ฐ๊ณตํ๋ ๋ฐฉ์์ผ๋ก ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
20220323 โก๏ธ 2022๋ 3์ 23์ผ
์ฒ๋ผ์.
Frameworkds & Drivers
์ด ๋ถ๋ถ์ ์ต์ธ๊ณฝ์ธ ๋งํผ ๊ฐ์ฅ ํ๋ฐํ๊ฒ ๋ณํ์ด ์ด๋ฃจ์ด์ง๋๋ค. ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ผ๋ก ์ํธ์์ฉํ๋ UI๋ DB ์ธ์๋ Framework๋ฑ๋ ์ฌ๊ธฐ์ ํฌํจ๋ฉ๋๋ค.