김니은 
KimN's Blog
김니은 
  • 분류 전체보기
    • Algorithm
      • Programmers
    • Develop
      • Swift
      • Flask
      • RubyonRails
      • AWS
      • Ardunio
      • Vue
      • Node.js
      • Infra
      • CS
    • IT Story
      • Hackintosh
      • GitHub
      • IT Review

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

  • Ruby on Rails
  • TOAST
  • SWIFT
  • 항상 맨 위
  • 카카오 챗봇
  • SWIFTUI
  • Ruby
  • Code Snippet

최근 댓글

최근 글

티스토리

반응형
hELLO
김니은 

KimN's Blog

[iOS] 아키텍쳐 VIPER 패턴
Develop/Swift

[iOS] 아키텍쳐 VIPER 패턴

2022. 5. 9. 10:05
반응형
 

 

 

VIPER 구성도

 

 
 
 
항목
내용
View
   Presenter의 요청에 따라 표시하거나, 사용자 입력을 Presenter로 보내는 작업을 진행합니다.
Presenter
   Interactor로부터 데이터를 가져오거나, View로 보내기 위한 데이터를 보내줍니다.
   이외에도 다음 화면으로 전환을 하는 Router를 이용할 때, View의 요청을 받기도 합니다.
Interactor
   Presenter의 요청을 받아 Entity 객체의 데이터를 가공하여 Output하는 로직 처리를 담당하고 있습니다.
Entity
   모델 객체입니다.
Router(WireFrame)
   화면 전환을 담당하며, 전환 시기(When)는 Presenter가 알고 있고 해당 부분은 어떻게(How)를 담당합니다.

 

 

이렇게 각자의 역할이 분할되어있어 해당 로직의 문제가 있을 때 빠르게 찾을 수 있습니다.

 

 

물론.. 뷰 하나를 만들기 위해서는 이러한 작업들을 처리해야하지만요..

 

저는 아래와 같이 프로토콜을 제작해 이용하고 있습니다.

 

protocol ViewProtocol: AnyObject {
    var presenter: PresenterProtocol? { get set }
    
    // Func
}

protocol WireFrameProtocol: AnyObject {
    static func createView() -> UIViewController

    // Func
}

protocol PresenterProtocol: AnyObject {
    var view: ViewProtocol? { get set }
    var interactor: InteractorInputProtocol? { get set }
    var wireFrame: WireFrameProtocol? { get set }
    
    // Func
}

protocol PresenterOutputProtocol: AnyObject {
    // Func
}

protocol InteractorProtocol: AnyObject {
    var presenter: PresenterOutputProtocol? { get set }
    
    // Func
}
 

 

또한 Presenter의 View나 Interactor의 Presenter 등을 참조할 때는 weak를 이용하여 약하게 참조하고 있습니다.

 

그리고 View에 Present 시 각자의 역할을 초기화 하는 작업은 wireframe에서 진행하고 있습니다.

 

view.presenter = presenter
presenter.view = view
presenter.wireFrame = wireFrame
presenter.interactor = interactor
interactor.presenter = presenter
 

 

또한 작업을 하면서 여러 예제를 찾아보면서 DataManager를 따로 제작하는 소스도 확인해봤습니다. 이러한 DataManager도 과연 프로토콜에 같이 채택해서 하는 것이 맞는 것일까? 란 생각이 있었는데 만약 정말 큰 데이터를 해당 뷰에서만 작업해야하는 경우나 그러한 데이터를 가공해야한다면 채택하는 것이 괜찮은 것 같습니다. 그 외에는 하나의 싱글톤으로 만들어 관리하는 것이 더 좋을 것 같은 생각이 드네요.

 

 

마지막으로 해당 패턴의 장점을 간단하게 말한다면...

 

  1. 재사용성과 테스트용이함을 위해 코드를 분리할 수 있습니다.
  2. 앱 컴포넌트를 분리할 수 있습니다.
  3. 새 기능을 추가하기 쉽습니다.
  4. UI 로직이 비지니스 로직으로부터 떨어져있기 때문에 자연스럽게 테스트를 만들기 쉬워집니다.

반응형
저작자표시 (새창열림)

'Develop > Swift' 카테고리의 다른 글

[Swift] cell indicator 색상 변경  (0) 2022.05.09
[iOS] Factory Method Pattern  (0) 2022.05.09
[iOS] View Lifecycle  (0) 2022.05.08
[iOS] Xcode Code Snippet  (0) 2022.05.08
[Objective-C] message, location으로 매개변수 이름정하면 에러..  (0) 2022.05.07
    'Develop/Swift' 카테고리의 다른 글
    • [Swift] cell indicator 색상 변경
    • [iOS] Factory Method Pattern
    • [iOS] View Lifecycle
    • [iOS] Xcode Code Snippet
    김니은 
    김니은 

    티스토리툴바