λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS/UIKit

[iOS] MVC νŒ¨ν„΄ (Model - View - Controller)

by Danna 2021. 6. 18.
728x90
728x90

λ””μžμΈνŒ¨ν„΄ 쀑 μ•± κ°œλ°œμ— μ μš©λ˜λŠ” MVC(Model-View-Controller) νŒ¨ν„΄μ— λŒ€ν•΄ μ •λ¦¬ν•΄λ³΄μž!


 

iOS μ•± ν”„λ‘œκ·Έλž˜λ°

λΆ€μŠ€νŠΈμ½”μŠ€ 무료 κ°•μ˜

www.boostcourse.org

 

1μž₯μ—μ„œ μŒμ•…μž¬μƒ 앱을 λ§Œλ“€λ©΄μ„œ μ•„λž˜μ˜ λ‚΄μš©λ“€μ„ ν•™μŠ΅ν–ˆμŠ΅λ‹ˆλ‹€.

 

  • 에셋(Asset) - μ•± μ•„μ΄μ½˜, 이미지 파일, 데이터 νŒŒμΌμ„ 관리, μ•± μ‹€ν–‰μ‹œ νŒŒμΌμ— μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ 도와쀀닀.
  • μ•± μ‹œλ‹(App thinning)κ³Ό μ•± μŠ¬λΌμ΄μ‹±(App slicing) - λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€μ—μ„œ λΉ λ₯΄κ²Œ λ‹€μš΄λ‘œλ“œν•  수 μžˆλ„λ‘ ν•˜λŠ” μ΅œμ ν™” 기술 
  • Cocoa Touch, UIKit, Foundation - iOS μ•± κ°œλ°œμ— ν•„μš”ν•œ ν”„λ ˆμž„μ›Œν¬ 
  • Autolayout μ„ μ μš©ν•˜λ©° UIλ₯Ό κ°œλ°œν•˜λŠ” λ²• - μΈν„°νŽ˜μ΄μŠ€ λΉŒλ” vs μ½”λ“œλ‘œ μž‘μ„±
  • iOS의 View 체계 - λ·° 계측, 뷰의 μ’Œν‘œ, ν”„λ ˆμž„ vs λ°”μš΄λ“œ, λ·° 계측 디버깅 툴
  • λ””μžμΈ νŒ¨ν„΄κ³Ό MVC νŒ¨ν„΄ - μ‹±κΈ€ν„΄ νŒ¨ν„΄κ³Ό μ•±κ°œλ°œμ—μ„œμ˜ MVC νŒ¨ν„΄μ„ μ€‘μ μ μœΌλ‘œ
  • AVAudioPlayer, Timer - μŒμ•… νŒŒμΌμ„ μž¬μƒν•˜κΈ° μœ„ν•œ AVAudioPlayer, μ‹œκ°„μ΄ˆλ₯Ό 재기 μœ„ν•œ Timer

πŸ’‘ MVC νŒ¨ν„΄

MVC νŒ¨ν„΄μ€ iOS μ•± κ°œλ°œμ— μ μš©λ˜λŠ” λ””μžμΈ νŒ¨ν„΄μœΌλ‘œ Model, View, Controller 둜 κ΅¬λΆ„ν•˜μ—¬ κ°œλ°œν•˜λŠ” 것이닀. κ°„λ‹¨ν•˜κ²Œ, Model 은 데이터, View λŠ” μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ§€λŠ” ν™”λ©΄, Controller λŠ” View 와 Model 을 κ΄€λ¦¬ν•˜λŠ” μ€‘μž¬μžμ΄λ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 객체듀을 생성할 λ•Œ, 각각의 역할을 λͺ…ν™•νžˆ μ΄ν•΄ν•˜κ³  할일을 μ μ ˆν•˜κ²Œ ꡬ뢄해 Model, View, Controller 쀑 ν•˜λ‚˜λ‘œ ν• λ‹Ήν•΄μ•Όν•œλ‹€. κ·Έλž˜μ•Όλ§Œ 뷰의 μž¬μ‚¬μš©μ„±μ„ 높이고 μ˜¬λ°”λ₯Έ 데이터 흐름을 λ§Œλ“€ 수 μžˆλ‹€.

 

* MVC νŒ¨ν„΄μ—μ„œλŠ” μ»¨νŠΈλ‘€λŸ¬κ°€ View, Model λ‘˜ λ‹€ μ»¨νŠΈλ‘€ν•˜κΈ° λ•Œλ¬Έμ— ν•  일이 많고 μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ–΄λ ΅λ‹€κ³  ν•œλ‹€. 이λ₯Ό κ°œμ„ ν•˜κΈ° μœ„ν•œ MVVM νŒ¨ν„΄ 등도 ν•™μŠ΅ν•  μ˜ˆμ •μ΄λ‹€!

MVC νŒ¨ν„΄ [좜처: μ• ν”Œκ³΅μ‹λ¬Έμ„œ]

 

