iOS 아키텍처 패턴 – 5: RIB’s

iOS 애플리케이션 개발에서는 여러 아키텍처 패턴들이 사용된다.
그 중 RIB’s (Router, Interactor, Builder)는 Uber에서 소개된 아키텍처로, 확장성과 테스트 용이성을 중점으로 한 패턴이다.
이 글에서는 RIB’s의 기본 개념과 Swift를 이용한 예제를 통해 이 패턴을 자세히 알아본다.
RIB’s란?
RIB’s는 Router, Interactor, Builder의 약자로 다음과 같은 역할을 한다:
- Router: 화면 전환과 같은 뷰의 네비게이션 로직을 담당한다.
- Interactor: 비즈니스 로직을 담당한다.
- Builder: RIB의 인스턴스 생성과 의존성 주입을 담당한다.
Swift 예제로 MVC 이해하기
1. Interactor
protocol ProfileInteractable: AnyObject {
func fetchUserProfile() -> UserProfile
}
class ProfileInteractor: ProfileInteractable {
func fetchUserProfile() -> UserProfile {
// API 호출이나 데이터베이스 조회 등의 로직
return UserProfile(name: "John Doe", age: 25)
}
}2. Router
protocol ProfileRoutable: AnyObject {
func routeToDetailScreen(userProfile: UserProfile)
}
class ProfileRouter: ProfileRoutable {
func routeToDetailScreen(userProfile: UserProfile) {
// 상세 화면으로의 라우팅 로직
}
}3. Builder
class ProfileBuilder {
static func build() -> ProfileViewController {
let interactor = ProfileInteractor()
let router = ProfileRouter()
let viewController = ProfileViewController(interactor: interactor, router: router)
return viewController
}
}4. View Controller
UIKit을 사용하여 간단한 예제를 구현했다.
import UIKit
class ProfileViewController: UIViewController {
private let interactor: ProfileInteractable
private let router: ProfileRoutable
init(interactor: ProfileInteractable, router: ProfileRoutable) {
self.interactor = interactor
self.router = router
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// ViewController 로직 (예: 버튼 액션 등)
}RIB’s의 장점
- 모듈화: RIB’s는 애플리케이션을 독립적인 모듈로 분리하므로, 확장성과 유지보수가 쉽다.
- 재사용성: 비즈니스 로직과 라우팅 로직이 분리되어 있어 재사용이 용이하다.
- 테스트 용이성: 각 컴포넌트가 독립적이므로 단위 테스트하기 쉽다.
마치며
RIB’s는 큰 규모의 프로젝트나 복잡한 네비게이션 구조를 가진 애플리케이션에 특히 적합한 아키텍처 패턴이다.
이 패턴을 통해 iOS 애플리케이션의 구조와 코드 품질을 개선할 수 있다.
개발자로서 RIB’s를 학습하고 여러 프로젝트에 적용해보면 더욱 큰 경험을 얻을 수 있을 것이다.




