탐험하는 바이트스토리

🖱️ Swift에서 Clean Architecture: 확장성과 유지보수를 극대화하는 패턴 본문

프로그래밍

🖱️ Swift에서 Clean Architecture: 확장성과 유지보수를 극대화하는 패턴

버그메이커 2025. 3. 18. 14:26
반응형

iOS에서 쓰이는 아키텍처 패턴이 뭐가 있을까?
iOS에서 쓰이는 아키텍처 패턴이 뭐가 있을까?

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에서 VIPER: 복잡한 프로젝트를 위한 궁극의 아키텍처

반응형