[Xcode] XCTemplate(FileTemplate)을 통해 팀 생산성을 높여보자

딜라이트룸 iOS 그룹의 생산성 높이기

Lee Di
DelightRoom
9 min readSep 14, 2022

--

서론

최근 iOS Group은 생산성을 증진시키는 작업의 일환으로 XCTemplate과 CodeSnippet을 적용하였습니다. 이를 통해 우리는 조금 더 반복적이고 불필요한 작업의 비용을 줄이고 코드의 품질과 설계에 비용을 할애할 수 있게 되었습니다.

Why ?

XCTemplate과 CodeSnippet과 같은 Code 자동화는 왜 필요할까요 ? 🤔 제가 집중한 문제는 다음과 같았습니다.

  1. 반복적이고 불필요한 작업들에 낭비되는 비용
  2. 일관되지 못한 코드로 떨어지는 가독성

분명히 팀 전체에 직접적인 영향을 끼치는 문제였고 해결의 여지가 있는 문제였습니다. 문제가 명확하게 정해지니 목적은 명확하게 귀결되었습니다.

  1. Code 자동화를 통하여 코드 작성의 비용을 절감 할 수 있다.
  2. Group 내 합의로 정해진 컨벤션 자동화에 녹여 가독성을 높일 수 있다.

그리고 비용 절감이 가장 큰 목적인 만큼,

3. 쉬운 배포를 통해 적용하는 비용을 최소화 시킬 수 있다.

를 추가적인 목표로 XCTemplateCodeSnippet 작업을 진행하였습니다. 그리고 오늘은 그 중 XCTemplate 에 대하여 이야기 해보고자 합니다.

What is XCTemplate ?

XCTemplate 낯선 분들을 위해 먼저 사전 정보부터 맞춰나가겠습니다.

다들 File을 생성할 때 다음과 같은 화면을 자주 보실 텐데요.

여기 있는 각각의 Template을 우리는 XCTemplate / FileTemplate이라고 부릅니다. 사실 우리는 이미 XCTemplate을 쓰고 있던 것이죠!

그렇다면 우리가 너무나 낯선 무언가를 만들고 있지 않다는 것에(참고할 Template이 있다는 것에) 안도를 하며 다음 이야기로 넘어가 보겠습니다.

XCTemplate Folder 만들기

XCTemplate은 기본적으로 꼭 folder 기반입니다. 바로 위의 이미지 처럼 하나의 .xctemplate folder내부에 필요한 file들을 넣어놓은 형식으로 구성이 됩니다.

그리고 이 folder내부에는 다음의 file이 반드시 필요합니다.

  • TemplateIcon.png
  • TemplateInfo.plist
  • ___FILEBASENAME___.swift
  1. TemplateIcon.png
  • 예상하셨겠지만, File Template의 Thumnail Image입니다.
swift와 SWIFT가 그려진 이미지가 이에 해당합니다.

2. TemplateInfo.plist

  • Template이 생성되는 데에 필요한 정보들이 들어있는 파일입니다.

3. ___FILEBASENAME___.swift

  • 최종적으로 생성되는 File입니다.

이제 실제 TemplateInfo.plist 을 보며 더 깊이 있게 이야기를 나눠보겠습니다.

TemplateInfo.plist

  • Kind [Required]: Template의 종류를 정의합니다.

File template: Xcode.IDEFoundation.TextSubstitutionFileTemplateKind

Project template : Xcode.Xcode3.ProjectTemplateUnitKind

  • SortOrder [Required]: Template이 보여지는 순서를 정해줍니다.
  • Platforms [Optional]: 어떤 플랫폼에서 사용되는 지 정의합니다.

ios : com.apple.platform.iphoneos

macosx: com.apple.platform.macosx

  • Item ‘n’: vertical stack으로 쌓이는 각 Item 입니다.
  • Identifier: 다른 곳에서 해당 item을 가져오기 위한 id 지정할 수 있습니다.
  • Options [Optional]: 파일 생성에 대하여 여러가지 옵션을 지정할 수 있습니다.
  • Type: 여러 Type의 UI를 제공 지정할 수 있습니다. (text/checkbox/popup/combobox/static 등)
  • Required: 반드시 필요한 옵션으로 지정
  • NotPersisted: 다음에 해당 속성 기억 지정

