๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

iOS/Pattern

[iOS] Clean Architecture for iOS

๐Ÿค” ํƒ„์ƒํ•œ ์ด์œ ?


 

๊ทธ ๋™์•ˆ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์กด์žฌํ•ด์™”์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์—ฌ๋Ÿฌํ•œ ์•„ํ‚คํ…์ฒ˜๋“ค์€ ์„ธ๋ถ€์‚ฌํ•ญ๋“ค์€ ๋‹ค๋ฅด์ง€๋งŒ ๋™์ผํ•œ ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ ๊ทธ๊ฒƒ์€ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๋ผ๋Š” ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์•„ํ‚คํ…์ฒ˜๋“ค์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์—ฌ๋Ÿฌ ๋ ˆ์ด์–ด(layer)๋กœ ๋‚˜๋ˆ„์–ด ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ ˆ์ด์–ด ์ข…๋ฅ˜์—๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™ ๋ ˆ์ด์–ด๊ฐ€ ํ•˜๋‚˜์ด์ƒ ์กด์žฌํ•˜๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์šฉ ๋ ˆ์ด์–ด๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ๊ฐ์˜ ์•„ํ‚คํ…์ฒ˜๋“ค์˜ ์ƒ์‚ฐ์„ฑ


  1. ํ”„๋ ˆ์ž„์›Œํฌ์— ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.
    1. ์•„ํ‚คํ…์ฒ˜๋Š” ๊ธฐ๋Šฅ์ด ํฌํ•จ๋œ ์†Œํ”„ํŠธ์›จ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์กด์žฌ ์—ฌ๋ถ€์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์„ ์ œํ•œ๋œ ์ œ์•ฝ ์กฐ๊ฑด์— ๊ฐ€๋‘๋Š” ๋Œ€์‹  ์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    1. ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ UI, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์›น ์„œ๋ฒ„ ๋˜๋Š” ๊ธฐํƒ€ ์™ธ๋ถ€ ์š”์†Œ ์—†์ด ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. UI์™€ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.
    1. ์‹œ์Šคํ…œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ UI๋ฅผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์›น UI๋ฅผ ์ฝ˜์†” UI๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. **DB(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)**์™€ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.
    1. Mongo, BigTable, CouchDB ๋“ฑ์„ ์œ„ํ•ด Oracle ๋˜๋Š” SQL Server๋ฅผ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  5. ์™ธ๋ถ€ ์š”์†Œ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.
    1. ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋น„์ฆˆ๋‹ˆ์Šค๊ทœ์น™์€ ์™ธ๋ถ€ ์š”์†Œ์™€ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

Dependency Rule (์˜์กด์„ฑ ๊ทœ์น™)


<์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html>

 

ํ•ด๋‹น ์ด๋ฏธ์ง€๋Š” ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋‹ค์–‘ํ•œ ์˜์—ญ์„ ํ‘œ์‹œํ•œ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค.

  • ๋ฐ”๊นฅ์ชฝ์›์—์„œ ๋‚ด๋ถ€๋กœ ๊ฐˆ์ˆ˜๋ก ์†Œํ”„ํŠธ์›จ์–ด ์ˆ˜์ค€์ด ๋‚ฎ์€ ์ˆ˜์ค€์—์„œ ๋†’์•„์ง‘๋‹ˆ๋‹ค.
  • ์˜์กด์„ฑ ๊ทœ์น™์€ ๋‚ด๋ถ€๋งŒ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ์› ๊ณ„์ธต์—์„œ ์™ธ๋ถ€ ์› ๊ณ„์ธต์˜ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์™ธ๋ถ€ ์› ๊ณ„์ธต์—์„œ ๋‚ด๋ถ€ ์› ๊ณ„์ธต์˜ ์˜์กด์„ฑ์„ ๊ฐ€์ง€๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.
  • SOLID ์›์น™

 

 

