Xcode Template์ผ๋ก ๊ฐ๋ฐ์๊ฐ ๋จ์ถํ์ ๐
Xcode Template?
์ ๋ง ์ ๊ฐ ํ์ ์์ ์ ์ฉํ๊ฒ ์ฐ๋ ํ ํ๋ฆฟ์ ๊ฐ์ ธ์์ต๋๋ค.
Xcode Template์ด๋ผ๊ณ , ํ์ผ์ ์ฒ์ ์์ฑํ ๋ ๋จ๋ ์ด ์ฐฝ ์์์์?
์ฌ๊ธฐ ๋จ๋ ์ด ๋ชจ๋ ๊ฒ๋ค์ด ๋ค ์ ํ์ด ๋ง๋ ํ ํ๋ฆฟ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๊ฒ ์ต๋๋ค.
์ด์ ์ ๊ฐ ์ ์ ์ฝ๋ ์คํ์ผ์ ๋ง๊ฒ ์ปค์คํ ํ ํ๋ฆฟ์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
Custom Template ์์ฑํ๊ธฐ
์ผ๋จ ์ด ๊ธฐ๋ณธ ํ ํ๋ฆฟ์ด ์๋ ๊ฒฝ๋ก์ ๋ค์ด๊ฐ์,
๋ด๊ฐ ์ปค์คํ ํ ํ ํ๋ฆฟ์ ๋ฃ์ด์ฃผ๋ ๊ฒ ๋น์ฐํ๊ฒ ์ฃ ?
๋ค์ ๊ฒฝ๋ก๋ก ๋ค์ด๊ฐ์ Finder๋ก ํ์ธํด๋ด ์๋ค.
cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates
open .
๋ณด๋ฉด File Templates๊ณผ Project Templates๊ฐ ์์ต๋๋ค.
File Templates์ ํ์ผ ์์ฑ ์ ์ ์ฉ๋๋ ํ ํ๋ฆฟ, Project Templates๋ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๋ ์ ์ฉ๋๋ ํ ํ๋ฆฟ์ ๋๋ค.
์ค๋์ File Templates์ ๋ํด์๋ง ๋ค๋ค๋ด ์๋ค.
์ด๋ ๊ฒ ํ์ฅ์์ผ ์ด์ด๋ณด๋ฉด, ๊ทธ๋์ ์ฑํ๊ฒ ์ฌ์ฉํด์๋ Cocoa Touch Class์ ํ ํ๋ฆฟ์ด ๋ณด์ ๋๋ค.
์๋ง ์ต์ํ ๊ฒ์ ๋๋ค.
ํ์ผ ํ ํ๋ฆฟ์ ์์ฑํ๊ธฐ ์ํด์๋ ๋ค์ ์ธ ๊ฐ์ง๊ฐ ํ์์ ๋๋ค.
- ___FILEBASENAME___.swift (์์)
- ํ ํ๋ฆฟ ์์ด์ฝ
- TemplateInfo.plist
์์์ ๋ดค๋ ๊ธฐ๋ณธ ํ ํ๋ฆฟ ์ค ํ๋๋ฅผ ์ด์ด, ์ด ์ธ ๊ฐ์ง๋ฅผ ๋ณต์ฌํฉ๋๋ค.
์๋ฌด๊ฑฐ๋ ํ๋์ฉ๋ง ๋ณต์ฌํ๋ฉด ๋ฉ๋๋ค.
์๋ ๊ฒฝ๋ก๋ก ๋ค์ด๊ฐ๊ณ , ๋ง์ผ Templates ์ด๋ผ๋ ํด๋๊ฐ ์๋ค๋ฉด ํด๋๋ฅผ ์์ฑํด์ค๋๋ค.
~/Library/Developer/Xcode/
open .
๊ทธ ๋ค์, ๋ด๊ฐ ์ํ๋ ํ ํ๋ฆฟ์ ์ด๋ฆ์ผ๋ก ๋ ํด๋๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ํด๋ ์์ ๋ถ์ฌ๋ฃ๊ธฐ ํฉ๋๋ค.
What is ___FILEBASENAME___?
___FILEBASENAME___ ์ด ๋ญ ์ง ๊ถ๊ธํ ์ ์์ต๋๋ค.
๊ธฐ์กด์ ํ ํ๋ฆฟ์ ์์ฑํ ๋ ํ์ผ์ด๋ฆ์ ์ ๋ ฅํ๋ ์ด ์ฐฝ์ ๋ณผ๊น์?
์ ํ ์คํธํ๋์ ํด๋นํ๋ ๊ฐ์ ๋๋ค.
์ ์ ๋ ฅ๊ฐ๋๋ก ํ์ผ์ด ์์ฑ๋์์์? ๊ทธ๊ฒ์ด ๋ฐ๋ก ___FILEBASENAME___์ผ๋ก ๋ค์ด๊ฐ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
๋ค์ ๋์์์,
___FILEBASENAME___.swift๋ฅผ ์ด์ด, ๋ด ์ฝ๋ ์คํ์ผ๋๋ก ์ปค์คํ ํด์ค๋๋ค.
์ ๋ UIView ์์ฑ ์ ์ ๊ฐ ์์ฃผ ์ฐ๋ ํ์ ์ ์ด๋ฃ์์ต๋๋ค.
[์ฝ๋ ๋ณด๊ธฐ]
//___FILEHEADER___
import UIKit
import SnapKit
final class ___FILEBASENAMEASIDENTIFIER___: UIView {
//MARK: - UI
// UI ์ ์
// MARK: - Init
override init(frame: CGRect) {
super.init(frame: frame)
self.setting()
self.addSubViews()
self.setLayouts()
self.addTargets()
self.configure()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
private func addSubViews() {
}
private func setLayouts() {
}
// MARK: - Methods
private func setting() {
}
private func addTargets() {
}
private func configure() {
}
func set() {
self.snp.makeConstraints { make in
make.width.equalToSuperview().multipliedBy(0.9)
make.height.equalTo(41)
}
}
}
์ ์ฅํ๊ณ ๋ค์ Xcode์ ์ง์ ํด ์ ํ์ผ์ ์์ฑํ๊ณ ์ ํ๋ฉด, ์ ๊ฐ ์ปค์คํ ํ ํ ํ๋ฆฟ์ด ๋ณด์ ๋๋ค!
๋ง์ผ ๋ณด์ด์ง ์๋๋ค๋ฉด? ์๋ ๋ ํ๋์ ๋ฐ๋ผํด๋ด ์๋ค.
- Xcode/DerivedData๋ก ์ด๋ํด ํด๋น ํ๋ก์ ํธ์ ์์ค์ฝ๋ ์บ์๋ฅผ ์ญ์
- Xcode ์ข ๋ฃํ๋ค๊ฐ ๋ค์ ์คํ
๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๊ณต์
๋ด๊ฐ ๋ง๋ ํ ํ๋ฆฟ์ ๋ก์ปฌ์์๋ง ์ ์ฅ๋๊ณ ๊ด๋ฆฌ๋ฉ๋๋ค.
ํ์ ์์๋ ๋ค์ ๊ณค๋ํ ์๋ ์๋๋ฐ์, ์ด๋ฅผ ํ์๊ณผ ๊ณต์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- ํ๋ก์ ํธ ํด๋ ์๋์ FileTemplates๋ผ๋ ํด๋๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์๋์ ์ปค์คํ ํ ํ๋ฆฟ๋ค์ ์์น์ํจ๋ค.
- ๋ด ๋ก์ปฌ์ Templates ํด๋๋ฅผ ๋๊ธฐํ์ํค๋ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ค.
- ๊ฐ์ด ๊น์ ์ ๋ก๋ํ๋ค.
- ๊น์ผ๋ก pull ๋ฐ์ ์ฌ๋์, ์ ์คํฌ๋ฆฝํธ๋ง ์คํ์ํค๋ฉด ๋๋ค.
์ ์คํฌ๋ฆฝํธ์ ๋ค์ ๋ด์ฉ์ ์จ๋ฃ์ต๋๋ค.
ํ ๋ฐ์ ํ๋ก์ ํธ/FileTemplates/์ปค์คํ ํ ํ๋ฆฟ๋ค์ -> ๋ด ๋ก์ปฌ์ Xcode/Templates ํด๋ ์์ผ๋ก ๋ณต์ฌ
[์ฝ๋๋ณด๊ธฐ]
#!/bin/bash
source_dir="./FileTemplates"
destination_dir="$HOME/Library/Developer/Xcode/Templates/File Templates/"
# ์์ค ๋๋ ํ ๋ฆฌ ์๋์ ์๋ ํด๋
template_folders=$(find "$source_dir" -mindepth 1 -maxdepth 1 -type d)
# ์์ค ๋๋ ํ ๋ฆฌ ์๋์ ์๋ ํด๋๋ค์ ์ญ์ ํ๊ณ ๋ค์ ์์ฑ
for folder in $template_folders; do
folder_name=$(basename "$folder") # ํด๋ ์ด๋ฆ ์ถ์ถ
sudo rm -rf "$destination_dir/$folder_name"
sudo cp -r "$folder" "$destination_dir"
done
echo "ํ
ํ๋ฆฟ ํด๋๋ค์ '$destination_dir'๋ก ๋ณต์ฌํ์ต๋๋ค."
๋ง๋ฌด๋ฆฌ
์ด๋ ๊ฒ ๋ด ์ฝ๋ ์คํ์ผ์ ๋ง๊ฒ ํ์ผ ์์ฑ์ ์ฝ๊ฒ ๋์์ฃผ๋ Xcode Template์ ๋ํด์ ์์๋ณด์์ต๋๋ค.
๋จ์ UI ์ปดํฌ๋ํธ๋ค ๋ฟ๋ง ์๋๋ผ, MVVM, UseCase, Http providers ๋ฑ๋ฑ์ ์ ์ํด์ค ๋ ์ ์ฌ์ ์์ ํ์ฉํ ์ ์๊ฒ ์ต๋๋ค.
์ ๋ ํ์ ์์ ์ ๋ง ์ ์ฉํ๊ฒ ์ฐ๊ณ ์์ต๋๋ค.
๋ชจ๋ ๋๋ํ ๊ฐ๋ฐ ํ์๊ธธ...