๐ŸŽ iOS

Xcode Template์œผ๋กœ ๊ฐœ๋ฐœ์‹œ๊ฐ„ ๋‹จ์ถ•ํ•˜์ž ๐Ÿ•‘

gom1n 2024. 5. 15. 19:06

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 ์ข…๋ฃŒํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๊ณต์œ 

๋‚ด๊ฐ€ ๋งŒ๋“  ํ…œํ”Œ๋ฆฟ์€ ๋กœ์ปฌ์—์„œ๋งŒ ์ €์žฅ๋˜๊ณ  ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

ํ˜‘์—… ์‹œ์—๋Š” ๋‹ค์†Œ ๊ณค๋ž€ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ์š”, ์ด๋ฅผ ํŒ€์›๊ณผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

  1. ํ”„๋กœ์ ํŠธ ํด๋” ์•„๋ž˜์— FileTemplates๋ผ๋Š” ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์•„๋ž˜์— ์ปค์Šคํ…€ ํ…œํ”Œ๋ฆฟ๋“ค์„ ์œ„์น˜์‹œํ‚จ๋‹ค.
  2. ๋‚ด ๋กœ์ปฌ์˜ Templates ํด๋”๋ฅผ ๋™๊ธฐํ™”์‹œํ‚ค๋Š” ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  3. ๊ฐ™์ด ๊นƒ์— ์—…๋กœ๋“œํ•œ๋‹ค.
  4. ๊นƒ์œผ๋กœ 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 ๋“ฑ๋“ฑ์„ ์ •์˜ํ•ด์ค„ ๋•Œ ์ ์žฌ์ ์†Œ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ํ˜„์—…์—์„œ ์ •๋ง ์œ ์šฉํ•˜๊ฒŒ ์“ฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋‘ ๋˜‘๋˜‘ํ•œ ๊ฐœ๋ฐœ ํ•˜์‹œ๊ธธ...