Entities - (์ด๋ฏธ์ง€ ์ค‘ ๋…ธ๋ฝ์ƒ‰ ๊ณ„์ธต ์ฐธ๊ณ )


Entities์—๋Š” ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์บก์Šํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋œ ๊ฐœ์ฒด์ผ ์ˆ˜ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฐ ํ•จ์ˆ˜์˜ ์ง‘ํ•ฉ์ฒด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๊ณ„์ธต์€ ์™ธ๋ถ€์ ์ธ ๊ฒƒ์ด ๋ฐ”๋€” ๋•Œ ๋ฐ”๋€” ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ์ ์€ ๊ณ„์ธต์ž…๋‹ˆ๋‹ค.

 

Use Cases - (์ด๋ฏธ์ง€ ์ค‘ ๋นจ๊ฐ„์ƒ‰ ๊ณ„์ธต ์ฐธ๊ณ )


Use Cases์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณ„๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Entities๊ณ„์ธต๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์กฐ์ •ํ•˜๋Š” ๊ณ„์ธต์ž…๋‹ˆ๋‹ค.

Use Cases ๊ณ„์ธต์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด entities๊ณ„์ธต์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉด ์•ˆ๋˜๊ณ , DB, UI, Common Framework์— ์˜ํ–ฅ์„ ๋ฐ›์œผ๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

 

Interface Adapters - (์ด๋ฏธ์ง€ ์ค‘ ์ดˆ๋ก์ƒ‰ ๊ณ„์ธต ์ฐธ๊ณ )


Interface Adapters ๊ณ„์ธต์€ use cases, entities๊ณ„์ธต์˜ ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ํ˜•์‹์—์„œ DB, Web๊ณผ ๊ฐ™์€ ์™ธ๋ถ€์š”์†Œ์— ํŽธ๋ฆฌํ•œ ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณ„์ธต์ž…๋‹ˆ๋‹ค.

 

Frameworks and Drivers - (์ด๋ฏธ์ง€ ์ค‘ ํŒŒ๋ž€์ƒ‰ ๊ณ„์ธต ์ฐธ๊ณ )


๊ฐ€์žฅ ๋ฐ”๊นฅ์ชฝ ๊ณ„์ธต์œผ๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ, DB, Web Framework ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

 

์ฃผ์˜์ 


๐Ÿšจ ์ฃผ์˜ : ๊ผญ 4๊ฐœ์˜ ๋ ˆ์ด์–ด ๋˜๋Š” ์ด์ƒ์œผ๋กœ ๋งž์ถฐ์•ผ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋ ˆ์ด์–ด์˜ ๋ถ„๋ฆฌ๋ฅผ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์˜์กด์„ฑ ๊ทœ์น™๋“ค์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿงน iOS Clean Architecture์ด๋ž€?


iOS์•ฑ์„ ํŠน์ • ์—ญํ• ์„ ๊ฐ€์ง€๋Š” ๋ ˆ์ด์–ด(layer)๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

ํด๋ฆฐ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์˜ ๋ฒ„๊ทธ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ํŠน์ • ๋ ˆ์ด์–ด์˜ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : https://tech.olx.com/clean-architecture-and-mvvm-on-ios-c9d167d9f5b3>

 

๐Ÿ“ฑ Presentation Layer


Presentation Layer๋Š” UI , Presenter , ViewModel ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, Domain Layer์— ์ข…์†๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ›œ Domain Layer (Business Logic)


Domain Layer๋Š” Use case/Interactor , Entity , Repository Interface๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

Domain Layer๋Š” ๋…๋ฆฝ์ ์ธ Layer์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋‚ด์—์„œ ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ’ฟ Data Layer (Data Repositories)


Data Layer๋Š” Repository Implementation , DataSource ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

Data Layer๋Š” data source์—์„œ ์›๊ฒฉ(remote) ๋˜๋Š” ๋กœ์ปฌ(local)๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

Domain Layer์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

MVVM with Clean Architecture


 

