👋 들어가기 전
네이버 부스트 캠프의 마지막 과정인 그룹 프로젝트에서 본격적으로 개발을 들어가다보니
학습정리나 근황글을 쓸 여유가 정말 많이 부족했다.. 주말에도 프로젝트를 진행하고 조금의 여유는
당연히 침대에서 쉬지 않으면 컨디션 관리가 안된다..
부스트 캠프 수료 1주일 전이 되서야 뒤를 돌아볼 시간이 생겨 오늘부터 조금 씩 정리 해보려 한다.
🚧 Tuist를 그룹 프로젝트에 도입한 이유
우리는 프로젝트 기획이 마무리 될 때 쯤 다들 이번 프로젝트에서 배우고 싶은 경험들을
이야기하는 시간을 가졌다.
정말 좋고 건설적인 주제들이 많이 나왔고 프로젝트 그 중에서도 "모듈화"라는 주제가 가장 많이 나왔다.
다들 모듈화에 관심이 많았고 프로젝트를 통해 경험하고 싶다는 의견이 많았다.
하지만 여기서 나는 오히려 걱정이 됐다. 모듈화는 정말 좋은 개념이지만 경험이 없는 인원이 많고
러닝 커브도 매우 높아 배워야할 사전 지식이 정말 광범위 했다.
무엇보다 모듈화만 이 프로젝트에서 배우는 시간이 되어서는 안된다.
정해진 시간 6주에 모듈화를 경험하는 방법은 크게 2가지가 있다.
첫번 째는 오직 xcode로만 모듈화를 진행하는 방법이다.
개인적으로 가장 좋은 방법이라고 생각한다.
기본적인 환경에서 모듈화를 경험하며 많은 벽에 부딪히고 벽을 부수며도전적인 경험을
얻을 수 있을 것 같다.
하지만 많은 벽에 부딪히는 만큼 프로젝트에서 모듈화를 위한 시간이 많이 뺏기게되면
그 만큼 프로젝트 구현에 좋지 않은 영향을 끼칠 수 있다.
두번 째 방법으로는 모듈화를 도와주는 도구를 사용하는 것이다.
모듈화를 직접하지 못하고 첫번 째 방법보다 부딪히는 벽은 적고 얇은 단점이 있지만
시간적인 측면과 안정성이 많이 올라간다고 생각한다.
그렇다고 도구를 사용한다고 벽이 없는 것은 아니다. 결국에는 모듈화를 하기위해선
모듈을 구성하는 여러가지 요소의 개념, 요소들을 설정하는 방법 , 의존성 관계 설계 등
여전히 도전적인 벽이 존재한다고 생각한다.
그래서 우리 Shook팀은 두번 째 방법으로 선택했고
나는 이미 경험이 있는 Tuist를 제시하여 도입하기로 결정이되었다.
🍔 Tuist의 먹이기
결국 Tuist도입에 결정적인 역할을한건 Tuist를 제시한 나라고 생각한다 ..
나는 우리팀에게 Tuist를 통해 모듈화를 좀 더 쉽게 경험하기위해
Tuist 꼭꼭 씹어서 입에 넣어주기 계획을 짰다.
나도 많이 부족하지만 조금이라도 경험이 있으니 부디 팀원들이 Tuist 관련 어려움이 있을 때
도움이 될 수 있도록 많은 사전준비가 필요했다.
꼭꼭 씹어서 입어 넣어주기는 크게 2가지 계획으로 나뉘어진다.
1. Tuist 사용 전 사전 지식
첫번 째 계획은 Tuist와 상관 없이 Xcode에서 앱을 만들 때 필요한 다양한 지식을 정리하고 공유하는 과정이다.
개념을 이해했다는 것은 , 아무것도 모르는 사람에게 그 개념을
이해하게 설명이 가능할 때 개념을 이해 한 것
라고 어디서 들어 본 것 같다.
나는 이 과정에서 내가 아직 개념을 완전히 이해하지 못했다는 것을 다시 한번 뼈저리게 느꼈다.
아래 두 포스팅은 팀원들에게 Tuist 사용하기 전 사전 지식으로 설명했던 내 정리 글이다.
여전히 부족하지만 프로젝트가 끝난 후에 다시 다듬어보자.
2. Tuist를 보다 쉽게 사용하기 위한 세팅
다음 사진은 Tuist를 처음 사용하는 팀원들을 위한 여러가지 세팅이다.
Tuist 도입을 다시 한번 고민하게 되는 작업량이지만 돌이킬 수 없다. 우리 팀원들을 위해서 개조를 시작해보자.
📌 Setup 스크립트 적용
Tuist와 함께 컨벤션 또는 포맷팅과 관련된 스크립트를 적용한다.
대표적으로 swintlint와 swiftFormat이 있다.
1. Setup.sh
팀원들이 프로젝트를 시작하기 전 필요한 소프트웨어 설치 여부를 판단하고 설치가 되어있지 않으면 설치한다.
# brew 확인
if test -d "/opt/homebrew/bin/"; then
PATH="/opt/homebrew/bin/:${PATH}"
fi
if which swiftlint > /dev/null; then
echo "✅ swiftlint 설치 확인"
else
echo "❌ swiftlint 설치 필요, swiftlint를 설치합나다."
brew install swiftlint
fi
if which swiftformat > /dev/null; then
echo "✅ swiftformat 설치 확인"
else
echo "❌ swiftformat 설치 필요, swiftformat을 설치합나다."
brew install swiftformat
fi
....
2. SwiftFormat 적용하기
SwiftFormat은 swiftLint와 다르게 직접적인 코드 수정으로 규칙적인 포맷팅을 유지할 수 있게 도와주는 툴 이다.
여기서 고민은 빌드 또는 커밋마다 포맷이 돌아가면 작업자의 코드외 쪽 수정이 너무 많이 생기게된다.
그래서 git에서 제공해주는 hook을 이용하면 좋을 것 같다.
아래는 이번 적용을 하며 배운 git hooks관련 정리 포스팅이다.
여기서 pre-push 즉, push 되기 직전에 한번 검사를 하면 좋을 것 같다.
이러면 SwiftFormat으로 인한 수정사항이 단 1개의 커밋으로 감싸지기 때문에 기록을 추적하기 편한다.
3 결과
잘 적용이 되면 다음과 같이 나오고 그렇지 않으면 자동으로 설치가 된다.
🔌 플러그인 만들기
Tuist는 여러 설정은 Manifests의 ProjectDescriptionHelpers 쪽에서 이루워진다.
여러 재사용할 코드를 무분별하게 작성할 시 , 어디에 무슨 코드가 있는 지 찾기 힘들다 ..
Tuist의 공식 기술블로그에서 Plugin이란 재새용가능한 코드를 목적에 따라 묶어놓은 개념이다.
모듈화를 도와주는 모듈 같은 느낌
많은 참고자료를 통해 다음과 같이 4가지 플러그인을 만들었다.
1. Configuration 플러그인
- Configuration은 앱을 빌드할 때 설정할 수 있는 다양한 옵션들을 그룹화 한 내용
- 대표적으로 debug와 release가 있다.
- 프로그램 실행에 환경에 따른 여러가지 분기를 위해 사용하며 대표적으로 xcconfig 분기등이 있다.
2. Dependency 플러그인
- 의존성 관련 플러그인
- 경로 의존성과 SPM 관련 의존성이 명시되어 있다.
3. Environment 플러그인
- 프로젝트 전반적인 환경을 미리 정의한 플러그인
4. Template 플러그인
- 템플릿 관련 플러그인
- tuist scaffold에 사용될 Template와 stencil(더미 내용)이 정의되어있다.
- 반드시 Templates 폴더 아래에 존재야한다. 그래야 추적할 수 있음
🔨 Extension 정의
첫번째 과에서 앱을 구성하는 기본적인 요소들을 설명하고 공유했다.
이번에는 실제 Tuist에서 그 요소들을 쉽게 사용할 수 있도록 Extension으로 구성을 해놓으려한다.
파일명을 보면 되게 익숙한 내용이 많다.
plist, settingDictionary, schme 등 .. 이 부분이 현재까지도 팀원분들한테 가장 편하게 사용하고
있다는 부분이라 듣고 있다.
굉장히 만족 한다. 😀
⚙️ 자동화 스크립트 적용
대망의 하이라이트다.
우리는 Tuist를 사용할 때 TMA( The Modular Architecture)를 사용하기로 했다.
우리는 동시에 여러 기능을 개발하고 빌드하고 테스트를 함으로써 모듈화의 이점을 가져가야한다.
이때 독립적인 개발환경과 테스트 , 더 나아가 외부 모듈간의 의존성을 유연하게 대처하기 위해
잘 열려진 TMA를 채택했다.
구조는 다음과 같다.
간단한게 보면 한 모듈에 최대 5개의 타겟이 생기게 되며 위 사진과 같이
각 타겟에 대한 별도의 의존성을 연결해줘야한다.
이 작업을 매번 모듈을 만들 때마다 해줘야한다 ?? .. 너무 힘들다.
그래서 나는 swift를 통한 자동화 스크립트를 만들려한다.
스크립트를 실행하면 Layer, 모듈 이름을 받고 필요한 타겟들의 여부를 조사한다.
이후 위에서 소개한 TemplatePlugin인에 있는 Template과 stencil을 이용해서 더미를 만들어준다.
이 기능 역시 팀원들에게 많은 칭찬을 받았다.
아직 프로젝트가 끝난 것은 아니지만 아래와 같이 정말 많은 모듈을 만들어 프로젝트를 진행하고 있다.
😂 글을 마무리하며
사실 정말 많이 힘든 과정이였다.
이전에 사용했던 프로젝트를 많이 참고하고 또 더 쉽게 만들기위해 개인적으로 많이 고민했다.
위 과정과 사용법을 설명하는데 족히 7시간 이상을 걸려 그룹프로젝트 일정의 하루가 다 날라갔다.
설명이 끝나고 나서 예상과 다른 반응에 많이 당황했다.
팀원들은 대부분 내가 이걸 잘 사용할 수 있을까? 또는 모듈화를 처음 사용하는 두려움이 많이 느껴졌다.
나 역시 모듈화를 다른 프로젝트에서 처음 경헐할 때 똑같았다.
좋긴 하지만 너무 어려웠다. 하지만 역시 사람은 적응에 동물이랄까 지금은 팀원들이 나에게 오히려
Tuist를 이용하여 색 다른 경험을 주고 있다.
대표적으로 우리팀의 홍일점인 인예님께서 우리 프로젝트의 핵심인 핸드폰 화면을 녹화화기 위한
broadcast upload extension이라는 appExtension을 추가해야하는데
나는 appExtension을 추가해본 경험이 없었다.
근데 이걸 혼자서 공부하고 연결에 성공하여 나에게 그 과정을 설명하는데 정말 많이 놀랐다.
솔직히 내가 도와줘야하지는 않을까 하는 걱정이 많았는데 끈기와 인내로 그것을 해내며
Tuist를 조금씩 적응해가는걸 보며 정말 많은 뿌듯함을 느꼈다.
프로젝트에 필요한 초기 세팅을 태어나서 처음 해보는데 정말 힘들고 보람찬 작업인 것 같다.
다른 프로젝트에서 위 역할을 해주시며 좋은 지식을 배풀어주시는 백튼님께 다시한번 감사의 말씀을 드린다.
이번 프로젝트 세팅에서도 백튼님의 많은 글들이 좋은 참고자료가 되었다.
위에서 소개드린 broadcast upload extension 적용을 위한 인예님의 도전은 아래 pr에서 살펴보길 바란다.
'iOS > Tuist' 카테고리의 다른 글
Tuist 탬플릿 만들기 (1) Make File (0) | 2024.11.09 |
---|---|
Tuist 구성 파일 (0) | 2024.11.03 |
Framework vs Library (3) | 2024.11.03 |
프로젝트 생성 관련 사전 지식 (2) | 2024.11.02 |
Tuist란? (1) | 2024.11.02 |