βœ”οΈŽ Model 객체

  • μ•±μ—μ„œ μ΄μš©λ˜λŠ” 데이터λ₯Ό μΊ‘μŠν™”ν•˜λŠ” 것이 μ£Ό λͺ©μ μœΌλ‘œ 데이터λ₯Ό μ‘°μž‘, μ²˜λ¦¬ν•˜λŠ” λ‘œμ§λ„ ν¬ν•¨λœλ‹€.
  • Model κ°μ²΄λŠ” μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€μ™€ κ΄€λ ¨λœ View 객체에 λͺ…μ‹œμ μœΌλ‘œ μ—°κ²°λ˜λ©΄ μ•ˆλœλ‹€.
  • Model κ°μ²΄λŠ” Controller μ—κ²Œ 데이터가 μˆ˜μ •λ¨μ„ μ•Œλ¦¬κ³ , Controller 에 μ˜ν•΄ 데이터λ₯Ό μˆ˜μ •ν•œλ‹€.
  • λͺ¨λΈ μ˜ˆμ‹œ) μœ μ €μ˜ 정보, μœ μ €μ˜ μ‡Όν•‘ μ°œν•˜κΈ° λͺ©λ‘, μ£Όμ†Œλ‘μ˜ μ—°λ½μ²˜
  • κ΅¬ν˜„ μ˜ˆμ‹œ) μ„œλ²„μ˜ JSON 데이터와 μ—°κ²° -> Codable ν”„λ‘œν† μ½œμ„ μ€€μˆ˜ν•œ λͺ¨λΈ ꡬ쑰체λ₯Ό 생성

 

βœ”οΈŽ View 객체

  • μ•±μ—μ„œ λ³΄μ—¬μ§€λŠ” ν™”λ©΄μ˜ 객체듀을 View 객체라고 ν•˜λ©°, μ‚¬μš©μž λ™μž‘μ— 응닡할 수 μžˆλ‹€.
  • Model 객체의 데이터λ₯Ό 보여주고 데이터λ₯Ό νŽΈμ§‘ν•  수 μžˆλ„λ‘ ν•˜λŠ” 것이 μ£Ό λͺ©μ μ΄λ‹€.
  • View κ°μ²΄λŠ” μ‚¬μš©μž μ•‘μ…˜μ„ Controller μ—κ²Œ μ „λ‹¬ν•˜κ³ , Controller 에 μ˜ν•΄ View λ₯Ό μ—…λ°μ΄νŠΈν•œλ‹€.

 

βœ”οΈŽ Controller 객체

  • View 객체와 Model 객체 μ‚¬μ΄μ—μ„œ μ€‘κ°œμž 역할을 ν•œλ‹€.
  • View κ°μ²΄μ—μ„œ 이뀄진 μ‚¬μš©μž μ•‘μ…˜μ„ 전달받아, μƒˆλ‘­κ²Œ μƒμ„±λ˜κ±°λ‚˜ λ³€κ²½λ˜λŠ” 데이터λ₯Ό Model κ°μ²΄μ—κ²Œ μ „λ‹¬ν•œλ‹€.
  • λ°˜λŒ€λ‘œ, Model 객체의 데이터가 λ³€κ²½λ˜μ—ˆμ„ λ•Œ 이λ₯Ό 전달받아, View κ°μ²΄μ—κ²Œ μ „λ‹¬ν•˜κΈ°λ„ ν•œλ‹€.
  • Controller κ°μ²΄λŠ” λ‹€λ₯Έ 객체의 생애주기(Life cycle) 을 κ΄€λ¦¬ν•˜κΈ°λ„ ν•œλ‹€.

 

πŸ‘€ μ½”μ½”μ•„ ν„°μΉ˜ ν”„λ ˆμž„μ›Œν¬μ—μ„œμ˜ 두 가지 컨트둀러

 

μ½”μ½”μ•„ ν„°μΉ˜ ν”„λ ˆμž„μ›Œν¬λŠ” μ½”λ””λ„€μ΄νŒ… 컨트둀러, λ·° 컨트둀러 두 가지 μœ ν˜•μ„ μ œκ³΅ν•œλ‹€. iOS μ•±μ—μ„œλŠ” λ·° μ»¨νŠΈλ‘€λŸ¬κ°€ μ½”λ””λ„€μ΄νŒ… 컨트둀러의 역할을 κ²Έν•˜λŠ” κ²½μš°κ°€ λ§Žλ‹€.

 

βœ”οΈŽ μ½”λ””λ„€μ΄νŒ… 컨트둀러 (Coordinating Controller)

 

μ•±μ˜ 전체 ν˜Ήμ€ 일뢀 κΈ°λŠ₯을 관리 κ°λ…ν•œλ‹€. μ•±λ³„λ‘œ λ‹€λ₯Έ 둜직이 μ£Όμž…λ˜λŠ” μž₯μ†Œμ΄λ‹€.

 

  • Delegation 메세지에 μ‘λ‹΅ν•˜κ±°λ‚˜ μ•Œλ¦Όμ„ κ΄€λ¦¬ν•œλ‹€.
  • μ‚¬μš©μžμ˜ λ²„νŠΌ 클릭 등에 따라 μ „μ†‘λ˜λŠ” λ™μž‘ 메세지에 μ‘λ‹΅ν•œλ‹€.
  • 앱을 μ‹œμž‘ν•˜λŠ” 경우 객체 κ°„ 연결을 ν™•λ¦½ν•˜κ±°λ‚˜ μ„€μ • μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.
  • μ†Œμœ ν•œ 객체의 생λͺ… μ£ΌκΈ°λ₯Ό κ΄€λ¦¬ν•œλ‹€.

 

