|
| 1 | +# ํ๊ฒฝ์ค์ (Environment) |
| 2 | + |
| 3 | +Vapor์ ํ๊ฒฝ์ค์ API๋ ์ฑ์ ๋์ ์ผ๋ก ์ค์ ํ ์ ์๋๋ก ํฉ๋๋ค. ์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก `development` ํ๊ฒฝ์ ์ฌ์ฉํฉ๋๋ค. `production`์ด๋ `staging` ๊ฐ์ ์ ์ฉํ ๋ค๋ฅธ ํ๊ฒฝ์ ์ ์ํ ์ ์๊ณ , ๊ฐ ์ผ์ด์ค๋ง๋ค ๋ค๋ฅด๊ฒ ์ค์ ํ ์ ์์ต๋๋ค. ํ์์ ๋ฐ๋ผ ํ๋ก์ธ์ค์ ํ๊ฒฝ์ด๋ `.env` ํ์ผ์ ๋ณ์๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
| 4 | + |
| 5 | +`app.environment`๋ฅผ ์ฌ์ฉํด์ ํ์ฌ ํ๊ฒฝ์ค์ ์ ์ ๊ทผํ ์ ์์ต๋๋ค. `configure(_:)` ๋ฉ์๋ ์์์ ์ด ํ๋กํผํฐ์ ์ค์์น๋ฅผ ์ฌ์ฉํ๋ฉด ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ค์ ํ ์ ์์ต๋๋ค. |
| 6 | + |
| 7 | +```swift |
| 8 | +switch app.environment { |
| 9 | +case .production: |
| 10 | + app.databases.use(....) |
| 11 | +default: |
| 12 | + app.databases.use(...) |
| 13 | +} |
| 14 | +``` |
| 15 | + |
| 16 | +## ํ๊ฒฝ์ค์ ๋ณ๊ฒฝํ๊ธฐ |
| 17 | + |
| 18 | +๊ธฐ๋ณธ์ผ๋ก ์ฑ์ `development` ๋ชจ๋๋ก ์คํ๋ฉ๋๋ค. ์ฑ์ ๋ถํ
ํ ๋, `--env` (`-e`) ํ๋๊ทธ๋ฅผ ์ ๋ฌํด์ ํ๊ฒฝ์ค์ ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. |
| 19 | + |
| 20 | +```swift |
| 21 | +swift run App serve --env production |
| 22 | +``` |
| 23 | + |
| 24 | +Vapor๋ ๋ค์๊ณผ ๊ฐ์ ํ๊ฒฝ์ด ์์ต๋๋ค. |
| 25 | + |
| 26 | +|name|short|description| |
| 27 | +|-|-|-| |
| 28 | +|production|prod|์ฌ์ฉ์๋ค์๊ฒ ์ ๊ณตํ๊ธฐ ์ํ ํ๊ฒฝ์
๋๋ค| |
| 29 | +|development|dev|๋ก์ปฌ ๊ฐ๋ฐ์ ์ํ ํ๊ฒฝ์
๋๋ค.| |
| 30 | +|testing|test|์ ๋ ํ
์คํธ๋ฅผ ์ํ ํ๊ฒฝ์
๋๋ค.| |
| 31 | + |
| 32 | +!!! info |
| 33 | + ํน๋ณํ ์ค์ ์ด ์๋ค๋ฉด `production` ํ๊ฒฝ์ ๊ธฐ๋ณธ์ผ๋ก `notice` ๋ ๋ฒจ๋ก ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๋ค๋ฅธ ํ๊ฒฝ๋ค์ ๊ธฐ๋ณธ์ผ๋ก `info` ๋ ๋ฒจ์
๋๋ค. |
| 34 | + |
| 35 | +`--env` (`-e`) ํ๋๊ทธ์ ์ ์ฒด ๋๋ ์ถ์ฝ ์ด๋ฆ์ ์ ๋ฌํด์ ์ค์ ํ ์ ์์ต๋๋ค. |
| 36 | + |
| 37 | +```swift |
| 38 | +swift run App serve -e prod |
| 39 | +``` |
| 40 | + |
| 41 | +## ํ๋ก์ธ์ค ๋ณ์(Process Variables) |
| 42 | + |
| 43 | +`Environment`๋ ํ๋ก์ธ์ค์ ํ๊ฒฝ ๋ณ์๋ค์ ์ ๊ทผํ ์ ์๋๋ก ๊ฐ๋จํ ๋ฌธ์์ด ๊ธฐ๋ฐ์ API๋ฅผ ์ ๊ณตํฉ๋๋ค. |
| 44 | + |
| 45 | +```swift |
| 46 | +let foo = Environment.get("FOO") |
| 47 | +print(foo) // String? |
| 48 | +``` |
| 49 | + |
| 50 | +`get` ์ด์ธ์๋, `Environment`๋ `process`๋ฅผ ํตํ ๋์ ๋ฉค๋ฒ ์กฐํ API๋ ์ ๊ณตํฉ๋๋ค. |
| 51 | + |
| 52 | +```swift |
| 53 | +let foo = Environment.process.FOO |
| 54 | +print(foo) // String? |
| 55 | +``` |
| 56 | + |
| 57 | +ํฐ๋ฏธ๋์์ ์ฑ์ ์คํํ๋ ๊ฒฝ์ฐ์๋ `export`๋ฅผ ์ฌ์ฉํด์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. |
| 58 | + |
| 59 | +```sh |
| 60 | +export FOO=BAR |
| 61 | +swift run App serve |
| 62 | +``` |
| 63 | + |
| 64 | +Xcode์์ ์ฑ์ ์คํํ๋ ๊ฒฝ์ฐ์๋ `App` Scheme์ ์์ ํด์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค |
| 65 | + |
| 66 | +## .env (dotenv) ํ์ผ |
| 67 | + |
| 68 | +Dotenv ํ์ผ์ ํ๊ฒฝ ๋ณ์๋ฅผ ์๋์ผ๋ก ์ ์ฅํ๊ธฐ ์ํด์ Key-Value ํํ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ํ์ผ์ ์๋์ผ๋ก ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ํ์๊ฐ ์์ด์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. |
| 69 | + |
| 70 | +Vapor๋ ํ์ฌ ์์
๋๋ ํ ๋ฆฌ์์ dotenv ํ์ผ์ ๊ฒ์ํฉ๋๋ค. ๋ง์ฝ Xcode๋ฅผ ์ฌ์ฉํ๋ค๋ฉด `App` Scheme์์ ์์
๋๋ ํ ๋ฆฌ๋ฅผ ์ง์ ํด ์ค ํ์๊ฐ ์์ต๋๋ค. |
| 71 | + |
| 72 | +ํ๋ก์ ํธ ๋ฃจํธ ํด๋์ ์์นํ env ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ์๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค. |
| 73 | + |
| 74 | +```sh |
| 75 | +FOO=BAR |
| 76 | +``` |
| 77 | + |
| 78 | +์ดํ๋ฆฌ์ผ์ด์
์ด ๋ถํ
๋ ๋, ๋ค๋ฅธ ํ๋ก์ธ์ค ํ๊ฒฝ ๋ณ์์ฒ๋ผ ํ์ผ์ ์ปจํ
์ธ ์ ์ ๊ทผํ ์ ์์ต๋๋ค. |
| 79 | + |
| 80 | +```swift |
| 81 | +let foo = Environment.get("FOO") |
| 82 | +print(foo) // String? |
| 83 | +``` |
| 84 | + |
| 85 | +!!! info |
| 86 | + ์ด๋ฏธ ํ๋ก์ธ์ค ํ๊ฒฝ์ค์ ์ ์กด์ฌํ๋ ๋ณ์๋ค์ `.env` ํ์ผ์ ๋ช
์๋์๋๋ผ๋ ์ฌ์ค์ ๋์ง ์์ต๋๋ค. |
| 87 | + |
| 88 | +Vapor๋ `.env` ํ์ผ์ ์ธ์๋ ํ์ฌ ํ๊ฒฝ์ ์ํ dotenv ํ์ผ์ ๋ก๋ํ๋ ค๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด `development` ํ๊ฒฝ์์๋ Vapor๋ `.env.development` ํ์ผ์ ๋ก๋ํ ๊ฒ์
๋๋ค. ํน์ ํ๊ฒฝ์ `.env` ํ์ผ ์์ ๊ฐ๋ค์ ์ผ๋ฐ `.env` ํ์ผ๋ณด๋ค ์ฐ์ ์ ๋ฉ๋๋ค. |
| 89 | + |
| 90 | +๊ธฐ๋ณธ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ํ
ํ๋ฆฟ์ผ๋ก์ `.env` ํ์ผ์ ํ๋ก์ ํธ์ ํฌํจํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ธ ๋ฐฉ์์
๋๋ค. ํน์ ํ๊ฒฝ ํ์ผ์ `.gitignore`์์ ๋ค์ ํจํด์ ์ฌ์ฉํด์ ์
๋ก๋๋์ง ์๋๋ก ํฉ๋๋ค. |
| 91 | + |
| 92 | +```gitignore |
| 93 | +.env.* |
| 94 | +``` |
| 95 | + |
| 96 | +์๋ก์ด ์ปดํจํฐ์ ํ๋ก์ ํธ๋ฅผ ํด๋ก (clone) ํ ๋, `.env` ํ
ํ๋ฆฟ ํ์ผ์ ๋ณต์ฌ๋๊ณ ์ฌ๋ฐ๋ฅธ ๊ฐ๋ค์ ์
๋ ฅํ ์ ์์ต๋๋ค. |
| 97 | + |
| 98 | +```sh |
| 99 | +cp .env .env.development |
| 100 | +vim .env.development |
| 101 | +``` |
| 102 | + |
| 103 | +!!! warning |
| 104 | + ํจ์ค์๋ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด์ dotenv ํ์ผ๋ค์ ๋ฒ์ ๊ด๋ฆฌ์ ์ ๋๋ก ์ปค๋ฐ(commit) ๋์ง ์๋๋ก ํ์ธ์. |
| 105 | + |
| 106 | +๋ง์ฝ dotfile๋ฅผ ๋ก๋ํ๋๋ฐ ์ด๋ ค์์ด ์๋ค๋ฉด, ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ํด์ `--log debug` ํ๋๊ทธ๋ฅผ ์ฌ์ฉํด์ ๋๋ฒ๊ทธ ๋ก๊น
์ ์๋ํด ๋ณด์ธ์. |
| 107 | + |
| 108 | +## ์ปค์คํ
ํ๊ฒฝ์ค์ |
| 109 | + |
| 110 | +`Environment`์ ํ์ฅํด์ ์ปค์คํ
ํ๊ฒฝ์ค์ ์ด๋ฆ์ ์ ์ํ ์ ์์ต๋๋ค. |
| 111 | + |
| 112 | +```swift |
| 113 | +extension Environment { |
| 114 | + static var staging: Environment { |
| 115 | + .custom(name: "staging") |
| 116 | + } |
| 117 | +} |
| 118 | +``` |
| 119 | + |
| 120 | +์ดํ๋ฆฌ์ผ์ด์
์ ํ๊ฒฝ์ค์ ์ ๋ณดํต `entrypoint.swift`์์ `Environment.detect()`๋ฅผ ์ฌ์ฉํด์ ์ค์ ํฉ๋๋ค. |
| 121 | + |
| 122 | +```swift |
| 123 | +@main |
| 124 | +enum Entrypoint { |
| 125 | + static func main() async throws { |
| 126 | + var env = try Environment.detect() |
| 127 | + try LoggingSystem.bootstrap(from: &env) |
| 128 | + |
| 129 | + let app = Application(env) |
| 130 | + defer { app.shutdown() } |
| 131 | + |
| 132 | + try await configure(app) |
| 133 | + try await app.runFromAsyncMainEntrypoint() |
| 134 | + } |
| 135 | +} |
| 136 | +``` |
| 137 | + |
| 138 | +`detect` ๋ฉ์๋๋ ํ๋ก์ธ์ค์ ๋ช
๋ น ์ค ์ธ์์ `--env` ํ๋๊ทธ๋ฅผ ์๋์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ์ปค์คํ
`Environment` ๊ตฌ์กฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ ์์
์ผ๋ก ์ด๋ฅผ ์ฌ์ค์ ํ ์ ์์ต๋๋ค. |
| 139 | + |
| 140 | +```swift |
| 141 | +let env = Environment(name: "testing", arguments: ["vapor"]) |
| 142 | +``` |
| 143 | + |
| 144 | +arguments ๋ฐฐ์ด์๋ ์ต์ํ ํ๋์ ์คํ ๊ฐ๋ฅํ ์ด๋ฆ์ ๋ํ๋ด๋ ์ธ์๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค. ๋ช
๋ น ์ค์ ์ธ์๋ฅผ ์ ๊ณตํ๋ ๊ฒ ๊ฐ์ ์๋ฎฌ๋ ์ด์
์ ํ๊ธฐ ์ํด์, ์ถ๊ฐ์ ์ธ ์ธ์๋ค์ ์ ๊ณตํ ์ ์์ต๋๋ค. ํนํ ํ
์คํธ๋ฅผ ์ํด์ ์ฌ์ฉํ ๋ ์ ์ฉํฉ๋๋ค. |
0 commit comments