팀에서 코드 템플릿을 만들어 사용하자는 의견이 있어서
Notion에 템플릿을 적어두고 구현할 때마다 복사해서 사용하기로 했었습니다.
템플릿에는 ViewController에서 구현해야하는
required init, loadView, viewDidLoad, configureUI, bind, MARK 주석
등을 적어두었습니다.
그러던 도중 XCTemplate 라는 것을 처음 딜라이트룸의 벨로그 글을 보고 알게되었습니다.
https://medium.com/delightroom/xcode-xctemplate-filetemplate-을-통해-팀-생산성을-높여보자-ff2d20f5eaa0
이 글을 보고 불필요하게 반복적이던
Notion에서 템플릿을 복사해서 ViewController 파일을 붙여넣는 작업의 비용을 줄일 수 있을 것이라 생각하고
얼죽아팀의 ViewController XCTemplate을 만들어보기로 했습니다.
Xcode에서 가장 많이 보는 화면 중에 하나인 파일 템플릿 선택 창에
얼죽아 팀의 ViewController를 생성하는 방법을 기록해두려고 합니다.
어디에 File Template을 생성해야할까?
제가 파일 템플릿을 생성한 위치는
[Ventura 13.0, Xcode 14.1] 을 기준으로 다음과 같은 위치에 ViewController.xctemplate 폴더를 생성하였습니다.
여기서 ViewController의 이름이 위 사진에서 템플릿 이름으로 선택창에 나타나게 됩니다.
(XCTemplate은 기본적으로 폴더 기반으로 이루어져 있고, 내부에 필요한 파일을 넣는 형식으로 구성된다고 합니다.)
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates
xctemplate 폴더 안에는 무엇을 넣어야할까?
1. TemplateIcon.png
2. TemplateInfo.plist
3. ___FILEBASENAME___.swift
이렇게 세가지의 파일을 넣으면 템플릿을 쉽게 완성할 수 있습니다.
1. TemplateIcon.png
파일 템플릿의 사진입니다. 필요한 템플릿 사진을 넣으면 되고 저는 2x 사진까지 넣어보았습니다.
2. TemplateInfo.plist
템플릿을 생성하는데 필요한 정보들이 저장되어있는 파일입니다.
처음에 plist 파일을 직접 생성하다가 잘 적히지 않는 바람에 🫠
이미 존재하는 xctemplate의 plist 파일을 복사, 변경해서 사용하였습니다.
꼭 적어야하는 템플릿의 내용을 보면
- Kind
File template: Xcode.IDEFoundation.TextSubstitutionFileTemplateKind
Project template : Xcode.Xcode3.ProjectTemplateUnitKind
저는 Filetemplate을 사용했기 때문에 위의 것으로 적어주었습니다.
- Sort Order
템플릿이 보여지는 순서를 정해줍니다.
아래는 선택사항 입니다.
- Platforms
ios : com.apple.platform.iphoneos
macosx: com.apple.platform.macosx
- Options
옵션에서 뭘 지정하는 건지 뭔지 혼자 삽질을 했었는데
혼자 이해한 바로는 템플릿 선택시 옵션으로 지정해서 적을 수 있게 해주는 Item이라고 생각했습니다.
(예를들어 코코아터치 템플릿은 UIViewController를 지정한다던지)
- Item
저는 MyPage를 적으면 파일과 클래스명이 MyPageViewController로 생성되게 하기 위하여 Name을 받아주었습니다.
간단하게 템플릿 info를 작성을 완료했습니다.
3. ___FILEBASENAME___.swift
Xcode에서 생성되는 파일입니다. Notion에 적어뒀던 템플릿 내용이 들어가게 됩니다.
저희의 ViewController 템플릿입니다.
중간 중간 ___어쩌구___ 라고 적혀져 있는 것들이 보이는데 찾아보니 매크로 변수..? 라고 하는데 정확한 명칭을 찾지 못했습니다.
이 템플릿에 쓰여진 것 위주로 살펴봅시다.
이렇게 생성하게되면 이 템플릿을 생성한 사용자, 시간에 맞게 코드에 값이 들어가게 됩니다.
___PROJECTNAME___ : 프로젝트명
___FULLUSERNAME___ : 생성한 사용자 이름
___DATE___: 날짜
___YEAR___ : 년도
___ORGANIZATIONNAME___
___VARIABLE_ProductName___ : 아까 생성한 Identifier 변수
//
// ___VARIABLE_ProductName___ViewController.swift
// ___PROJECTNAME___
//
// Created by ___FULLUSERNAME___ on ___DATE___.
//
import UIKit
final class ___VARIABLE_ProductName___ViewController: UIViewController {
// MARK: - Properties
private var view: <#View#>
private var viewModel: <#ViewModel#>
// MARK: - Initializer
init(viewModel: <#ViewModel#>) {
self.viewModel = viewModel
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Life Cycle
override func loadView() {
<#code#>
}
override func viewDidLoad() {
configureUI()
bind()
}
// MARK: - Methods
private func configureUI() {
<#code#>
}
private func bind() {
<#code#>
}
}
팀원들과 함께 쓰려면?
아쉬운 부분 중에 하나였는데 직접 팀원들이 공유한 폴더를 다운 받아서 맨 처음의 경로에 넣어주어야 했습니다.
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/File Templates
후기
ViewController를 생성할 때마다 Notion을 열어보던 번거로움이 사라졌고,
팀원들의 코드도 일관성있게 바뀌었다는 점이 가장 큰 장점이었습니다.
한가지 아쉬운 점은 로컬 설정이라 직접 넣어주어야 한다는 점..?
RIBs로 어떻게 한다는 글도 보았는데 그쪽 지식은 0라서 추후에 또 적용하는 좋은 방식이 있다면 찾아봐야겠습니다.
https://tech.lezhin.com/2019/12/16/ios-file-template
https://ios-development.tistory.com/760
https://eunjin3786.tistory.com/347
'iOS > PROJECT' 카테고리의 다른 글
[burstcamp] 유저정보를 효율적으로 관리하는 방법 (with. 파이어베이스, KeyChain) (0) | 2022.12.03 |
---|---|
[burstcamp] 다크모드 Switch 버튼 제공 (+iOS 15 대응) (0) | 2022.11.26 |
[TUDY] FirebaseAuth(파이어베이스 인증) + 애플, 카카오 로그인, 자동로그인 (1) | 2022.07.06 |
[TUDY] Coordinator 패턴 적용기 !! (0) | 2022.07.05 |
[두깃] UI리팩토링, 토스트메세지 추가 (0) | 2022.05.20 |