๐ŸŽ iOS

[Swift] .xcconfig ํŒŒ์ผ๋กœ api key ์ €์žฅํ•˜๊ธฐ

coram22 2025. 2. 14. 18:54
728x90
๋ฐ˜์‘ํ˜•
728x90

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 ํด๋”์— ๋‘๋ฉด ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์™ธ๋ถ€ ํ™˜๊ฒฝ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ ..!

(์‚ฌ์‹ค ์•„์ง ๋งž๋Š”์ง€ ํ™•์‹ ์€ ์—†๋‹ค)

 

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ํด๋”๋ฅผ ๋งŒ๋“ค์–ด์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ํด๋” ๊ตฌ์กฐ์— ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•