์๋ ํ์ธ์ Foma ์ ๋๋ค!
์ค๋ ์์๋ณผ ์ฃผ์ ๋ ํํ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋์์ธ ํจํด์ธ Model - View -Controller ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฐ๋ก ์์ํ ๊ฒ์!
MVC ํจํด์ด๋?
"MVC๋ ์ํํธ์จ์ด ๊ณตํ์์ ์ฌ์ฉ๋๋ ์ํํธ์จ์ด ๋์์ธ ํจํด์ด๋ค. ์ด ํจํด์ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ฉํ๋ฉด, ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ก๋ถํฐ ๋น์ฆ๋์ค ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐ์ ์์๋ ๊ทธ ์ด๋ฉด์์ ์คํ๋๋ ๋น์ฆ๋์ค ๋ก์ง์ ์๋ก ์ํฅ ์์ด ์ฝ๊ฒ ๊ณ ์น ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ค. MVC์์ ๋ชจ๋ธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ด๋ฉฐ, ๋ทฐ๋ ํ ์คํธ, ์ฒดํฌ๋ฐ์ค ํญ๋ชฉ ๋ฑ๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์์๋ฅผ ๋ํ๋ด๊ณ , ์ปจํธ๋กค๋ฌ๋ ๋ฐ์ดํฐ์ ๋น์ฆ๋์ค ๋ก์ง ์ฌ์ด์ ์ํธ๋์์ ๊ด๋ฆฌํ๋ค." - ์ํค ๋ฐฑ๊ณผ-
์ฅ์
๋ค๋ฅธ ํจํด์ ๋นํด ๊ตฌ์กฐ๋ฅผ ๋น๊ต์ ์ฝ๊ฒ ์ค๊ณํ ์ ์์ด
๊ท๋ชจ๊ฐ ์์ ํ๋ก์ ํธ ์งํ ์ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
๋ํ ๋ณดํต ๊ฐ๋ฐ์์๊ฒ ์น์ํ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ํ์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋จ์
๋ชจ๋ธ์ ๋ทฐ์ ์ธํฐ๋์ ์ ๋ฐ๋ผ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๊ณ ๋ทฐ๋ ๋ชจ๋ธ์ ๋ฐ๋ ๋ฐ์ดํฐ์ ์ํด ์ ๋ฐ์ดํธ ๋๊ธฐ ๋๋ฌธ์
์๋ก ์๋ฒฝํ ๋ถ๋ฆฌ๊ฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
ํนํ iOS์ ๊ฒฝ์ฐ View์ ๋ผ์ดํ ์ฌ์ดํด์ Controller์์ ๊ด๋ฆฌํ์ฌ ๊ฐํ๊ฒ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค.
๊ณ ๋ก ๋ทฐ์ปจํธ๋กค๋ฌ๊ฐ ๋ทฐ์์ ํ๋ ์ญํ ๊ณผ ์ปจํธ๋กค๋ฌ์์ ํ๋ ์ญํ ์ ๋ชจ๋ ๋ค ์ํํ๊ฒ ๋์ด ๋ทฐ์ปจํธ๋กค๋ฌ ๋ด ์ฝ๋๊ฐ
๋ณต์กํด์ง๊ณ ์ด๋ ์ ์ง๋ณด์์ ์ด๋ ค์์ ๊ฐ์ ธ์จ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
View
๋ทฐ๋ ์ฌ์ฉ์์ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ ํ๋ฉด์ ์ถ๋ ฅํ๋ ์ญํ ์ ํฉ๋๋ค.
์ด๋ฏธ์ง,ํ ์คํธ,ํ ์คํธํ๋,๋ฒํผ ๋ฑ์ด ๋ชจ๋ ํฌํจ๋๋ฉฐ ์ฌ์ฉ์์ ํฐ์น๋ ๋๋๊ทธ ๋ฑ ์ธํฐ๋์ ์ ์ปจํธ๋กค๋ฌ์
์ ๋ฌํ๊ณ ์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ์ ํ๋ฉด์ ์ ๋ฐ์ดํธ ํฉ๋๋ค.
์๋์ ์์ ํ๋ฉด์ผ๋ก ์ค๋ช ํ๋ฉด ์ด์ ๋ฒํผ๊ณผ ๋ค์ ๋ฒํผ์ด ๋๋ฆฐ ๊ฒ์ ์ปจํธ๋กค๋ฌ์๊ฒ ์๋ ค์ฃผ๊ณ
์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ๋ฐ์ ์บ๋ฆญํฐ ๋ชจ๋ธ์ ํ๋ฉด์ ์ถ๋ ฅํ๋ ์ญํ ์ ํฉ๋๋ค.
์ฝ๋๋ก ์์ฑํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
ํ๋ฉด์ ๊ตฌ์ฑํ๊ณ ์๋ ์์๋ค๊ณผ ๋ทฐ๊ฐ ์ ๋ฐ์ดํธ ๋๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
import UIKit
class CharacterView: UIView {
//ํ๋ฉด์ ๊ตฌ์ฑํ๊ณ ์๋ ์์๋ค
@IBOutlet weak var image:UIImageView! //์ด๋ฏธ์ง
@IBOutlet weak var gender:UILabel! //์ฑ๋ณ
@IBOutlet weak var name:UILabel! //์ด๋ฆ
@IBOutlet weak var country:UILabel! //๊ตญ๊ฐ
@IBOutlet weak var nextButton:UIButton! //๋ค์ ๋ฒํผ
@IBOutlet weak var previousButton:UIButton! //์ด์ ๋ฒํผ
//์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ๋ฐ์ ์บ๋ฆญํฐ๋ก ์
๋ฐ์ดํธ ํจ.
func updateView(character:Character) {
self.image.image = character.image
self.gender.text = character.gender
self.name.text = character.name
self.country.text = character.country
}
}
Model
๋ชจ๋ธ์ ๋ทฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ญํ ์ ํฉ๋๋ค.
์ด๋ฏธ์ง๊ฐ ์ด๋ค ์ด๋ฏธ์ง์ธ์ง, ํฌ๊ธฐ, ํ ์คํธ ์์ฒด, ํฐํธ, ๊ตต๊ธฐ ๋ฑ ํ๋ฉด์ ๊ตฌ์ฑํ๊ณ ์๋
๋ชจ๋ ์์๋ฅผ ํฌํจํ๊ณ ์์ต๋๋ค.
๋ทฐ์์ ์ฌ์ฉ์์ ์ธํฐ๋์ ์ด ๋ฐ์ํ๋ฉด ๋ชจ๋ธ์ ์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ์ธํฐ๋์ ์ ๋ง๋ ๋ฐ์ดํฐ๋ก ์ ๋ฐ์ดํธ ํ๋ผ๊ณ ์ง์๋ฅผ ๋ฐ์ต๋๋ค.
๋ชจ๋ธ์ ์๋ง์ ๋ฐ์ดํฐ๋ก ์ ๋ฐ์ดํธํ๊ณ ์ปจํธ๋กค๋ฌ์๊ฒ ์๋ ค์ค๋๋ค.
์์ ํ๋ฉด์ ์๋์ ๊ฐ์ต๋๋ค.
์ฝ๋๋ก ์ค๋ช ํ๋ฉด ์๋์ ๊ฐ์ด ์บ๋ฆญํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ์ดํฐ์ ์ด๊ธฐํํ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
import UIKit
struct Character {
//ํ๋ฉด์ ๊ตฌ์ฑํ ๋ฐ์ดํฐ
let image:UIImage
let name:String
let gender:String
let country:String
//์ด๊ธฐํ
init(name:String,image:UIImage,gender:String,country:String,previousButtonText:String,nextButtonText:String) {
self.name = name
self.image = image
self.gender = gender
self.country = country
}
}
Controller
์ปจํธ๋กค๋ฌ๋ ๋ทฐ์ ๋ชจ๋ธ์ ๋ค๋ฆฌ ์ญํ ์ ํ๋ฉฐ
๋ทฐ๋ก๋ถํฐ ์ฌ์ฉ์์ ์ธํฐ๋์ ์ ๋ฐ์ ๋ชจ๋ธ์ ์ ๋ฌํ๊ณ
๋ฐ๋ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ทฐ์ ๋ค์ ์ ๋ฌํ์ฌ ์ ๋ฐ์ดํธ ํ๋๋ก ํฉ๋๋ค.
์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
import UIKit
class CharacterController: UIViewController {
//์ ์ฒด ๋ชจ๋ธ ๋ฐ์ดํฐ
let characters:[Character] = [
Character(name:"์คํฐ์ง๋ฐฅ",image: #imageLiteral(resourceName: "แแ
ณแแ
ฉแซแแ
ตแแ
กแธ"), gender: "๋จ์", country:"๋ฏธ๊ตญ"),
Character(name:"๋ฑ์ด",image: #imageLiteral(resourceName: "แแ
ฎแผแแ
ต"), gender: "๋จ์", country:"๋ฏธ๊ตญ"),
Character(name:"์ง์ง์ด",image: #imageLiteral(resourceName: "แแ
ตแผแแ
ตแผแแ
ต"), gender: "๋จ์", country:"๋ฏธ๊ตญ"),
Character(name:"ํ๋ญํฌํค",image: #imageLiteral(resourceName: "แแ
ณแฏแ
แ
กแผแแ
ณแแ
ฉแซ"), gender: "๋จ์", country:"๋ฏธ๊ตญ"),
Character(name:"ํํ์ฌ์ฌ",image: #imageLiteral(resourceName: "แแ
ฉแผแแ
ฉแผแแ
ฎแแ
ตแซ"), gender: "์ฌ์", country:"๋ฏธ๊ตญ")
]
//์บ๋ฆญํฐ๋ทฐ
@IBOutlet weak var characterView: CharacterView!
//ํ์ฌ ์ธ๋ฑ์ค
var index:Int = 0
//ํ์ฌ ๋ชจ๋ธ ๋ฐ์ดํฐ
var character:Character!
override func viewDidLoad() {
super.viewDidLoad()
configure()
notifyFromView()
}
//๋ชจ๋ธ๊ณผ ๋ทฐ ์ด๊ธฐํ
func configure() {
character = characters[index]
updateView()
}
//๋ทฐ๋ก๋ถํฐ ์ด์ ๋ฒํผ๊ณผ ๋ค์๋ฒํผ์ ์ธํฐ๋์
์ ์ ๋ฌ๋ฐ์
func notifyFromView() {
characterView.nextButton.addTarget(self, action: #selector(nextButtonTapped(_:)), for: .touchUpInside)
characterView.previousButton.addTarget(self, action: #selector(previousButtonTapped(_:)), for: .touchUpInside)
}
//๋ค์๋ฒํผ์ด ๋๋ ธ๋ค๋ฉด
@objc func nextButtonTapped(_ sender: UIButton) {
//๋ค์ ์ธ๋ฑ์ค๋ก ๋ณ๊ฒฝ
if index < 4 {
index += 1
}
//๋ทฐ ์
๋ฐ์ดํธ
updateView()
}
//์ด์ ๋ฒํผ์ด ๋๋ ธ๋ค๋ฉด
@objc func previousButtonTapped(_ sender: UIButton) {
//์ด์ ์ธ๋ฑ์ค๋ก ๋ณ๊ฒฝ
if index > 0 {
index -= 1
}
//๋ทฐ ์
๋ฐ์ดํธ
updateView()
}
//๋ทฐ๋ฅผ ์
๋ฐ์ดํธํ๋ผ๊ณ ์ง์
@objc func updateView() {
//์บ๋ฆญํฐ ๋ทฐ์ ์บ๋ฆญํฐ๋ฅผ ํ์ฌ ์บ๋ฆญํฐ๋ก ๋ฐ๊ฟ.
characterView.updateView(character: characters[index])
}
}
์๋์ ๊ฐ์ด ๋ทฐ์์ ๋ฐ์ ์ฌ์ฉ์ ์ธํฐ๋์ ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๊ณ ๋ฐ๋ ๋ฐ์ดํฐ์ ๋ฐ๋ผ์
๋ทฐ๊ฐ ์ ๋ฐ์ดํธ ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
'๐ iOS > Architecture' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Design Pattern] RIBs๋?(feat. Uber) (0) | 2021.08.18 |
---|---|
[Design Pattern] MVP ํจํด์ด๋? (0) | 2021.08.11 |
[Design Pattern] ReactorKit์ด๋? (0) | 2021.06.17 |
[Design Pattern] Apple์ MVC ํจํด์ด๋? (0) | 2021.06.03 |
[iOS ๋ฉด์ ์ง๋ฌธ] ์ฑ๊ธํค ํจํด์ด๋? (Swift Singleton Pattern) (0) | 2020.12.11 |
๋๊ธ