티스토리 뷰

Tuist

Tuist - What is Tuist?

DevDiana 2024. 6. 19. 20:57

안녕하세요 Diana 입니다.

 

오늘은 Tuist에 대해 알아보려고 합니다.

 


 

Tuist는 Xcode 프로젝트를 코드로 정의하고 생성, 관리하는 CLI 도구입니다. 

우리는 Tuist를 사용해 Xcode 프로젝트를 대규모로 생성, 유지, 관리할 수 있습니다.

여태 사용해온 CocoaPods나 SPM 같은 의존성 관리자와는 결이 다른데, 이들이 의존성을 관리한다면 Tuist는 Xcode 구성 자체를 관리합니다. iOS 프로젝트를 위한 Infrastructure as Code 인 것이죠.

그럼 시작 전에 의존성 관리자에 대해 알아보고자 합니다.

 

✅ 의존성 관리자란?

의존성(Dependency)는 내 프로젝트가 동작하기 위해 의지하는 외부 코드입니다.
예를 들어 프로젝트에서 Alamofire를 사용한다면 내 프로젝트는 Alamofire에 의존 하는 것이죠.

직접 만들지 않고 가져다 쓰는 라이브러리, 프레임워크가 전부 의존성입니다.

 

이때 이 의존성들을 일일이 관리한다고 해보겠습니다. 라이브러리를 깃허브에서 직접 받아 프로젝트에 드래그 하고 버전 업데이트를 할때마다 다시 받고 그 라이브러리가 또 다른 라이브러리를 필요로 하면 그걸 추적하고, 두 라이브러리가 같은 라이브러리의 서로 다른 버전을 요구하면 충돌을 해결하고... 정말 할게 셀수 없이 많아집니다.
이 모든 것을 자동화 해주는 도구가 의존성 관리자 입니다.

핵심 책임은 네가지 입니다.

 

1. 어떤 의존성이 필요한지 파악하고, 2. 호환되는 버전을 결정하고, 3. 소스(Git 등)에서 다운로드하고, 4. 프로젝트에 통합하는 것

이게 의존성 관리자의 책임입니다.

 

원리를 단계별로 보면 아래와 같습니다.

 

1. 선언(Declaration): 필요한 의존성을 메니페스트 파일에 명시합니다. SPM은 Package.swift, CocoaPods는 Profile입니다.

여기에 우리는 "나는 00라이브러리 x.x 버전대가 필요해" 등을 기록해 놓습니다.

 

2. 의존성 그래프 구성: 프로젝트를 위해 부른 라이브러리들도 자신만의 의존성을 가집니다. A를 불렀을 때 A가 B를 필요로 하고 B는 C를 필요로 하는 경우가 발생할 수도 있는 것이죠. 이렇게 내가 직접 부르지 않았지만 따라오는 것을 전이 의존성이라고 합니다.

관리자는 이 전체를 그래프로 펼쳐 빠짐없이 수집합니다.

 

3. 버전 명세 및 시맨틱 버저닝: 버전은 보통 [메이저.마이너.패치] 형식의 시맨틱 버저닝을 따릅니다. 메이저가 바뀌면 호환성이 깨지는 변경, 마이너는 기능 추가(호환 유지), 패치는 버그 수정이라는 약속이 따르죠. 그래서 매니페스트의 버전을 적을때 SPM은 from: "5.0.0"은 보통 "5.0.0 이상 6.0.0 미만"을 의미합니다.

 

4. 버전 해석(Resolution): 버전 해석은 의존성 관리자의 핵심 원리로 가장 어려운 문제는 같은 라이브러리를 여러 곳에서 서로 다른 버전 조건으로 요구하는 경우 입니다. 흔히 다이아몬드 의존성 문제라고 불리며 그림으로 설명하면 아래와 같습니다.

A는 C가 1.0 이상이어야 하며 B는 1.2 이상을 요구합니다. 해석기는 이 두 조건을 동시에 만족하는 단 하나의 버전을 찾아야하죠. 여기서 1.5.0이 둘다 만족하니 그것을 선택합니다. 만약에 도저히 양립할 수 없는 조건을 걸면 해석 자체가 실패하고 우리가 보는 버전 충돌 에러가 발생합니다.

 

이 해석 과정은 사실 제약 충족 문제(Constraint satisfaction) 입니다. 조건을 만족하는 조합을 찾다가 막다른 길에 부딪히면 Back Tracking을 통해 다른 버전을 시도하죠. SPM은 이것을 PubGrub이라고 하는 알고리즘으로 처리하며 Cocoapods는 Molinillo 라는 해석기를 사용합니다.

 

5. 락 파일(Lock file)로 고정: 해석이 끝나면 실제로 선택된 버전들을 파일에 기록합니다. SPM은 Package.resolved, Cocoapods는 Podfile.lock 에 기록됩니다.

이 파일이 중요한 이유는 바로 재현성 때문입니다.

