✏️ TIL

[ TIL ] μ•„ν‚€ν…μ²˜(Architecture)와 λ””μžμΈ νŒ¨ν„΄ / 24λ…„ 4μ›” 30일

EarthSea 2024. 4. 30. 20:28

좜처 : ν•€ν„°λ ˆμŠ€νŠΈ

μ˜€λŠ˜μ€ μ•„ν‚€ν…μ²˜μ™€ λ””μžμΈνŒ¨ν„΄μ— λŒ€ν•΄μ„œ ν•™μŠ΅ν•΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

ν‰μ†Œμ— μ•„ν‚€ν…μ²˜μ™€ λ””μžμΈνŒ¨ν„΄ μš©μ–΄μ— λŒ€ν•œ λͺ…ν™•ν•œ κ°œλ…μ΄ μž‘ν˜€μžˆμ§€ μ•Šμ•˜λ˜ κ±° 같은데,

였늘 λΉ„λ‘œμ†Œ 두 κ°€μ§€μ˜ κ°œλ…μ„ λͺ…ν™•νžˆ μ΄ν•΄ν•˜λ©΄μ„œ ꡬ뢄할 수 있게 λ˜μ—ˆμ–΄μš”!✨

 

 

μ•„ν‚€ν…μ²˜

μ œκ°€ μ΄ν•΄ν•œ μ•„ν‚€ν…μ²˜λŠ” μ‹œμŠ€ν…œμ˜ 전체적인 ꡬ쑰(λͺ¨μŠ΅)λ₯Ό μ •ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ„€κ³„ν•˜λŠ” λ‹¨κ³„μ—μ„œ μ‹œμŠ€ν…œ μ•ˆμ˜ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ μ–΄λ–€ μ‹μœΌλ‘œ μƒν˜Έμž‘μš©ν•˜κ³  μœ„μΉ˜ν•  것인지, 데이터 흐름은 μ–΄λ–»κ²Œ 이루어져 μžˆμ„ 것인지λ₯Ό μ •ν•  λ•Œ 지침이 λ˜λŠ” 것 κ°™μ•„μš”. μ—¬κΈ°μ„œ 더 λ‚˜μ•„κ°€ μ‹œμŠ€ν…œμ˜ κΈ°λŠ₯μ΄λ‚˜ μ„±λŠ₯, λ³΄μ•ˆ, ν™•μž₯μ„±, μœ μ§€λ³΄μˆ˜μ„±κ³Ό 같은 ν•΄κ²°μ±…κΉŒμ§€ μ œκ³΅ν•΄ 쀄 수 μžˆλ‹€κ³  ν•©λ‹ˆλ‹€.

 

μ €λŠ” μ΄λ•ŒκΉŒμ§€ MVCνŒ¨ν„΄μ˜ μ•„ν‚€ν…μ²˜λ₯Ό 주둜 μ‚¬μš©ν•΄μ„œ 앱을 κ°œλ°œν•΄ μ™”λ˜ 것 κ°™μ•„μš”! μ˜€λŠ˜μ€ MVVM μ•„ν‚€ν…μ²˜κΉŒμ§€ λ°°μ›Œλ³΄μ•˜μŠ΅λ‹ˆλ‹€.

그럼 μ œκ°€ μ•Œκ³  μžˆλŠ” 두 가지 μ•„ν‚€ν…μ²˜μ— λŒ€ν•΄μ„œ μ•Œμ•„λ΄…μ‹œλ‹€.

 

 

MVC μ•„ν‚€ν…μ²˜

MVC μ•„ν‚€ν…μ²˜λŠ” Model, View, Controller의 ꡬ쑰둜 이루어져 μžˆλŠ” μ•„ν‚€ν…μ²˜μ˜ˆμš”. Controllerκ°€ Modelκ³Ό View의 쀑간닀리 역할을 ν•΄μ£Όλ©΄μ„œ Model과의 μƒν˜Έμž‘μš©μ„ ν•˜κ³ , Viewμ™€μ˜ μƒν˜Έμž‘μš©μ„ ν•©λ‹ˆλ‹€. 각각의 역할듀에 λŒ€ν•΄μ„œ λ΄…μ‹œλ‹€.

 

Model