<์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : https://tech.olx.com/clean-architecture-and-mvvm-on-ios-c9d167d9f5b3>

 

 

์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด, Data Layer์™€ Presentation Layer๋Š” ๋ชจ๋‘ Domain Layer์— ์ข…์†๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Data Leyer์—์„œ Domain Layer์— ์ข…์†๋˜๊ธฐ ์œ„ํ•ด ์˜์กด์„ฑ์—ญ์ „์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Repository Interface๋ฅผ ๊ตฌํ˜„ํ•œ ํ›„ Data Layer์—์„œ Repository๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

Presentation Layer์—์„œ MVVMํŒจํ„ด์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๋งˆ์น˜๋ฉฐ


์ ์šฉํ•ด๋ณด๊ณ  ๋Š๋‚€์ ์€ ์œ„์˜ ๊ธ€์—์„œ ๋งํ–ˆ๋˜ ์žฅ์ ๋“ค์„ ์ง์ ‘ ๋Š๋ผ๊ฒŒ ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

  • ์‹ค์ œ ์‚ฌ์šฉ์‚ฌ๋ก€์—์„œ ๋Š๋‚€์ 
    • DTO๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, quicktype.io๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์‹ค์ œ ํ•„์š”ํ•œ ํ‚ค๊ฐ’๋งŒ ์ •๋ฆฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†์ด ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ ํ›„ Domain Layer์—์„œ Entities๋ฅผ ํ•„์š”ํ•œ ํ‚ค๊ฐ’๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๋‚ด์—์„œ 2๊ฐ€์ง€(DTO, Entities)๋ฅผ ๋น„๊ตํ•ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
    • UnitTest๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ViewModel๋งŒ์„ ํ…Œ์ŠคํŠธํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž‘์„ฑ์ด ์ˆ˜์›”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.
    • View์˜ ๋ณ€๊ฒฝ์ด ์ž์œ ๋กœ์šด ๊ฒƒ ๊ฐ™๋‹ค. (UIKit๊ณผ SwiftUI์˜ ์ด๋™์ด ์ˆ˜์›”ํ•˜๋‹ค.)
    • ์ž๋™์œผ๋กœ ๋ชจ๋“ˆํ™”๊ฐ€ ๋˜๊ณ  ์ถ”ํ›„ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค๋ฉด ๋”์šฑ ํŽธ๋ฆฌํ•  ๊ฒƒ ๊ฐ™๋‹ค.
    • ํŒŒ์ผ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋งŽ์•„ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋” ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ, Xcode ํ…œํ”Œ๋ฆฟ์„ ํ™œ์šฉํ•˜๋ฉด ๋ณด์™„์ด ๋  ๊ฒƒ ๊ฐ™๋‹ค.
    • ์›ํ•˜๋Š” ํŒŒ์ผ ๋ฐ ์›ํ•˜๋Š” ๋ถ€๋ถ„๋“ฑ์„ ์ฐพ๊ธฐ ์‰ฌ์›Œ ์ž‘์—…(์ด์Šˆ ์ˆ˜์ •, ๊ธฐ๋Šฅ์ถ”๊ฐ€, ์ฝ”๋“œ๋ฆฌ๋ทฐ)๋“ฑ์ด ํŽธ๋ฆฌํ•  ๊ฒƒ ๊ฐ™๋‹ค.

์•„๋ž˜ ์ฐธ๊ณ ๋งํฌ์˜ CleanCode ๋ฌธ์„œ๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด์˜ CleanArchitecture๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋งํฌ๋“ค์„ ์ฐธ๊ณ ํ•˜์—ฌ iOS์•ฑ์—์„œ CleanArchitecture๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ•œ ๊ธ€๋“ค์„ ์ฐธ๊ณ ํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”— ์ฐธ๊ณ ๋งํฌ


  •  

'iOS > Pattern' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[iOS] Coordinator Pattern  (0) 2024.05.22