βœ”οΈŽ λ·° 컨트둀러 (View Controller)

 

UIKit ν”„λ ˆμž„μ›Œν¬μ—μ„œ View Controller λŠ” UIViewController 의 μ„œλΈŒν΄λž˜μŠ€μ΄λ©°, λ·° 컨트둀러의 역할을 λ‹€μŒκ³Ό κ°™λ‹€.

 

  • μ½˜ν…μΈ λ₯Ό 화면에 ν‘œμ‹œν•˜λŠ” λ·°λ₯Ό κ΄€λ¦¬ν•˜κ³ , ν•΄λ‹Ή 뷰에 λŒ€ν•œ μ°Έμ‘°λ₯Ό μœ μ§€ν•œλ‹€.
  • λ·°λ₯Ό λ³΄μ—¬μ£ΌλŠ” 것과 후속 뷰둜의 μ „ν™˜μ„ κ΄€λ¦¬ν•œλ‹€.
  • Modal View λ₯Ό ν‘œμ‹œν•˜κ³ , 기기의 λ°©ν–₯이 λ°”λ€” λ•Œ λ·°λ₯Ό νšŒμ „ν•œλ‹€.
  • λ©”λͺ¨λ¦¬ λΆ€μ‘± 경고에 μ‘λ‹΅ν•œλ‹€.

* UIKit ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” UITableViewController 와 같이 UIViewController λ₯Ό 상속받은 νŠΉμ • λͺ©μ μ˜ μ„œλΈŒ 클래슀λ₯Ό μ œκ³΅ν•œλ‹€.

* λ·° μ»¨νŠΈλ‘€λŸ¬λŠ” μ—¬λŸ¬ ν”„λ ˆμž„μ›Œν¬ 객체에 λŒ€ν•œ Delegate, Data source 객체인 κ²½μš°κ°€ λ§Žλ‹€.


πŸ€” ν”„λ‘œμ νŠΈ A. MusicPlayer μ•±μ—μ„œ MVC νŒ¨ν„΄ 찾아보기

- Model :: μŒμ•… μž¬μƒ 파일 (sound)

ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ—μ„œλŠ” νŠΉμ • λͺ¨λΈ 클래슀λ₯Ό μ°Ύμ•„λ³΄κΈ°λŠ” μ–΄λ ΅λ‹€..! asset 에 μ €μž₯λ˜μ–΄μžˆλŠ” μŒμ•… νŒŒμΌμ„ λͺ¨λΈλ‘œ 보면 λœλ‹€.

 

-  View :: μΈν„°νŽ˜μ΄μŠ€ λΉŒλ”(Storyboard) ν˜Ήμ€ μ½”λ“œλ‘œ λ§Œλ“  화면에 μžˆλŠ” UI 객체듀

View 에 λ°°μΉ˜ν–ˆλ˜ UIButton, UILabel, UISlider 객체듀.. 맨 밑에 κΉ”λ¦° View λŠ” View Controller 에 μ†ν•œ 뷰이닀. 

 

- Controller :: Model κ³Ό View 의 μ€‘κ°œμž μ—­ν•  (μ½”λ“œμ˜ λŒ€λΆ€λΆ„)

  • View -> Controller
    λ·°μ—μ„œ λ²„νŠΌ 클릭, μŠ¬λΌμ΄λ” κ°’ μ‘°μ • λ“±μ˜ μ‚¬μš©μž μ•‘μ…˜(이벀트)이 λ°œμƒ -> λ·°μ—μ„œ 컨트둀러둜 User action 을 μ „λ‹¬ν•œλ‹€.
  • Controller -> View
    μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ View ν˜Ήμ€ Model 을 μ—…λ°μ΄νŠΈ μ·¨ν•  λ©”μ„œλ“œ(IBAction)λ₯Ό κ΅¬ν˜„ν•΄λ†“κ³ , View μ—μ„œ 전달받은 User action 에 맞게 λ™μž‘μ„ μˆ˜ν–‰ -> View μ—…λ°μ΄νŠΈ μš”μ†Œκ°€ μžˆλ‹€λ©΄ μ „λ‹¬ν•œλ‹€.
  • Controller -> Model
    νŒŒμΌμ„ λΆˆλŸ¬μ˜€κ±°λ‚˜, 데이터 μ—μ…‹μ—μ„œ λ―Έλ””μ–΄λ₯Ό λΆˆλŸ¬μ˜¨λ‹€. 
  • Model -> Controller
    μš”μ²­ν•œ 데이터λ₯Ό 전달해쀀닀. (μ‹œκ°„μ— λ§žλŠ” μŒμ•… .. ?)

 


더 μ•Œμ•„λ³΄κΈ°

728x90
728x90