[swift] Swift VIPER 아키텍처 패턴
안녕하세요! 오늘은 Swift 언어를 사용하여 VIPER 아키텍처 패턴에 대해 알아보겠습니다. VIPER는 각각의 구성 요소가 명확하게 분리되고 관심사에 따라 역할을 분담하는 아키텍처 패턴입니다. 이 패턴을 사용하면 앱의 유지 보수성과 테스트 용이성을 향상시킬 수 있습니다.
VIPER 아키텍처
VIPER는 다음과 같은 구성 요소로 이루어져 있습니다:
- View: 사용자 인터페이스를 표시하고 사용자 입력에 반응합니다.
- Interactor: 비즈니스 로직을 캡슐화하고 데이터를 가져와 가공합니다.
- Presenter: Interactor에서 가져온 데이터를 View에 표시하고 사용자 입력을 처리합니다.
- Entity: 비즈니스 도메인에 대한 데이터 모델입니다.
- Router: 다른 화면으로의 전환을 처리합니다.
VIPER 아키텍처의 흐름
- 사용자는 View에서 이벤트를 발생시킵니다.
- View는 Presenter에게 사용자 입력을 전달합니다.
- Presenter는 Interactor에게 필요한 데이터를 요청합니다.
- Interactor는 데이터를 가져와 가공한 후 Presenter에게 전달합니다.
- Presenter는 View에 필요한 데이터를 전달하고 화면 갱신을 요청합니다.
- View는 Presenter로부터 전달받은 데이터를 화면에 표시합니다.
- 이벤트 처리가 끝나면 View는 Presenter에게 알립니다.
- Presenter는 Router를 사용하여 다른 화면으로의 전환을 수행합니다.
예시 코드
다음은 간단한 예시 코드입니다:
// View
protocol LoginView: class {
func showLoading()
func hideLoading()
func showError(message: String)
func navigateToHome()
}
// Presenter
protocol LoginPresenter {
func login(username: String, password: String)
}
class LoginPresenterImpl: LoginPresenter {
weak var view: LoginView?
let interactor: LoginInteractor
init(interactor: LoginInteractor) {
self.interactor = interactor
}
func login(username: String, password: String) {
view?.showLoading()
interactor.login(username: username, password: password) { [weak self] success in
self?.view?.hideLoading()
if success {
self?.view?.navigateToHome()
} else {
self?.view?.showError(message: "Login failed")
}
}
}
}
// Interactor
protocol LoginInteractor {
func login(username: String, password: String, completion: (Bool) -> Void)
}
class LoginInteractorImpl: LoginInteractor {
func login(username: String, password: String, completion: (Bool) -> Void) {
// 로그인 로직 처리
// 로그인 성공 시
completion(true)
// 로그인 실패 시
completion(false)
}
}
// Router
protocol LoginRouter {
func navigateToHome()
}
class LoginRouterImpl: LoginRouter {
weak var view: UIViewController?
init(view: UIViewController) {
self.view = view
}
func navigateToHome() {
// 홈 화면으로 전환하는 코드
}
}
결론
VIPER 아키텍처 패턴은 앱의 구성 요소를 분리하여 유지 보수성과 테스트 용이성을 향상시키는데 도움을 줍니다. 각각의 구성 요소는 독립적으로 테스트할 수 있기 때문에 버그를 찾고 수정하는 데 도움이 됩니다. VIPER 패턴을 사용하면 앱의 확장성과 유연성을 향상시킬 수 있습니다.