Manifest 파일에는 "5.x대*처럼 범위로 적혀 있어도 락 파일엔 정확한 버전이 박혀 있어 팀원 모두와 CI가 토씨 하나 틀리지 않는 같은 버전을 받게 됩니다. 락 파일을 버전 관리에 커밋하는 이유는 여기 있습니다.

 

6. 패치, 통합: 마지막으로 결정된 버전들을 소스에서 내려받고, 빌드해서 프로젝트에 연결합니다.

 

여기까지가 의존성 관리자의 핵심 원리입니다. 이제 이것을 Tuist와 연결지어 보도록 하겠습니다.

 

✅ About Tuist

Tuist는 .xcodeproj / xcworkspace 같은 복잡한 파일을 직접 다루는 대신, Project.swift 라는 Manifest에 Swift 코드로 프로젝트 구조(타겟, 의존성, 빌드 설정, 스킴 등)을 선언하면 Tuist가 이를 읽어 실제 Xcode 프로젝트 파일을 생성해줍니다.

 

Tuist를 사용하는 이유는 무엇보다 .xcodeproj 머지 컨플릭트 지옥을 예방하기 위해서 입니다.

 

여기서 .xcodeproj는 Xcode 프로젝트의 설정 묶음으로 흔히 "프로젝트 파일"이라 불리지만 실제로는 파일 하나가 아닌 여러 파일이 든 폴더입니다.

.xcodeproj 는 소스 코드를 담고 있지 않습니다. 소스 파일은 디스크에 따로 있고 .xcodeproj는 그것들을 참조하며 "어떻게 빌드할지"를 기록하죠.

.xcodeproj 안에서 제일 중요한 것은 project.pbxproj으로 아래의 내용들을 담고 있습니다.

  • 어떤 소스/리소스 파일들이 프로젝트에 속하는지 (파일 참조 목록)
  • 타겟(target): 빌드 결과물 단위. 앱 본체, 테스트, 위젯 익스텐션 등
  • 빌드 설정(build settings): 배포 타겟 버전, 서명 설정, 컴파일러 플래그 등
  • 빌드 단계(build phases): 컴파일 → 리소스 복사 → 스크립트 실행 같은 순서

 

다시 Tuist로 돌아와서, .xcodeproj는 XML 기반이라 머지가 어렵고 오류가 생기더라도 수정이 쉽지 않습니다. 하지만 Tuist를 사용하면 Project.swift에 Swift 코드로 정의하므로 리뷰와 머지가 훨씬 쉬워집니다.

실무에서는 보통 .xcodeproj와 .xcworkpace 파일을 .gitignore에 넣고 Manifest 파일만 버전 관리 하기 때문에 컨플릭트가 사라집니다.

 

그리고 Tuist를 사용하는 두 번째 이유는 Tuist는 앱을 여러 모듈과 프레임워크로 쪼개는 것을 쉽게 만들어 빌드 시간과 코드 구성을 개선해주기 때문입니다.

 

세 번째 이유는 빌드 캐싱입니다. Tuist는 컴파일된 프레임워크를 캐싱하여 팀원간 공유할 수 있고 이걸로 빌드 시간을 비약적으로 줄일 수 있습니다.

 

네 번째는 일관성 입니다. 팀원 모두가 같은 Manifest 파일로 동일한 프로젝트 구성을 생성하기 때문에 싱크를 맞추기 더욱 쉬워집니다.

 

✅ Tuist의 작동 원리

Tuist의 작동 원리는 아래와 같습니다.

 

1. Swift로 Manifest 파일 생성: Project.swift, Workspace.swift는 일반 데이터 포멧이 아니라 실제로 Swift 파일로 구현됩니다. Tuist API는 SPM에서 영감을 받아 만들어졌고 ProjectDescription이라는 라이브러리를 제공하여 프로젝트, 타겟, 스킴 등을 선언할 수 있게 합니다.

Tuist는 Swift기 때문에 상수, Helper 메소드, 익스텐션을 직접 만들어 반복을 줄일 수 있다는 것과 익숙한 언어로 인한 접근성 측면에서 장점을 가지고 있습니다.

 

2. tuist generate로 인한 Manifest 컴파일 및 실행: Tuist는 Swift Manifest를 컴파일해서 실행하고 거기서 나온 모델을 바탕으로 .xcodeproj / .xcworkspace 를 만들어냅니다. 이 Manifest 파일은 언제나 Source of Truth가 됩니다.

 

3. Configuration by Convention: Tuist는 관례에 의한 설정(Configuration by Convention) 철학을 따라 프로젝트 구조에 대한 고민의 복잡도를 덜어내고 구성보다 내용에 집중합니다. 

'Tuist' 카테고리의 다른 글

Tuist - KakaoMapsSDK v.2 with Tuist v.4  (0) 2024.06.23
Tuist - Tuist v4 업데이트  (0) 2024.06.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함