iOS/์•„ํ‚คํ…์ฒ˜

[์•„ํ‚คํ…์ฒ˜] Clean Architecture(ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ(feat.DIP)

๊ฒฝํ‘ธ 2023. 9. 10. 15:00
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”.

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

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด์„œ๋Š” ๋งŽ์€ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์ด ์กด์žฌํ•˜๊ณ  ์žˆ์–ด์„œ ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์˜ ๊ตฌ์กฐ๋Š” ์–ด๋–ค์ง€, ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€, ๋ˆ„๊ฐ€ ํ•ด๋‹น ์•„ํ‚คํ…์ฒ˜๋ฅผ ์†Œ๊ฐœํ–ˆ๋Š”์ง€ ๋“ฑ๋“ฑ ์•Œ๊ธฐ ์‰ฌ์šธ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๋‹น ํฌ์ŠคํŒ…์—๋Š” ๊ทธ์™€ ๊ด€๋ จ๋œ ๋‚ด์šฉ๋ณด๋‹ค๋Š” ํ›„๊ธฐ ์œ„์ฃผ๋‹ˆ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 


 

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜?

์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ์„œ

iOS ๊ฐœ๋ฐœ์„ ๋‹ด๋‹นํ•˜๋Š” ์ธ์›์ด ์ € ํ•˜๋‚˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ์‹์œผ๋กœ ์„ค๊ณ„๋ฅผ ํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด์—๋Š” ๊ฐ„๋‹จํ•œ ์•ฑ๋“ค์„ MVVM ๋””์ž์ธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด์™”์ง€๋งŒ 

๊ทœ๋ชจ๊ฐ€ ๊ธฐ์กด๋ณด๋‹ค๋Š” ์ปค์กŒ๊ธฐ ๋•Œ๋ฌธ์— ๋””์ž์ธ ํŒจํ„ด์ด ์•„๋‹Œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ํ•„์š”ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๋„๋ฆฌ ์•Œ๋ ค์ง€๊ธฐ๋„ ํ–ˆ๊ณ , ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ

์•„๋ฌด๋ž˜๋„

๊ฐ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ํฐ ์žฅ์ ์ด ์žˆ๋Š”๊ฒƒ์ด ์„ ํƒ์˜ ์ฃผ๋œ ์ด์œ ์˜€์Šต๋‹ˆ๋‹ค.

์ฆ‰, ํ˜ผ์ž ๊ฐœ๋ฐœํ•œ๋‹ค๋Š” ์ ๋„ ์žˆ์ง€๋งŒ ์ดˆ๊ธฐ ์ปจ์…‰์ด๋‚˜ ์š”๊ตฌ๋˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•ด์„œ

๊ฐ€์žฅ ์ ํ•ฉํ•œ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋  ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์ด๊ฑฐ ํ•˜๋‚˜๋ฉด ์•Œ๋ฉด ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜ ๋‹ค ์•„๋Š”๊ฑธ์ง€๋„?

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉด์„œ

๊ฐ€์žฅ ๋„์›€์ด ๋˜์—ˆ๋˜ ๊ฒƒ์€ ์•„๋ž˜์˜ ์ด๋ฏธ์ง€์˜€์Šต๋‹ˆ๋‹ค.

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด์ˆ˜ ๋งŽ์€ ์›๋“ค๊ณผ ๋งˆ์ฃผํ•˜๊ฒŒ ๋˜๋Š”๋ฐ

๊ทธ ์ˆ˜๋งŽ์€ ์›๋“ค๋„ ์ดํ•ด์— ๋„์›€์„ ์ฃผ์ง€๋งŒ

์ €๋Š” ์ด ๋„ค๋ชจ๋„ค๋ชจ๋“ค์ด ์ดํ•ดํ•˜๊ธฐ์—๋Š” ๋” ์ˆ˜์›”ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

UI layer์™€ Presenter layer๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋Š”๋ฐ ์ด๋Š” ๊ธฐ์กด์˜ Present layer๋ฅผ ์„ธ๋ถ„ํ™”ํ•ด์„œ ๋„ฃ์–ด ๋’€๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

์ตํžˆ ์•Œ๊ณ  ์žˆ๋“ฏ์ด View์˜ ๊ฒฝ์šฐ, ViewModel์— ์˜์กด์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ViewModel์˜ ๊ฒฝ์šฐ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” Domain layer์˜ Use Case์— ์˜์กด์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ViewModel์€ Use Case์— ๋ทฐ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด View์— Binding ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์ด๋ฏธ์ง€์—์„œ ๋ณด์ด๋Š” Data flow๋Š” ์ด ๋‚ด์šฉ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋ฐฉํ–ฅ์—์„œ ์‹œ์ž‘ํ•ด ๋ณธ๋‹ค๋ฉด  Data layer์˜ Repository๋“ค์€ API๋‚˜ DB๋ฅผ ํ†ตํ•ด์„œ(์š”์ฒญ) ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋“ค์„ Use Case์—์„œ ์กฐํ•ฉํ•˜์—ฌ ViewModel์— ์ „๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

์—ฌ๊ธฐ์„œ Use Case๊ฐ€ Repository์— ์˜์กด์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ํ•˜๋Š” ์˜๋ฌธ์ด ์ƒ๊ฒผ์—ˆ์Šต๋‹ˆ๋‹ค. 

Use Case๋Š” repository๋ฅผ ๊ฐ€์ง€๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์˜๋ฌธ์ด ์ƒ๊ฒผ๋Š”๋ฐ ์œ„์˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ DIP(Dependency Inversion Principple)์ด ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด์„ฑ์ด ์—ญ์ „๋ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class Person {

    let car = Tesla()

    init() {
    
    }
}

class Tesla {

}


class Hyundai {

}

 

์œ„์™€ ๊ฐ™์ด Person๋Š” Tesla์— ์˜์กดํ•˜๊ณ  ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, Tesla ์ธ์Šคํ„ด์Šค๋ฅผ Person์—์„œ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

protocol Vehicle {
	func start()
}

class Person {
	let car: Vehicle

    init(car: Vehicle) {
    	self.car = car
    }
    
    func start() {
    	car.start()
    }
}

class Tesla: Vehicle {
    func start() {
    
    }
}


class Hyundai: Vehicle {
    func start() {
    
    }
}

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์˜์กด์„ฑ์„ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ”„๋กœํ† ์ฝœ์„ ์ด์šฉํ•ด car์— ๊ตฌํ˜„์ฒด์ธ Tesla๋‚˜ Hyundai๊ฐ€ ์•„๋‹Œ Vehicle ํ”„๋กœํ† ์ฝœ ํƒ€์ž…์„ ์ฃผ์ž…์‹œํ‚จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด DIP ์›์น™์— ๋”ฐ๋ผ ์ถ”์ƒํ™”๋œ ๊ฒƒ์ด ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜๋Œ€์ธ ๊ตฌ์ฒด์ ์ธ ๊ฒƒ์ด ์ถ”์ƒํ™”๋œ ๊ฒƒ์— ์˜์กดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ์˜์กด์„ฑ ์—ญ์ „์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ตฌ์ฒด์ ์ธ ํด๋ž˜์Šค(Tesla, Hyundai)์™€์˜ ์˜์กด๊ด€๊ณ„๊ฐ€ ์•„๋‹Œ ํ”„๋กœํ† ์ฝœ(Vehicle)๊ณผ ๊ด€๊ณ„๋ฅผ ๋งบ์Œ์œผ๋กœ์จ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ์ด ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋˜๊ณ  ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์˜ ํŠน์„ฑ์ธ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

ํด๋” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž

๋ง‰์ƒ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ๋ญ๋ถ€ํ„ฐ ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์„œ

๊ฐ€์žฅ ๋จผ์ € Github์— ๋“ค์–ด๊ฐ€ ์ข‹์€ ๋ ˆํฌ๋“ค์„ ํƒ์ƒ‰ํ•ด ๋ดค์—ˆ์Šต๋‹ˆ๋‹ค.

ํ‰๊ฐ€๊ฐ€ ์ข‹์€ ๋ ˆํฌ๋“ค ์ค‘์—์„œ ์•„๋ž˜์˜ ๋ ˆํฌ๊ฐ€ ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๊ธฐ๋„ ํ•ด์„œ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ์ž์„ธํ•˜๊ฒŒ ๋“ค์—ฌ๋‹ค๋ดค์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ ˆํฌ๋ฅผ ๋ณด๋ฉด์„œ ์ „์ฒด์ ์ธ ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์˜ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋Š”๋ฐ ์ •๋ง ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

GitHub - kudoleh/iOS-Clean-Architecture-MVVM: Template iOS app using Clean Architecture and MVVM. Includes DIContainer, FlowCoor

Template iOS app using Clean Architecture and MVVM. Includes DIContainer, FlowCoordinator, DTO, Response Caching and one of the views in SwiftUI - GitHub - kudoleh/iOS-Clean-Architecture-MVVM: Tem...

github.com

์ผ๋‹จ,

์ฒ˜์Œ์—๋Š” Kudoleh๋‹˜๊ณผ ๋น„์Šทํ•œ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ๋‘๊ณ  ์‹œ์ž‘ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํฌ๊ฒŒ 5๊ฐœ์˜ ํด๋”๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Application: plist ํŒŒ์ผ์ด๋‚˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ํŒŒ์ผ์„ ๋ณด๊ด€ํ•ด์„œ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ Kudoleh๋‹˜์€ ์˜์กด์„ฑ ๊ด€๋ จ ํŒŒ์ผ์ด๋‚˜, ์•ฑ์˜ ์ „์ฒด์ ์ธ Appearance ๋“ฑ Base๊ฐ€ ๋˜๋Š” ํŒŒ์ผ๋“ค์„ ์ด๊ณณ์— ๋‘๊ณ  ์‚ฌ์šฉํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ถ”ํ›„์— Swinject์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๊ทธ์™€ ๊ด€๋ จ๋œ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Domain: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” Use Case๊ฐ€ ๋“ค์–ด์žˆ๋Š” ํด๋”์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ Repository Interface์™€ entities๋“ค์ด ์ด๊ณณ์— ๊ฐ™์ด ์žˆ์Šต๋‹ˆ๋‹ค. Repository Interface๊ฐ€ ์ด ํด๋”์— ์žˆ๋Š” ์ด์œ ๋Š” ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์˜ ๊ตฌ์กฐ์ƒ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ์™€ ์ข…์†์„ฑ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ๊ณ„์ธต์˜ ๊ฒฝ์šฐ, ์™ธ๋ถ€ ๊ณ„์ธต(Data layer, Present layer)์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด๊ณณ์— ๋ฐฐ์น˜ํ•จ์œผ๋กœ์จ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ ์†Œ์Šค ๊ตฌํ˜„์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ •์˜ํ•จ์œผ๋กœ์จ ํ•ด๋‹น ์†์„ฑ์„ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Presentation: ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ View์™€ ๊ด€๋ จ๋œ ์ฆ‰, ํ™”๋ฉด์— ๋ณด์ด๋Š” ๊ฒƒ๋“ค์„ ๋„ฃ์€ ํด๋”์ž…๋‹ˆ๋‹ค. ViewModel์˜ ๊ฒฝ์šฐ์—๋„ Presentation layer์— ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํด๋”์— ๋ฐฐ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. 

Data: Network์™€ ๊ด€๋ จ๋œ ํŒŒ์ผ ๊ทธ๋ฆฌ๊ณ  Repository๋“ค์ด ๋“ค์–ด์žˆ๋Š” ํด๋”์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” CoreData๋‚˜ realm๊ฐ€ ๊ฐ™์€ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ํŒŒ์ผ๋“ค์ด ๋ฐฐ์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Infrastructure: Network์˜ Base ํŒŒ์ผ๋“ค์ด ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ €์˜ ๊ฒฝ์šฐ, Moya ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ Target ํŒŒ์ผ๋“ค๊ณผ Moya plugin๋“ค, Moya intercepter, APIError ๋“ฑ์„ ์ •์˜ํ•œ ํŒŒ์ผ์„ ๋ฐฐ์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ์–ด๋–ค ๊ฒŒ ์–ด๋””์— ๋“ค์–ด๊ฐ€์•ผ ํ• ์ง€ ํšก์„ค์ˆ˜์„ค ๋งŽ์ด ํ–ˆ์ง€๋งŒ 

์–ธ์  ๊ฐ€๋ถ€ํ„ฐ๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํŒŒ์ผ๋“ค์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

์‹œ๊ฐ„์ด ๋˜๋ฉด ์ „์ฒด์ ์œผ๋กœ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด ๋ณผ ํ•„์š”๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™๋„ค์š”.

 

์•„์ง ํ”„๋กœ์ ํŠธ๋Š” ๋๋‚˜์ง€ ์•Š์•˜์ง€๋งŒ..

๊ตฌ์กฐ๋„ ์žก๊ณ  ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋Š๊ผˆ๋˜ ์žฅ์ ์€ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์˜ ์šฉ์ด์„ฑ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์–ด๋– ํ•œ ๊ธฐ๋Šฅ์ด๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ถ”๊ฐ€๋˜๋”๋ผ๋„

๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒŒ ๊ฐ€์žฅ ํฐ ์ด์ ์ด ์•„๋‹ˆ์—ˆ๋‚˜ ์ƒ๊ฐ์ด ๋“œ๋„ค์š”.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ํ•ด๋‹น ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์š”๊ตฌํ•˜๋Š” ViewModel์˜ Use Case๋ฅผ ํŒŒ์•…ํ•˜๊ณ 

Repository Interface์— ํ•ด๋‹น ์š”๊ตฌ์‚ฌํ•ญ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Repository์— ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ด๋ฅผ Use Case์—

์„œ ViewModel์— ์ „๋‹ฌํ•˜๊ณ , ์ด๋ฅผ View์— ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ๋์—ˆ์Šต๋‹ˆ๋‹ค. 

๋‹ค์‹œ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๊ฐ ๊ณ„์ธต์˜, ํด๋ž˜์Šค์˜ ์—ญํ• ์ด ํ™•์‹คํ•˜๊ธฐ ๋•Œ๋ฌธ์—

์ž‘์—…์„ ์ง„ํ–‰ํ•  ๋•Œ์— ์žˆ์–ด์„œ ์Šค์Šค๋กœ๋„ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 


 

์˜ค๋Š˜์€ ๋Œ€๋žต์ ์ธ Clean Architecture ํ›„๊ธฐ๋ฅผ ๋‚จ๊ฒจ๋ดค์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด๋งŒ ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป 

๋ฐ˜์‘ํ˜•

'iOS > ์•„ํ‚คํ…์ฒ˜' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์•„ํ‚คํ…์ฒ˜] ReactorKit์— ๋Œ€ํ•ด์„œ(feat.Flux)  (0) 2023.09.23