Model은 데이터와 ν•΄λ‹Ή 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ‘œμ§μ„ λ‹΄λ‹Ήν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ°μ΄ν„°λŠ” 주둜 κ΅¬μ‘°μ²΄λ‚˜ 클래슀 ꡬ쑰둜 λ‚˜νƒ€λ‚΄μ–΄μ§€κ³ , μ½”μ–΄λ°μ΄ν„°λ‚˜ API 톡신을 ν†΅ν•΄μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό μƒν˜Έμž‘μš©μ„ ν•  λ•Œλ„ 이 Model이 κ΄€μ—¬ν•©λ‹ˆλ‹€.

 

View

ViewλŠ” UIλ₯Ό λ‹΄λ‹Ήν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. UI μ»΄ν¬λ„ŒνŠΈλ“€μ„ ν¬ν•¨ν•˜κ³  있으며, μ‚¬μš©μžμ—κ²Œ input을 λ°›μ•„μ„œ Controllerμ—κ²Œ μ „λ‹¬ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

 

Controller

ControllerλŠ” μœ„μ—μ„œ μ„€λͺ…ν•œ λŒ€λ‘œ Modelκ³Ό Viewμ™€μ˜ 징검닀리 역할을 ν•˜λ©΄μ„œ 두 ꡬ쑰 κ°„μ˜ μƒν˜Έμž‘μš©μ„ λ‹΄λ‹Ήν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ—μ„œ Controllerμ—κ²Œ 받은 input값을 Modelμ—κ²Œ 전달해 μ£ΌλŠ” 역할을 ν•΄μš”! Swiftμ—μ„œλŠ” ViewControllerκ°€ 이 Controller의 역할을 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

MVC νŒ¨ν„΄μ˜ μž₯점과 단점

μš°μ„  μž₯점은 Cocoa ν”„λ ˆμž„ μ›Œν¬μ—μ„œ μ‚¬μš©ν•˜κ³  μžˆμ–΄μ„œ ν˜Έν™˜μ„±μ΄ μ’‹λ‹€κ³  ν•˜λ”λΌκ³ μš”! λ˜ν•œ 직관적이고 κ°„λ‹¨ν•œ ꡬ쑰라 처음 μ ‘ν•˜κΈ°μ—λ„ μ΄ν•΄ν•˜κΈ°κ°€ μ‰½λ‹€λŠ” 점인 것 κ°™μŠ΅λ‹ˆλ‹€.

 

단점은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 컀질수둝 ViewControllerκ°€ 많이 λ¬΄κ±°μ›Œμ§‘λ‹ˆλ‹€. Viewλ‚˜ Model에 λΉ„ν•΄ ViewController의 역할이 λ§Žμ•„μ Έμ„œ λ³΅μž‘ν•΄μ§€κ³ , μœ μ§€λ³΄μˆ˜κ°€ μ–΄λ €μ›Œμ§‘λ‹ˆλ‹€.

 

 

 

 

MVVM μ•„ν‚€ν…μ²˜

MVVM μ•„ν‚€ν…μ²˜λŠ” Model View ViewModel둜 이루어져 μžˆμŠ΅λ‹ˆλ‹€. 사싀 MVVM μ•„ν‚€ν…μ²˜λ₯Ό 배우기 μ „κΉŒμ§€λŠ” MVVMμ΄λΌμ„œ 4개의 ꡬ쑰둜 뢄리가 된 μ•„ν‚€ν…μ²˜μΈμ€„ μ•Œμ•˜μ–΄μš”!γ…‹γ…‹ ν•˜μ§€λ§Œ 였늘 VM이 ν•˜λ‚˜μ˜ κ΅¬μ‘°μ˜€λ‹€λŠ” 것을 κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€. UI와 λ‘œμ§μ„ λΆ„λ¦¬ν•œ κ΅¬μ‘°μ΄λ”λΌκ³ μš”! μ²˜μŒμ—” 이해가 잘 λ˜μ§€ μ•Šμ•˜λŠ”λ°, 보톡 UILabel의 ν…μŠ€νŠΈλ₯Ό μ§€μ •ν•œλ‹€λ©΄, ν•΄λ‹Ή ViewControllerμ—μ„œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•˜κ³  ( ν…μŠ€νŠΈμ— λ“€μ–΄κ°ˆ 값을 κ³„μ‚°ν•œλ‹€λ˜μ§€, λ‹€λ₯Έ λ°μ΄ν„°μ—μ„œ ν•΄λ‹Ή 값을 λΉΌμ˜¨λ‹€λ˜μ§€ ) ν•΄λ‹Ή 값을 좜λ ₯ν•˜λŠ”λ° ( κ·Έ 값을 Label의 text에 지정 )이 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§ 자체λ₯Ό λ‹€λ₯Έ κ΅¬μ‘°μ²΄λ‚˜ 클래슀둜 λ–Όμ–΄λ‚΄μ„œ λΆ„λ¦¬μ‹œν‚€λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€.

 

 

