Skip to content

221111_프로젝트 초기 구성

lymchgmk edited this page Nov 13, 2022 · 9 revisions

프로젝트 구조 구상

  • Clean Architecture 및 Coordinator 패턴을 적용한 프로젝트 구조 image

  • Application: AppDelegate & SceneDelegate + AppCoordinator

  • Resource: 앱에 필요한 자원 모음

  • Data: DTO 및 Repository class들

  • Domain: Entity, Repository protocol, UseCase protocol 및 Usecase Class

  • Presentation: Scene 관련 파일들(ViewController, ViewModel, View Coordinator)

  • Infrastructure: 네트워킹, Extensions 등 앱 공용으로 사용되는 로직들

  • 각 Scene은 ViewController, ViewModel, Coordinator를 가짐

  • 미리 프로젝트 폴더와 레퍼런스 코드를 작성해 두자

Coordinator 구조

  • 트리 구조
  • DIContainer를 이용한 의존성 주입

클린 아키텍처 용어 정리

  • Entity: 데이터 구조 및 함수 집합
  • Use cases: 시스템의 동작을 사용자의 입장에서 표현한 시나리오
    • 엔티티와의 데이터 흐름을 조정
  • Interface Adapter: Use cases에 가장 편리한 format에서 DB 등과 같은 외부 프레임워크에 가장 편리한 format으로 변환되는 곳
    • (View)Controllers, Gateways, Presenters 가 속함
  • Data: Data 레포지토리에서 DTO를 가공해서 Usecase에 전달

UIKit에서 SwiftUI Preview 사용

  • 레퍼런스 코드 미리 작성
/* VC의 Preview Canvas 코드 */
#if canImport(SwiftUI) && DEBUG
import SwiftUI

struct IntroViewController_Preview: PreviewProvider {
    static var previews: some View {
        IntroViewController().showPreview(.iPhone14Pro)
    }
}
#endif
/* VC에 SwiftUI Representable 적용 코드 */
#if canImport(SwiftUI) && DEBUG
import SwiftUI

extension UIViewController {

    private struct Preview: UIViewControllerRepresentable {
        let viewController: UIViewController

        func makeUIViewController(context: Context) -> UIViewController {
            return viewController
        }

        func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
        }
    }

    func showPreview(_ deviceType: DeviceType = .iPhone12Pro) -> some View {
        Preview(viewController: self).previewDevice(PreviewDevice(rawValue: deviceType.name()))
    }
}
#endif
/* UIViewPreview 생성 코드 */
#if canImport(SwiftUI) && DEBUG
import SwiftUI

struct UIViewPreview<View: UIView>: UIViewRepresentable {
    let view: View

    init(_ builder: @escaping () -> View) {
        view = builder()
    }

    // MARK: - UIViewRepresentable
    func makeUIView(context: Context) -> UIView {
        return view
    }

    func updateUIView(_ view: UIView, context: Context) {
        view.setContentHuggingPriority(.defaultHigh, for: .horizontal)
        view.setContentHuggingPriority(.defaultHigh, for: .vertical)
    }
}
#endif

CocoaPods로 프레임워크 설치

  • 모두 Apple M1으로 개발환경 동일
    • arch -x86_64 pod install 터미널 명령으로 설치
Clone this wiki locally