[swift] Swift VIPER 아키텍처 패턴

안녕하세요! 오늘은 Swift 언어를 사용하여 VIPER 아키텍처 패턴에 대해 알아보겠습니다. VIPER는 각각의 구성 요소가 명확하게 분리되고 관심사에 따라 역할을 분담하는 아키텍처 패턴입니다. 이 패턴을 사용하면 앱의 유지 보수성과 테스트 용이성을 향상시킬 수 있습니다.

VIPER 아키텍처

VIPER는 다음과 같은 구성 요소로 이루어져 있습니다:

VIPER 아키텍처의 흐름

  1. 사용자는 View에서 이벤트를 발생시킵니다.
  2. View는 Presenter에게 사용자 입력을 전달합니다.
  3. Presenter는 Interactor에게 필요한 데이터를 요청합니다.
  4. Interactor는 데이터를 가져와 가공한 후 Presenter에게 전달합니다.
  5. Presenter는 View에 필요한 데이터를 전달하고 화면 갱신을 요청합니다.
  6. View는 Presenter로부터 전달받은 데이터를 화면에 표시합니다.
  7. 이벤트 처리가 끝나면 View는 Presenter에게 알립니다.
  8. 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 패턴을 사용하면 앱의 확장성과 유연성을 향상시킬 수 있습니다.