Model

λͺ¨λΈμ˜ μœ„μ˜ MVC νŒ¨ν„΄μ˜ Modelκ³Ό 같은 μ—­ν• μž…λ‹ˆλ‹€.

 

ViewModel

ViewModel은 Modelκ³Ό View의 쀑간 징검닀리 μ—­ν• λ‘œ Viewμ—μ„œ 좜λ ₯ν•  데이터λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. MVCμ—μ„œλŠ” Viewκ°€ μ‚¬μš©μžμ˜ μž…λ ₯을 λ°›μ•„ Controllerμ—κ²Œ 전달해 μ£Όμ—ˆλ‹€λ©΄, MVVMμ—μ„œλŠ” 이 ViewModel이 μ‚¬μš©μžμ—κ²Œ 데이터λ₯΄ λ°›μ•„μ„œ Modelμ—κ²Œ 전달해 μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€. View에 데이터λ₯Ό ν‘œμ‹œν•˜κΈ° μœ„ν•΄μ„œ ν•΄λ‹Ή 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” λͺ¨λΈμ„ μž‘μ„±ν•˜μ—¬ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

 

View

ViewλŠ” μŠ€ν† λ¦¬λ³΄λ“œμ™€ μ½”λ“œλ₯Ό λͺ¨λ‘ μ§€μΉ­ν•©λ‹ˆλ‹€! ViewModelμ—μ„œ 이미 λ§Œλ“€μ–΄μ§„ ν•¨μˆ˜λ₯Ό κ°€μ Έμ™€μ„œ μ‚¬μš©ν•˜μ—¬ 값을 좜λ ₯ν•©λ‹ˆλ‹€.

 

 

MVVM의 μž₯점과 단점

MVVM의 μž₯점은 아직 μ‚¬μš©ν•΄λ³΄μ§€λŠ” μ•Šμ•˜μ§€λ§Œ, View와 Viewλ₯Ό 좜λ ₯ν•˜λŠ”λ° ν•„μš”ν•œ λΉ„μ§€λ‹ˆμŠ€ λ‘œμ§μ„ λΆ„λ¦¬ν•˜λ‹€ λ³΄λ‹ˆ 역할이 λͺ…확해지고, μ½”λ“œμ˜ 가독성이 μ’‹μ•„μ§‘λ‹ˆλ‹€. λ˜ν•œ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜λŠ” 것이 νŽΈν•©λ‹ˆλ‹€. MVCμ™€λŠ” 달리 μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•˜κΈ°κ°€ μ’‹μŠ΅λ‹ˆλ‹€. UIλ₯Ό κ·Έλ¦¬λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 UI와 λ…λ¦½μ μœΌλ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆμ–΄μ„œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ°κ°€ νŽΈν•©λ‹ˆλ‹€.

 

단점은 μ΄ν•΄ν•˜κΈ°κ°€ μ–΄λ ΅μŠ΅λ‹ˆλ‹€. MVC νŒ¨ν„΄μ€ 직관적이라 μ•„~ 이게 Model, View, Controllerμ΄κ΅¬λ‚˜ μ΄λ ‡κ²Œ λΆ„λ¦¬ν•˜λ©΄ λ˜λŠ”κ΅¬λ‚˜!라고 생각이 λ˜λŠ”λ°, μ§μ ‘μ μœΌλ‘œ κ΅¬ν˜„ν•΄ 보기 μ „κΉŒμ§€λŠ” λͺ…ν™•ν•˜κ²Œ κ΅¬λΆ„μ§€μ–΄μ„œ μ΄ν•΄ν•˜κΈ°κ°€ μ–΄λ €μ› μŠ΅λ‹ˆλ‹€. 였히렀 μž‘μ€ ν”„λ‘œμ νŠΈμ—μ„œ ViewModel을 μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„μ„ ν•˜λ©΄ 였히렀 둜직이 λ³΅μž‘ν•΄μ§€λŠ” κ²½μš°κ°€ μžˆλ‹€κ³  ν•˜λŠ”λ°, 이λ₯Ό 보일러 ν”Œλ ˆμ΄νŠΈκ°€ λ°œμƒν–ˆλ‹€κ³  ν•˜λ”λΌκ³ μš”!

 

 

 

