[Swift] .xcconfig ํ์ผ๋ก api key ์ ์ฅํ๊ธฐ
react์์๋ .env ํ์ผ๋ก api key์ ๊ฐ์ ์ค์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋๋ฐ, swift์์๋ ์ด๋ป๊ฒ ํ๋์ง ๊ถ๊ธํ๋ค.
์ด์ฌํ ์์นํ๋ ์ค, .xcconfig ํ์ผ์ ์๊ฒ ๋์๋ค.
.xcconfig๊ฐ ๋ญ๋ฐ?
Xcode Configuration์ ์ค์๋ง๋ก, ํ๋ก์ ํธ์ ๋ค์ํ ์ค์ ์ ์ฝ๋์ฒ๋ผ ํ ์คํธ ํ์์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
์ด๋ฅผ ํตํด ์ฌ๋ฌ ๋น๋ ์ค์ ์ ํ๊ฒฝ์ ๋ง๊ฒ ๋ถ๋ฆฌํ๊ณ , ํ๋ก์ ํธ ๋ด์ ์ค์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ ๋ฆฌํด๋ณด์๋ค.
1. ํ์ผ ์์ฑํ๊ธฐ
๋จผ์ ์ด๋ ๊ฒ Configuration Setting File์ ํตํด .xcconfig ํ์ผ์ ์์ฑํ๋ค.
๋๋ Config.xcconfig๋ก ์ด๋ฆ์ ์ง์ ํด์คฌ๋ค.
๊ทธ ๋ค์,ํ๋ก์ ํธ์ ํด๋น ํ์ผ์ ์ฐ๊ฒฐํด์ผ ํ๋ค.
ํ๋ก์ ํธ -> Info -> Debug์์ ํ๋ก์ ํธ์ ์๊น ์์ฑํ ํ์ผ์ ๋๋ฌ ์ฐ๊ฒฐํด์ค๋ค.
2. ํ๋ก์ ํธ ์ธํ ์ ๋ฑ๋กํ๊ธฐ
ํ๋ก์ ํธ Target -> Info -> Custom iOS Target Properties์์ ์๋ ์ด๋ฏธ์ง์ ๊ฐ์ด ํค์ ๊ฐ์ ๋ฑ๋กํ๋ค.
3. Config.xcconfig
1๋ฒ์์ ์์ฑํ ํ์ผ์ ์ด๋ ๊ฒ ํ์ํ ๋ณ์๋ค์ ๋ง๋ค์ด์ค๋ค.
string์ ๊ฒฝ์ฐ ""๋ก ๊ฐ์ธ๋ฉด ""๊น์ง url๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ "" ์์ด ๋ฑ๋กํ๋ฉด ๋๋ค.
4. AppConfig.swift ํ์ผ ๋ง๋ค๊ธฐ
์ด์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ api key๋ฅผ ์ฑ์ ๋ฑ๋กํ๋ ๊ณผ์ ๊น์ง ๋ง์ณค๋ค.
์ฌ๊ธฐ์์๋ ์ฝ๋๋ก ์ฐ๊ฒฐํด์ฃผ๋ ๋ถ๋ถ์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค.
// AppConfig.swift
import Foundation
let API_KEY_ENCODING = Bundle.main.infoDictionary?["API_KEY_ENCODING"] as? String ?? ""
let API_KEY_DECODING = Bundle.main.infoDictionary?["API_KEY_DECODING"] as? String ?? ""
let BASE_URL = Bundle.main.infoDictionary?["BASE_URL"] as? String ?? "api.odcloud.kr/api"
์ด๋ ๊ฒ bundle์ ์ ๊ทผํด์ ๊ฐ ํค์ ํด๋นํ๋ value๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด๋ค.
5. .ignore์ ์ถ๊ฐํ๊ธฐ
.xcconfig ํ์ผ์ ๊ฒฝ์ฐ, ๊นํ๋ธ์ ์ฌ๋ผ๊ฐ๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค๋ ํด๋น ํค๋ฅผ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ .ignore์ ์ฌ๋ ค์ค์ผ ํ๋ค.
.gitignore ํ์ผ์ ์์ฑํ๊ณ ๋ค์ ํ์ผ ํ์ฅ์๋ฅผ ์ถ๊ฐํด์ฃผ์.
*.xcconfig
6. github์ ์ฌ๋ฆฌ๊ธฐ ์ , status๋ฅผ ํตํด ํ์ธํ๊ธฐ
ignoreํ์ผ๊น์ง ๋ง๋ค๊ณ , ์ปค๋ฐ์ ํ๋ฉด .xcconfig ํ์ผ์ด ๊ฐ์ด ์ฌ๋ผ๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ฏธ ์ถ๊ฐํ ํ์ผ์ ๊ฒฝ์ฐ ๋ฐ๋ก ์ถ๊ฐํด์ค์ผ ํ๊ธฐ ๋๋ฌธ.
์ด๋ด ๋๋, ๋ค์ ๋ช ๋ น์ด๋ก ์บ์๋ฅผ ์ญ์ ํ๋ค.
// git rm --cached -f {.xcconfig ํ์ผ ๊ฒฝ๋ก}
git rm --cached -f Config.xcconfig
๊ทธ ๋ค์, gitstatus๋ฅผ ํตํด ์์ฌ๋ผ๊ฐ๋์ง ๋ค์ ํ์ธํ๊ณ , commit, push ํด์ฃผ๋ฉด ๋๋ค!!
7. ํ์๋ค์๊ฒ ๊ณต์ ํ๊ธฐ
์ด๋ ๊ฒ ํ๊ณ ๋๋ ํ์๋ค์๊ฒ ์ด๋ป๊ฒ ๊ณต์ ํ ์ง ๊ณ ๋ฏผ์ด ๋์๋ค.
์ด๋ฐ ๊ฒฝ์ฐ, config.example์ด๋ผ๋ ํ์ผ์ ๋ ๋ง๋ค์ด ์ด ํ์ผ์ ๋ณต์ ํ๊ณ , ํด๋น ํ์ผ์ ๊ฐ์์ apikey๋ฅผ ๋ฃ๋๋ก ์ ๋ฌํ๋ฉด ๋๋ค.
๊ทธ๋์ ๋๋ PR์ ์ฌ๋ฆด ๋ ํ์๋ค์๊ฒ ์ด๋ป๊ฒ ํ๋์ง ๋ฐฉ๋ฒ์ ์ ์ด์ ์ฌ๋ ธ๋ค.
ํ์ํ ์ฌ๋์ ๋งํฌ๋ค์ด ์ด๋๋ก ๋ณต์ฌํด์ ๊นํ์ ๊ฐ์ด ์ฌ๋ ค์ฃผ๋ฉด ๋๋ค !
## ๐ .xcconfig ์ค์ ๋ฐฉ๋ฒ
### 1๏ธโฃ Config.xcconfig.example ํ์ผ์ ๋ณต์ฌํด์ .xcconfig ํ์ผ ๋ง๋ค๊ธฐ
```
cp Config.xcconfig.example Config.xcconfig
```
### 2๏ธโฃ .xcconfig ํ์ผ์ ์ด์ด์ ๋ณธ์ธ์ API ํค์ ์ค์ ์ ์
๋ ฅํ๊ธฐ
```// Config.xcconfig
API_KEY_ENCODING = ์ค์ _API_ํค_์
๋ ฅ
API_KEY_DECODING = ์ค์ _API_ํค_์
๋ ฅ
BASE_URL = https://์ค์ _API_URL_์
๋ ฅ
```
### 3๏ธโฃ Xcode์์ .xcconfig ํ์ผ์ ๋น๋ ์ค์ ์ ์ถ๊ฐํ๊ธฐ
Xcode → Project → Info → Configurations์์ Config.xcconfig๋ฅผ ์ค์
### 4๏ธโฃ git status๋ฅผ ํ์ธํด์ .xcconfig๊ฐ Git์ ์ฌ๋ผ๊ฐ์ง ์๋์ง ํ์ธํ๊ธฐ
8. (๋ฒ์ธ) ํด๋ฆฐ ์ํคํ ์ฒ์์ ์ด๋ ํด๋์ ๋ฃ์ด์ผํ ๊น?
์ฐ๋ฆฌ ํ์ ๊ฒฝ์ฐ ํด๋ฆฐ ์ํคํ ์ฒ๋ฅผ ์ ์ฉํ๊ณ ์๊ธฐ์ ์ด๋ ํด๋์ ๋ฃ์ด์ผ ํ ์ง ๊ณ ๋ฏผ์ ๋ง์ด ํ๋ค.
์ฌ๋ฌ ์๋ฃ๋ฅผ ์ฐพ๊ณ , ๋ค์ ๊ฐ๋ ์ ํ์ธํ ๊ฒฐ๊ณผ, Data ๋ถ๋ถ์ xcconfig ํ์ผ์ ๋ง๋ค๊ธฐ๋ก ํ๋ค.
Data ํด๋๋ ๊ฐ์ฅ ์์ชฝ์ ์๋ ๊ณ์ธต์ผ๋ก, ์ธ๋ถ ๋ ์ด์ด์ ํด๋นํ๋ ์ค์ ํ์ผ์ ๋ณด๊ดํ๋ ์ฅ์๋ก ์ ํฉํ๋ค๊ณ ํ๋ค. (GPT๊ฐ.)
์๋ฅผ ๋ค์ด, ์ฑ์ ๋น๋ ์ค์ ์ด๋, API key ๊ฐ์ ๋ด์ฉ์ Data ํด๋์ ๋๋ฉด ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ธ๋ถ ํ๊ฒฝ์ ์ํฅ์ ๋ฐ์ง ์๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ..!
(์ฌ์ค ์์ง ๋ง๋์ง ํ์ ์ ์๋ค)
๊ทธ๋์ ์ด๋ ๊ฒ ํด๋๋ฅผ ๋ง๋ค์ด์ ์๋์ ๊ฐ์ ํด๋ ๊ตฌ์กฐ์ ์ถ๊ฐํด์ฃผ์๋ค.