Skip to content

Commit 54f1dca

Browse files
peisns0xTim
andauthored
Feature/add basics korean translation (#1115)
I have translated documents on the basics and contributing. --------- Co-authored-by: Tim Condon <0xTim@users.noreply.github.com>
1 parent a447d01 commit 54f1dca

8 files changed

Lines changed: 1046 additions & 0 deletions

File tree

โ€Ždocs/basics/client.ko.mdโ€Ž

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# ํด๋ผ์ด์–ธํŠธ(Client)
2+
3+
Vapor์˜ ํด๋ผ์ด์–ธํŠธ๋Š” ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค์— HTTP ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” [async-http-client](https://github.com/swift-server/async-http-client)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, [content](content.md) API๋กœ ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
4+
5+
## ๊ฐœ์š”
6+
7+
`Application`์„ ํ†ตํ•ด ๊ธฐ๋ณธ ํด๋ผ์ด์–ธํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š”, ๋ผ์šฐํ„ฐ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ `Request`๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
8+
9+
```swift
10+
app.client // Client
11+
12+
app.get("test") { req in
13+
req.client // Client
14+
}
15+
```
16+
17+
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋ผ์ด์–ธํŠธ๋Š” ์„ค์ •(Configuration)์„ ํ•˜๋Š” ๋™์•ˆ์— HTTP ์š”์ฒญ์„ ๋งŒ๋“œ๋Š”๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ผ์šฐํ„ฐ ํ•ธ๋“ค๋Ÿฌ ์•ˆ์—์„œ HTTP ์š”์ฒญ์„ ๋งŒ๋“ ๋‹ค๋ฉด, ํ•ญ์ƒ request์˜ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
18+
19+
### ๋ฉ”์„œ๋“œ(Methods)
20+
21+
์›ํ•˜๋Š” URL์„ `GET` ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌํ•ด์„œ `GET` ์š”์ฒญ์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”.
22+
23+
```swift
24+
let response = try await req.client.get("https://httpbin.org/status/200")
25+
```
26+
27+
`get`, `post`, ๊ทธ๋ฆฌ๊ณ  `delete` ๊ฐ™์€ ๊ฐ๊ฐ์˜ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ ์‘๋‹ต์€ HTTP ์ƒํƒœ ์ฝ”๋“œ, ํ—ค๋”, ๋ณธ๋ฌธ์„ ํฌํ•จํ•˜๊ณ , Future ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
28+
29+
### ์ปจํ…์ธ (Content)
30+
31+
ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ Vapor์˜ [content](content.md) API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…์ธ ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๊ฑฐ๋‚˜, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ ํ—ค๋”๋ฅผ ์š”์ฒญ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” `beforeSend` ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
32+
33+
```swift
34+
let response = try await req.client.post("https://httpbin.org/status/200") { req in
35+
// Encode query string to the request URL.
36+
try req.query.encode(["q": "test"])
37+
38+
// Encode JSON to the request body.
39+
try req.content.encode(["hello": "world"])
40+
41+
// Add auth header to the request
42+
let auth = BasicAuthorization(username: "something", password: "somethingelse")
43+
req.headers.basicAuthorization = auth
44+
}
45+
// Handle the response.
46+
```
47+
48+
๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ, `Content`๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‘๋‹ต ๋ณธ๋ฌธ์„ ๋””์ฝ”๋”ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
49+
50+
```swift
51+
let response = try await req.client.get("https://httpbin.org/json")
52+
let json = try response.content.decode(MyJSONResponse.self)
53+
```
54+
55+
๋งŒ์•ฝ future์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, `flatMapThrowing`์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
56+
57+
```swift
58+
return req.client.get("https://httpbin.org/json").flatMapThrowing { res in
59+
try res.content.decode(MyJSONResponse.self)
60+
}.flatMap { json in
61+
// Use JSON here
62+
}
63+
```
64+
65+
## ์„ค์ •(Configuration)
66+
67+
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ด ๋‚ด๋ถ€ HTTP ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
68+
69+
```swift
70+
// Disable automatic redirect following.
71+
app.http.client.configuration.redirectConfiguration = .disallow
72+
```
73+
74+
๊ธฐ๋ณธ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ˜๋“œ์‹œ ์ฒ˜์Œ _์‚ฌ์šฉํ•˜๊ธฐ ์ „์—_ ๋จผ์ € ์„ค์ •์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
75+
76+
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# ์ปจํŠธ๋กค๋Ÿฌ(Controllers)
2+
3+
์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š”๋ฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์š”์ฒญ(request)์„ ๋ฐ›๊ณ  ์‘๋‹ต(response)์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์˜ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.
4+
5+
์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์œ„์น˜ํ•˜๊ธฐ์— ์ข‹์€ ๊ณณ์€ [Controllers](../getting-started/folder-structure.md#controllers) ํด๋”์ž…๋‹ˆ๋‹ค.
6+
7+
## ๊ฐœ์š”
8+
9+
์˜ˆ์‹œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
10+
11+
```swift
12+
import Vapor
13+
14+
struct TodosController: RouteCollection {
15+
func boot(routes: RoutesBuilder) throws {
16+
let todos = routes.grouped("todos")
17+
todos.get(use: index)
18+
todos.post(use: create)
19+
20+
todos.group(":id") { todo in
21+
todo.get(use: show)
22+
todo.put(use: update)
23+
todo.delete(use: delete)
24+
}
25+
}
26+
27+
func index(req: Request) async throws -> [Todo] {
28+
try await Todo.query(on: req.db).all()
29+
}
30+
31+
func create(req: Request) async throws -> Todo {
32+
let todo = try req.content.decode(Todo.self)
33+
try await todo.save(on: req.db)
34+
return todo
35+
}
36+
37+
func show(req: Request) async throws -> Todo {
38+
guard let todo = try await Todo.find(req.parameters.get("id"), on: req.db) else {
39+
throw Abort(.notFound)
40+
}
41+
return todo
42+
}
43+
44+
func update(req: Request) async throws -> Todo {
45+
guard let todo = try await Todo.find(req.parameters.get("id"), on: req.db) else {
46+
throw Abort(.notFound)
47+
}
48+
let updatedTodo = try req.content.decode(Todo.self)
49+
todo.title = updatedTodo.title
50+
try await todo.save(on: req.db)
51+
return todo
52+
}
53+
54+
func delete(req: Request) async throws -> HTTPStatus {
55+
guard let todo = try await Todo.find(req.parameters.get("id"), on: req.db) else {
56+
throw Abort(.notFound)
57+
}
58+
try await todo.delete(on: req.db)
59+
return .ok
60+
}
61+
}
62+
```
63+
64+
์ปจํŠธ๋กค๋Ÿฌ ๋ฉ”์„œ๋“œ๋Š” `Request`์„ ๋ฐ›๊ณ  `ResponseEncodable` ์„ ์ค€์ˆ˜ํ•˜๋Š” ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐ ๋˜๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
65+
66+
๋งˆ์ง€๋ง‰์œผ๋กœ `routes.swift`์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
67+
68+
```swift
69+
try app.register(collection: TodosController())
70+
```
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
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

Comments
ย (0)