일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Combine
- IT트렌드
- swiftconcurrency
- MVVM
- 비동기처리
- 아키텍처패턴
- asyncawait
- coredata
- ios프로그래밍
- RxSwift
- 데이터분석
- ios
- 프로그래밍
- 비동기프로그래밍
- 웹개발
- swiftdata
- 개발자블로그
- Viper
- iOS개발
- 서버개발
- MVC
- Swift
- SwiftUI
- CleanArchitecture
- 머신러닝
- Redux
- go언어
- swift공부
- swiftcombine
- swiftmacros
- Today
- Total
탐험하는 바이트스토리
🖱️ Swift에서 Clean Architecture: 확장성과 유지보수를 극대화하는 패턴 본문
1. Clean Architecture란?
Clean Architecture(클린 아키텍처)는 소프트웨어의 유지보수성과 확장성을 높이기 위해 만들어진 설계 원칙이야.
원래는 로버트 C. 마틴(Uncle Bob)이 제안한 개념으로,
소프트웨어의 각 계층을 명확히 분리하여 의존성을 최소화하고 코드의 재사용성을 극대화하는 것이 목표야.
Clean Architecture의 가장 큰 특징은 의존성 규칙(Dependency Rule)이야.
핵심 비즈니스 로직(Use Case)이 외부(UI, 데이터베이스, 네트워크 등)에 의존하지 않고,
오히려 외부가 내부에 의존하도록 만들어져 있어.
즉, 코어 비즈니스 로직을 UI나 데이터 저장 방식과 독립적으로 설계할 수 있어.
몇줄 안되는 문장을 읽어도 이게 도대체 뭔지 감도 잘안오고 어려워 보이는데, 계속 읽어가보자!
2. Clean Architecture의 계층 구조
Clean Architecture는 크게 4가지 계층으로 나뉘어 있어.
🔹 1) Entities (엔터티)
- 비즈니스 로직의 핵심 데이터 모델
- 애플리케이션 전반에서 사용되는 객체들로 구성돼
- 데이터베이스, 네트워크 등에 의존하지 않고, 순수한 Swift 구조체(Struct) 또는 클래스로 표현돼
🔹 2) Use Cases (유스 케이스)
- 애플리케이션의 핵심 비즈니스 로직을 정의하는 계층
- Entity를 사용하여 데이터를 가공하고 비즈니스 규칙을 적용해
- 예를 들어, "유저가 로그인할 때 비밀번호를 해시화하는 로직"이 여기에 포함될 수 있어
🔹 3) Interface Adapters (인터페이스 어댑터)
- Use Case와 외부(UI, DB, 네트워크 등)를 연결하는 역할을 해
- Presenter, ViewModel, Repository 인터페이스 등이 포함돼
- 데이터의 변환을 담당하며, UI와 Use Case 간 데이터를 주고받는 중간다리 역할을 해
🔹 4) Frameworks & Drivers (프레임워크 & 드라이버)
- 네트워크, 데이터베이스, UI 등 외부 라이브러리와의 연결
- ViewController(SwiftUI, UIKit), API 클라이언트, CoreData, Firebase 같은 외부 기술이 포함돼
- 이 계층이 가장 바깥쪽에 위치하며, 내부 계층(Use Case, Entity)에는 영향을 주지 않아야 해
3. Clean Architecture를 Swift로 구현하기
✅ 1) Entity (엔터티)
struct User {
let id: Int
let name: String
let email: String
}
✅ 2) Use Case (유스 케이스)
protocol UserUseCaseProtocol {
func fetchUser() -> User
}
class UserUseCase: UserUseCaseProtocol {
private let repository: UserRepositoryProtocol
init(repository: UserRepositoryProtocol) {
self.repository = repository
}
func fetchUser() -> User {
return repository.getUser()
}
}
✅ 3) Repository (인터페이스 어댑터)
protocol UserRepositoryProtocol {
func getUser() -> User
}
class UserRepository: UserRepositoryProtocol {
func getUser() -> User {
return User(id: 1, name: "John Doe", email: "john@example.com")
}
}
✅ 4) Presenter & ViewModel (인터페이스 어댑터)
class UserViewModel: ObservableObject {
private let useCase: UserUseCaseProtocol
@Published var userName: String = ""
init(useCase: UserUseCaseProtocol) {
self.useCase = useCase
loadUser()
}
func loadUser() {
let user = useCase.fetchUser()
userName = user.name
}
}
✅ 5) View (SwiftUI, 프레임워크 계층)
import SwiftUI
struct UserView: View {
@ObservedObject var viewModel: UserViewModel
var body: some View {
Text(viewModel.userName)
}
}
✅ 6) Dependency Injection (의존성 주입)
let repository = UserRepository()
let useCase = UserUseCase(repository: repository)
let viewModel = UserViewModel(useCase: useCase)
let view = UserView(viewModel: viewModel)
4. Clean Architecture의 장점
✅ 유지보수가 용이함 – 각 계층이 독립적으로 동작하므로, 특정 기능을 수정해도 다른 부분에 영향을 주지 않아.
✅ 유닛 테스트가 용이함 – 비즈니스 로직(Use Case)이 UI, 네트워크, 데이터베이스와 분리되어 있어서 단위 테스트 작성이 쉬워.
✅ 확장성이 뛰어남 – 새로운 UI 프레임워크(SwiftUI, UIKit)를 적용해도, Use Case나 Repository 코드를 변경할 필요가 없어.
✅ 비즈니스 로직 중심의 개발 – UI나 네트워크보다는 애플리케이션의 핵심 로직을 중심으로 개발할 수 있어.
5. Clean Architecture의 단점
❌ 구조가 복잡함 – 작은 앱에서는 오히려 불필요하게 많은 코드가 필요할 수 있어.
❌ 초기 개발 속도가 느림 – 계층을 분리해야 하기 때문에 단순한 MVC보다 코드량이 많고, 초기 개발 시간이 길어질 수 있어.
❌ 개발자가 익숙해져야 함 – MVC, MVVM에 익숙한 개발자들에게는 처음에 학습 비용이 클 수 있어.
6. Clean Architecture는 언제 사용할까?
- 대규모 프로젝트에서 유지보수성이 중요한 경우
- 비즈니스 로직이 복잡한 앱(금융, 헬스케어, 전자상거래 등)
- 여러 플랫폼(iOS, Android 등)에서 동일한 비즈니스 로직을 공유해야 하는 경우
- 장기적으로 확장 가능한 구조가 필요한 경우
작은 프로젝트에서는 MVC나 MVVM이 더 적합할 수 있지만,
장기적으로 성장할 앱이라면 Clean Architecture를 고려해보는 것이 좋아!
요즘 클린 아키텍쳐 트렌드가 점점 더 강조되다보니 어렵다해도 레벨업을 위해서 고민해봐야 할 것같아.
7. 결론
Clean Architecture는 유지보수성과 확장성이 중요한 프로젝트에서 강력한 아키텍처 패턴이야.
하지만 작은 프로젝트에서는 오히려 복잡도를 증가시킬 수 있기 때문에 신중하게 선택해야 해.
다음 편에서는 Redux 패턴을 다룰 예정이야! 🚀
이전글:
'프로그래밍' 카테고리의 다른 글
참고자료, Swift 6: 더 강력하고 확장된 새로운 시대 🖱️ (0) | 2025.03.18 |
---|---|
🖱️ Swift에서 Redux 아키텍처: 상태 관리의 궁극적인 해결책 (0) | 2025.03.18 |
🖱️ Swift에서 VIPER: 복잡한 프로젝트를 위한 궁극의 아키텍처 (0) | 2025.03.18 |
🖱️ Swift에서 MVVM: MVC의 문제를 해결할 수 있을까? (0) | 2025.03.17 |
🖱️ Swift에서 MVC 아키텍처: 아직도 쓸만할까? (1) | 2025.03.17 |