개발아 담하자

[iOS] Tuist 를 활용한 프로젝트 모듈화 (2) 본문

📱 iOS

[iOS] Tuist 를 활용한 프로젝트 모듈화 (2)

choidam 2022. 8. 25. 00:30

Tuist 모듈화 1편 

https://silver-g-0114.tistory.com/150?category=1094592 

 

[iOS] Tuist 를 활용한 프로젝트 모듈화 (1)

안녕하세요! 굉장히 오랜만에 포스팅을 작성합니다. 오늘은 tuist 를 활용한 프로젝트 모듈화를 소개해보려고 합니다. 회사에서는 이미 tuist 를 사용하고 있었지만 기능 단위로 모듈화를 하고 있

silver-g-0114.tistory.com

 

저번 포스팅에서는 모듈화를 하기 위한 환경 설정을 끝냈고,

이번에는 환경 설정 이후 어떻게 프로젝트를 관리하는지 세부적인 내용을 살펴보도록 하겠습니다.

 

tuist generate 이 된 상태에서는 당연히 앱이 바로 실행되지 않습니다.

Target 만드는 곳에서 작성했듯 Info.plist 파일들은 자동으로 추가 되어 있는 상태고 

프로젝트 빌드하는데 필요한 다른 파일들을 추가해야 합니다.

 

Sources 폴더에 AppDelegate, ViewController 파일을 추가해 줍니다.

@main class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil
    ) -> Bool {
        window = UIWindow(frame: UIScreen.main.bounds)
        let viewController = ViewController()
        window?.rootViewController = viewController
        window?.makeKeyAndVisible()
        return true
    }
    
}
open class ViewController: UIViewController {
    
    open override func viewDidLoad() {
        super.viewDidLoad()
        
    }
}

 

만약 정상적으로 실행이 되지 않는다면

추가한 파일의 target membership 부분이 제대로 체크되어 있는지 꼭 확인해 주세요!

 

모듈화 활용하기

1. 모듈 불러오기

기능별로 모듈화를 시켰는데 어떻게 활용하면 좋을까욤?!

 

저는 App 타겟 내부에 Home 타겟, MyPage 타겟을 포함시켜보려고 합니다.

(App 에서는 전체 테스트가 가능하고, Home 에서는 홈 테스트, MyPage 에서는 마이페이지 테스트가 가능한 구조)

 

그러려면 앱타겟에서 홈 모듈, 마이페이지 모듈을 각각 불러올 수 있어야 겠죠..?!

let project = Project.app(name: projectName,
                          platform: .iOS,
                          iOSTargetVersion: iOSTargetVersion,
                          infoPlist: infoPlistPath,
                          dependencies: [
                            .project(target: "Home", path: .relativeToCurrentFile("../Home")), // Home 추가
                            .project(target: "MyPage", path: .relativeToCurrentFile("../MyPage")) // MyPage 추가
                          ])

App의 project 파일에서 dependencies 에 프로젝트를 추가한 후 

tuist generate 시켜줍니다.

 

그러면..?!

app 타겟 내부 파일에서 홈과 마이페이지 임포트가 가능합니다!

import Home
import MyPage

이제 앱타겟에서 홈, 마이페이지 접근이 가능해집니당

 

2. Resources 불러오기

분리한 여러 모듈들 사이에 공통으로 사용하는 resources 가 있기 마련입니다.

각각 하나하나 넣어주기 보다는 공통으로 사용하는 리소스는 한 곳에서 관리하는 것이 바람직해 보입니다.

tuist 공식 문서에서는 이 리소스들 관리를 지원해준다고 하네요!

저는 asset, font 를 살펴보려고 합니다.

 

저는 공통 리소스를 관리하기 위해 CommonUI 타겟을 만들었고,

CommonUI Resources 폴더에 asset과 폰트를 추가했습니다.

그리고 중요한 건!! 리소스에 파일들을 추가한 후 tuist generate 을 해줍니다.

그러면,,

Derived 폴더 내부에 없던 파일이 생겨납니다.

새로 생긴 Assets+CommonUI, Fonts+CommonUI 가 뭔지 살펴보자면

// swiftlint:disable identifier_name line_length nesting type_body_length type_name
public enum CommonUIAsset {
  public static let commonGreen = CommonUIColors(name: "commonGreen")
  public static let commonYellow = CommonUIColors(name: "commonYellow")
  public static let homeIcon = CommonUIImages(name: "homeIcon")
  public static let mypageIcon = CommonUIImages(name: "mypageIcon")
}
// swiftlint:enable identifier_name line_length nesting type_body_length type_name
// swiftlint:disable identifier_name line_length type_body_length
public enum CommonUIFontFamily {
  public enum Pretendard {
    public static let bold = CommonUIFontConvertible(name: "Pretendard-Bold", family: "Pretendard", path: "Pretendard-Bold.otf")
    public static let extraBold = CommonUIFontConvertible(name: "Pretendard-ExtraBold", family: "Pretendard", path: "Pretendard-ExtraBold.otf")
    public static let extraLight = CommonUIFontConvertible(name: "Pretendard-ExtraLight", family: "Pretendard", path: "Pretendard-ExtraLight.otf")
    public static let light = CommonUIFontConvertible(name: "Pretendard-Light", family: "Pretendard", path: "Pretendard-Light.otf")
    public static let medium = CommonUIFontConvertible(name: "Pretendard-Medium", family: "Pretendard", path: "Pretendard-Medium.otf")
    public static let regular = CommonUIFontConvertible(name: "Pretendard-Regular", family: "Pretendard", path: "Pretendard-Regular.otf")
    public static let semiBold = CommonUIFontConvertible(name: "Pretendard-SemiBold", family: "Pretendard", path: "Pretendard-SemiBold.otf")
    public static let all: [CommonUIFontConvertible] = [bold, extraBold, extraLight, light, medium, regular, semiBold]
  }
  public static let allCustomFonts: [CommonUIFontConvertible] = [Pretendard.all].flatMap { $0 }
  public static func registerAllCustomFonts() {
    allCustomFonts.forEach { $0.register() }
  }
}

내가 작성하지 않은,, 번들 파일들(?) 을 만들어줍니다. 문서를 더 살펴봐야겠지만

 

이게 뭐냐면 다른 타겟에서 import CommonUI 를 해줬을 경우

	private let titleLabel = UILabel().then {
        	$0.text = "Home VC"
        	$0.font = CommonUIFontFamily.Pretendard.bold.font(size: 15) // CommonUI font 불러오기
    	}
    
    // ..
    
    	view.backgroundColor = CommonUIAsset.commonYellow.color // CommonUI Asset 불러오기

이렇게 활용할 수 있습니다

너무 신기하지 않나욤..?!

 

https://github.com/choidam/tuist_sample

 

GitHub - choidam/tuist_sample: tuist 샘플 코드 레포지토리입니다.

tuist 샘플 코드 레포지토리입니다. Contribute to choidam/tuist_sample development by creating an account on GitHub.

github.com

코드 이것저것 생략한 게 많은데 전체 코드를 보면 이해할 것입니당 (계속 업데이트중)

 

아무튼 다른 활용법은 너무 졸려서 3탄에 계속. .