Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/overall project structure #22

Open
wants to merge 5 commits into
base: develop
Choose a base branch
from

Conversation

hihiboss
Copy link
Collaborator

@hihiboss hihiboss commented Sep 8, 2019

Pull Request

resolve: #1
resolve: #2
resolve: #3
resolve: #4
resolve: #5

전체적인 프로젝트 구조와 주요 화면(Main, Stopover, End, Setting - 제플린에 사용된 네이밍 규칙 사용)의 구조를 잡았다.

구조 이해가 힘들 수 있어 MVP 디자인 패턴 설명과 더불어 프로젝트 구조에 대해서도 설명한다.

기존의 MVC 패턴

MVC 디자인 패턴은 Model-View-Controller 로 이루어진 디자인 패턴이다.
(MVC 패턴의 자세한 설명은 검색을!!)

이 때 사용하는 Model, View, Controller 는 Layer라고 부른다.

MVC 패턴은 비즈니스 로직을 Model Layer에 구현하여 UI 로직과 분리할 수 있다는 장점을 가진다.
그러나 UIViewController 는 너무 많은 UI 로직을 구현하게 되어 거대해진다.

거대하다는 것은 곧 유지 보수가 힘들다는 말 :(

Navigation 로직, 버튼 활성화/비활성화, 키보드 보이기/숨기기, 이미지 이동하기, UI 내 데이터 변경 등과 같이 UI와 관련된 로직은 너무 많다.
뿐만 아니라, 사용자의 터치 등과 같은 제스처도 처리해야 한다.

그래서 Controller Layer의 부담을 줄이기 위해 등장한 것이 MVP 패턴이다.

MVP

MVP 디자인 패턴은 Model-View-Presenter 로 이루어진 디자인 패턴이다.

  • Model Layer는 비즈니스 로직을 담당한다. 데이터를 이용하는 기능 위주의 핵심 로직이라고 생각하면 될까...
    우리가 출발지, 도착지 데이터로 경로 데이터를 만든다 등의 로직이 여기에 속한다.
    (예상 소요 시간, 따릉이 예상 요금 등의 계산도 이 로직에 다 포함된다.)
  • View Layer는 UIView와 UIViewController로 구성되어 UI를 구성하고 사용자의 인터랙션(터치, 스와이프 등)을 Presenter Layer에 전달한다.
  • Presenter Layer는 사용자의 인터랙션을 처리하며, 이를 위해 Model Layer와 데이터를 주고 받는다.
    Model Layer의 데이터를 가공하여 UI에 사용하기 좋은 형태로 바꾸고 View를 업데이트한다.
  • (Swift) Presenter LayerUIKit과 의존성이 없어야 한다.
    프로토콜로 정의된 함수를 사용하여 UI를 조작하지만 실제로 UI 조작에 관여하지 않는다.
    UI 조작은 프로토콜을 구현한 View Layer의 UIViewController가 한다.
    (Swift의 Protocol이 여기서 진가를 발휘함)

프로젝트 구조 설명

프로젝트 내 패키지는 크게 Resource, Common, Extension, Main, Stopover, End, Setting으로 구성했다.

Resource

버튼에 사용되는 이미지, 영상, lottie 파일 등을 두는 패키지.
코드와 상관 없는 외부 리소스 파일을 모아둔다고 생각하면 될 것 같다.

Common

여러 패키지에 공통으로 사용되는 코드를 두는 패키지.

여러 곳에서 사용되는 코드는 여기에 코드를 구현하고 각 패키지에서 이를 가져다 사용하면 재사용성이 올라가겠죠? :)

Extension

기존에 구현된 코드에 대해 추가 구현한 코드를 두는 패키지.

예를 들어, UIColor 패키지에는 Apple의 기본 컬러들이 구현되어 있지만, Extension/UIColor+.swift 파일을 보면 제플린에 사용된 color들을 구현하였다.
이를 사용할 때는 UIColor.xxx와 같은 형태로 사용하면 된다.

이와 같이 기존의 구현된 것을 확장하고자 할 때 사용하는 패키지.

Main, Stopover, End, Setting

우리의 주요 화면들을 각각 분리한 패키지들.
Main은 첫 지도 화면, Stopover는 경유지 선택 화면, End는 결과 화면, Setting은 계정 정보 및 주행 기록 화면이다.
(네이밍은 제플린을 따랐음!!! 내 의견 아님~~)

각 패키지에는 Model, View, Presenter 패키지가 존재한다.

Model은 Model Layer에 해당하는 패키지다.
Location.swift와 같이 데이터를 정의하는 파일과 LocationService.swift와 같이 데이터를 이용하는 로직이 구현된 파일이 존재한다.

View는 UI 관련된 파일이 존재한다.
UIViewController들이 존재할 것이고, Presenter가 사용할 프로토콜을 구현한 xxViewController+ViewProtocol.swift 파일이 존재할 것이다.
이외에 UI 구현에 필요한 UIView 파일들도 여기서 구현하면 된다.

Presenter는 UI 데이터 가공과 인터랙션 처리를 담당한다.
xxViewData.swift는 가공된 UI 데이터를 의미한다.
xxViewProtocol.swift은 Presenter가 UIViewController의 구현체를 알지 않으면서 UI 처리하기 위해 존재한다.
xxPresenter.swiftxxViewData.swiftxxViewProtocol.swift를 사용하여 자신의 임무를 수행한다.

참고

예제 코드를 보고 싶다면 밑의 링크 참고!
http://iyadagha.com/using-mvp-ios-swift/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
1 participant