λ””μžμΈ νŒ¨ν„΄

λ””μžμΈ νŒ¨ν„΄μ€ ν΄λž˜μŠ€λ‚˜ 객체λ₯Ό λ””μžμΈν•˜λŠ” νŒ¨ν„΄μœΌλ‘œ λͺ¨λ“ˆμ˜ ꡬ쑰λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.

였늘 배운 λ””μžμΈ νŒ¨ν„΄μœΌλ‘œλŠ” Delegate Pattern, Observer Pattern, Singleton Pattern 등이 μžˆμŠ΅λ‹ˆλ‹€.

 

μ •μ²˜κΈ° μ‹œν—˜μΉ  λ•Œ μ™Έμ› λ˜ λ””μžμΈ νŒ¨ν„΄..γ…‹γ…‹ κ·Έλ•ŒλŠ” 정말 μš©μ–΄λž‘ μ–΄λ–€ κ΅¬μ‘°μΈμ§€λ§Œ 달달 μ™Έμ› λŠ”λ°, μ΄λ ‡κ²Œ 직접 μ¨λ³΄λ©΄μ„œ Swiftλ₯Ό κ³΅λΆ€ν•˜λ‹ˆκΉ ν™•! μ™€λ‹Ώλ”λΌκ³ μš”~! 생ꡬ행/μΆ”λΉŒνŒ©ν”„μ‹±/μ–΄λΈŒμ»΄λ°νΌν”Œν”„ μ΄λ ‡κ²Œ μ™Έμ› μ—ˆλŠ”λ°..γ…‹γ…‹γ…‹γ…‹

μžμ„Έν•œ λ””μžμΈ νŒ¨ν„΄ ν¬μŠ€νŒ…μ€ ν•΄λ‹Ή μ˜ˆμ‹œλ“€μ„ 직접 써보고 κ³΅λΆ€ν•˜λ©΄μ„œ μ’€ 더 깊게 κ³΅λΆ€ν•˜κ³  λ‹€μ‹œ ν¬μŠ€νŒ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

 

 

μ•„ν‚€ν…μ²˜μ™€ λ””μžμΈνŒ¨ν„΄μ˜ 차이

  μ•„ν‚€ν…μ²˜ λ””μžμΈ νŒ¨ν„΄
규λͺ¨ μ‹œμŠ€ν…œ μ „μ²΄μ˜ ꡬ쑰와 λ ˆμ΄μ•„μ›ƒμ„ λ‹€λ£ΈλŒ€κ·œλͺ¨μ˜ μ‹œμŠ€ν…œμ— 적용 ν΄λž˜μŠ€λ‚˜ 객체의 μž‘μ€ 규λͺ¨μ˜ λ””μžμΈ 문제
적용 λ²”μœ„ μ‹œμŠ€ν…œμ˜ μ£Όμš” ꡬ성 μš”μ†Œμ™€ 이듀 κ°„μ˜ 관계데이터 흐름 / μ„±λŠ₯ μ΅œμ ν™” / λ³΄μ•ˆ 정책을 μœ„ν•¨ κ°œλ³„ μ»΄ν¬λ„ŒνŠΈμ— 적용λͺ¨λ“ˆ λ‚΄μ˜ μƒμ„Έν•œ ꡬ쑰와 μƒν˜Έμž‘μš©
μ •μ˜ μ‹œμ  섀계 단계 κ΅¬ν˜„ 단계
λͺ©μ  μ‹œμŠ€ν…œμ˜ 전체적인 λͺ¨μŠ΅μ„ κ΄€λ¦¬μ‹œμŠ€ν…œμ˜ μ„±λŠ₯, ν™•μž₯μ„±, μœ μ§€λ³΄μˆ˜μ„±μ„ 보μž₯ ν΄λž˜μŠ€λ‚˜ 객체 κ°„μ˜ μƒν˜Έμž‘μš©μ„ κ΅¬μ‘°ν™”ν•˜μ—¬ μž¬μ‚¬μš©κ°€λŠ₯ν•œ μ†”λ£¨μ…˜μ„ μ œκ³΅ν•¨