Options까지 지정이 끝났다면 저희가 사용하고 있는 UseCase의 예시인 ___VARIABLE_productName___UseCase.swift 을 통해 구현부에 대하여 간단하게 이야기 해보도록 하겠습니다.

___VARIABLE_productName___UseCase.swift

Delightroom iOS 팀 내의 UseCase Convention은 다음과 같습니다.

  • interface 이름은 productName + UseCase 로 짓는다.
  • 구현체의 이름은 productName UseCaseImpl 로 짓는다.
  • inferface 의 API는 execute 함수만을 갖고 있는다.
  • param은 필요할 경우 작업자가 직접 구현한다.

이 규약들을 쉽게 구현하기 위한 ___VARIABLE_productName___UseCase.swift 다음과 같이 구현할 수 있습니다.

UseCase에 대한 XCTemplate example case

__VARIABLE_identifier__ 을 통하여 file생성 시 작성한 productName을 가져오고, 이를 통해 약속한 규약대로 파일이 만들어지도록 합니다.

UseCase는 public / internal 두 가지의 접근 제어자를 선택 할 수 있도록 만들어 주어야 합니다. TemplateInfo.plist에 PublicAccess item을 추가 해 주고, Folder를 이에 맞게 나눠줍니다.

여기까지 완료 되었다면 우리는 통일된 형식을 가진 UseCase file을 쉽게 생성할 수 있게 됩니다.

최종 .plist에 대한 UseCase 생성 화면

팀 내 공유 및 배포

이렇게 만들어진 XCTemplate들은 RIBs에서 쓰던 방식을 차용하여 팀원들에게 쉽게 공유할 수 있도록 만들었습니다.

ref: https://github.com/uber/RIBs/blob/main/ios/tooling/install-xcode-template.sh

# ConfigurationXCODE_TEMPLATE_DIR=$HOME'/Library/Developer/Xcode/Templates/File Templates/Alarmy/iOS/Clean Swift'# Copy 'Alarmy Clean Swift file' templates into the local 'Alarmy Clean Swift file' template directoryxcodeFileTemplate () {   echo "[Copying] Alarmy Clean Swift templates... to Xcode"   if [ -d "$XCODE_TEMPLATE_DIR" ]; then      rm -R "$XCODE_TEMPLATE_DIR"   fi   mkdir -p "$XCODE_TEMPLATE_DIR"
cp -R "File Templetes"/ "$XCODE_TEMPLATE_DIR" echo "[success 🎉] copying File Templetes!"}xcodeFileTemplateecho "Please restart Xcode 👨‍💻"

그리고 이러한 Template과 .sh파일은 프로젝트 내에 위치하여 지속적인 version관리까지 가능합니다.

이를 통해서 우리는 팀의 아키텍쳐 디자인 패턴도 쉽게 Template 화 시킬 수 있습니다. 필요한 경우 View와 ViewModel을 동시에 생산해버리는 형식으로 말이죠.

결론

이제 우리는 합의된 규약에 맞춰 좀 더 쉽고 빠르게 Code를 생성할 수 있게 되었습니다. 그리고 이렇게 절약된 비용은 좀 더 필요한 고민들에 재투자 할 수 있을 것입니다. 😉

긴 글 읽어주셔서 감사드립니다 👨‍💻

⏰ 딜라이트룸에서 알라미와 함께 아침을 바꿀 분들을 모십니다 🙌

👉 딜라이트룸에 어떤 포지션이 있는지 궁금해요(+ 입사 축하금 100만원💸)

👉 딜라이트룸 미디엄 팔로우하기 (카테고리 섹션 오른쪽의 ‘Follow’ 버튼 클릭)

👉 딜라이트룸 일상을 엿볼 수 있는 인스타그램 구경하기

--

--