sinatra 1.4.4 → 1.4.5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sinatra might be problematic. Click here for more details.

@@ -1,10 +1,11 @@
1
1
  # Sinatra
2
2
 
3
- *주의: 이 문서는 영문판의 번역본이며 최신판 문서와 다를 수 있음.*
3
+ *주의: 이 문서는 영문판의 번역본이며 최신판 문서와 다를 수 있습니다.*
4
4
 
5
- Sinatra는 최소한의 노력으로 루비 기반 웹 애플리케이션을 신속하게 만들 수 있게 해 주는 [DSL](http://en.wikipedia.org/wiki/Domain-specific_language)이다:
5
+ Sinatra는 최소한의 노력으로 루비 기반 웹 애플리케이션을 신속하게 만들 수 있게
6
+ 해 주는 [DSL](http://en.wikipedia.org/wiki/Domain-specific_language)입니다.
6
7
 
7
- ```ruby
8
+ ``` ruby
8
9
  # myapp.rb
9
10
  require 'sinatra'
10
11
 
@@ -13,23 +14,114 @@ get '/' do
13
14
  end
14
15
  ```
15
16
 
16
- 다음과 같이 젬을 설치하고 실행한다:
17
+ 젬을 설치합니다.
17
18
 
18
- ```ruby
19
+ ``` shell
19
20
  gem install sinatra
20
- ruby myapp.rb
21
21
  ```
22
22
 
23
- 확인: http://localhost:4567
23
+ 실행합니다.
24
+
25
+ ``` shell
26
+ ruby myapp.rb
27
+ ```
24
28
 
25
- `gem install thin`도 함께 실행하기를 권장하며, 그럴 경우 Sinatra는 thin을 부른다.
29
+ `http://localhost:4567`를 확인해 보세요.
30
+
31
+ `gem install thin`도 함께 실행하기를 권장합니다.
32
+ thin이 설치되어 있을 경우 Sinatra는 thin을 통해 실행합니다.
33
+
34
+ ## 목차
35
+
36
+ * [Sinatra](#sinatra)
37
+ * [목차](#목차)
38
+ * [라우터(Routes)](#라우터routes)
39
+ * [조건(Conditions)](#조건conditions)
40
+ * [반환값(Return Values)](#반환값return-values)
41
+ * [커스텀 라우터 매처(Custom Route Matchers)](#커스텀-라우터-매처custom-route-matchers)
42
+ * [정적 파일(Static Files)](#정적-파일static-files)
43
+ * [뷰 / 템플릿(Views / Templates)](#뷰--템플릿views--templates)
44
+ * [리터럴 템플릿(Literal Templates)](#리터럴-템플릿literal-templates)
45
+ * [가능한 템플릿 언어들(Available Template Languages)](#가능한-템플릿-언어들available-template-languages)
46
+ * [Haml 템플릿](#haml-템플릿)
47
+ * [Erb 템플릿](#erb-템플릿)
48
+ * [Builder 템플릿](#builder-템플릿)
49
+ * [Nokogiri 템플릿](#nokogiri-템플릿)
50
+ * [Sass 템플릿](#sass-템플릿)
51
+ * [SCSS 템플릿](#scss-템플릿)
52
+ * [Less 템플릿](#less-템플릿)
53
+ * [Liquid 템플릿](#liquid-템플릿)
54
+ * [Markdown 템플릿](#markdown-템플릿)
55
+ * [Textile 템플릿](#textile-템플릿)
56
+ * [RDoc 템플릿](#rdoc-템플릿)
57
+ * [Radius 템플릿](#radius-템플릿)
58
+ * [Markaby 템플릿](#markaby-템플릿)
59
+ * [RABL 템플릿](#rabl-템플릿)
60
+ * [Slim 템플릿](#slim-템플릿)
61
+ * [Creole 템플릿](#creole-템플릿)
62
+ * [CoffeeScript 템플릿](#coffeescript-템플릿)
63
+ * [Stylus 템플릿](#stylus-템플릿)
64
+ * [Yajl 템플릿](#yajl-템플릿)
65
+ * [WLang 템플릿](#wlang-템플릿)
66
+ * [템플릿에서 변수에 접근하기](#템플릿에서-변수에-접근하기)
67
+ * [템플릿에서의 `yield` 와 중첩 레이아웃](#템플릿에서의-yield-와-중첩-레이아웃)
68
+ * [인라인 템플릿](#인라인-템플릿)
69
+ * [이름을 가지는 템플릿(Named Templates)](#이름을-가지는-템플릿named-templates)
70
+ * [파일 확장자 연결하기](#파일-확장자-연결하기)
71
+ * [나만의 고유한 템플릿 엔진 추가하기](#나만의-고유한-템플릿-엔진-추가하기)
72
+ * [필터(Filters)](#필터filters)
73
+ * [헬퍼(Helpers)](#헬퍼helpers)
74
+ * [세션(Sessions) 사용하기](#세션sessions-사용하기)
75
+ * [중단하기(Halting)](#중단하기halting)
76
+ * [넘기기(Passing)](#넘기기passing)
77
+ * [다른 라우터 부르기(Triggering Another Route)](#다른-라우터-부르기triggering-another-route)
78
+ * [본문, 상태 코드 및 헤더 설정하기](#본문-상태-코드-및-헤더-설정하기)
79
+ * [응답 스트리밍(Streaming Responses)](#응답-스트리밍streaming-responses)
80
+ * [로깅(Logging)](#로깅logging)
81
+ * [마임 타입(Mime Types)](#마임-타입mime-types)
82
+ * [URL 생성하기](#url-생성하기)
83
+ * [브라우저 재지정(Browser Redirect)](#브라우저-재지정browser-redirect)
84
+ * [캐시 컨트롤(Cache Control)](#캐시-컨트롤cache-control)
85
+ * [파일 전송하기(Sending Files)](#파일-전송하기sending-files)
86
+ * [요청 객체에 접근하기(Accessing the Request Object)](#요청-객체에-접근하기accessing-the-request-object)
87
+ * [첨부(Attachments)](#첨부attachments)
88
+ * [날짜와 시간 다루기](#날짜와-시간-다루기)
89
+ * [템플릿 파일 참조하기](#템플릿-파일-참조하기)
90
+ * [설정(Configuration)](#설정configuration)
91
+ * [공격 방어 설정하기(Configuring attack protection)](#공격-방어-설정하기configuring-attack-protection)
92
+ * [가능한 설정들(Available Settings)](#가능한-설정들available-settings)
93
+ * [환경(Environments)](#환경environments)
94
+ * [에러 처리(Error Handling)](#에러-처리error-handling)
95
+ * [찾을 수 없음(Not Found)](#찾을-수-없음not-found)
96
+ * [에러](#에러)
97
+ * [Rack 미들웨어(Rack Middleware)](#rack-미들웨어rack-middleware)
98
+ * [테스팅(Testing)](#테스팅testing)
99
+ * [Sinatra::Base - 미들웨어(Middleware), 라이브러리(Libraries), 그리고 모듈 앱(Modular Apps)](#sinatrabase---미들웨어middleware-라이브러리libraries-그리고-모듈-앱modular-apps)
100
+ * [모듈(Modular) vs. 전통적 방식(Classic Style)](#모듈modular-vs-전통적-방식classic-style)
101
+ * [모듈 애플리케이션(Modular Application) 제공하기](#모듈-애플리케이션modular-application-제공하기)
102
+ * [config.ru로 전통적 방식의 애플리케이션 사용하기](#configru로-전통적-방식의-애플리케이션-사용하기)
103
+ * [언제 config.ru를 사용할까?](#언제-configru를-사용할까)
104
+ * [Sinatra를 미들웨어로 사용하기](#sinatra를-미들웨어로-사용하기)
105
+ * [동적인 애플리케이션 생성(Dynamic Application Creation)](#동적인-애플리케이션-생성dynamic-application-creation)
106
+ * [범위(Scopes)와 바인딩(Binding)](#범위scopes와-바인딩binding)
107
+ * [애플리케이션/클래스 범위](#애플리케이션클래스-범위)
108
+ * [요청/인스턴스 범위](#요청인스턴스-범위)
109
+ * [위임 범위(Delegation Scope)](#위임-범위delegation-scope)
110
+ * [명령행(Command Line)](#명령행command-line)
111
+ * [요구사항(Requirement)](#요구사항requirement)
112
+ * [최신(The Bleeding Edge)](#최신the-bleeding-edge)
113
+ * [Bundler를 사용하여](#bundler를-사용하여)
114
+ * [직접 하기(Roll Your Own)](#직접-하기roll-your-own)
115
+ * [전역으로 설치(Install Globally)](#전역으로-설치install-globally)
116
+ * [버저닝(Versioning)](#버저닝versioning)
117
+ * [더 읽을 거리(Further Reading)](#더-읽을-거리further-reading)
26
118
 
27
119
  ## 라우터(Routes)
28
120
 
29
- Sinatra에서, 라우터(route)는 URL-매칭 패턴과 쌍을 이루는 HTTP 메서드다.
30
- 각각의 라우터는 블록과 연결된다:
121
+ Sinatra에서, 라우터(route)는 URL-매칭 패턴과 쌍을 이루는 HTTP 메서드입니다.
122
+ 각각의 라우터는 블록과 연결됩니다.
31
123
 
32
- ```ruby
124
+ ``` ruby
33
125
  get '/' do
34
126
  .. 무언가 보여주기(show) ..
35
127
  end
@@ -53,13 +145,21 @@ end
53
145
  options '/' do
54
146
  .. 무언가 주기(appease) ..
55
147
  end
148
+
149
+ link '/' do
150
+ .. 무언가 관계맺기(affiliate) ..
151
+ end
152
+
153
+ unlink '/' do
154
+ .. 무언가 격리하기(separate) ..
155
+ end
56
156
  ```
57
157
 
58
- 라우터는 정의된 순서에 따라 매치되며 매칭된 번째 라우터가 호출된다.
158
+ 라우터는 정의된 순서에 따라 매치되고 요청에 대해 가장 먼저 매칭된 라우터가 호출됩니다.
59
159
 
60
- 라우터 패턴에는 이름을 가진 매개변수가 포함될 수있으며, `params` 해시로 접근할 수 있다:
160
+ 라우터 패턴에는 이름을 가진 매개변수가 포함될 있으며, `params` 해시로 접근할 수 있습니다.
61
161
 
62
- ```ruby
162
+ ``` ruby
63
163
  get '/hello/:name' do
64
164
  # "GET /hello/foo" 및 "GET /hello/bar"와 매치
65
165
  # params[:name]은 'foo' 또는 'bar'
@@ -67,17 +167,19 @@ get '/hello/:name' do
67
167
  end
68
168
  ```
69
169
 
70
- 또한 블록 매개변수를 통하여도 이름을 가진 매개변수에 접근할 수 있다:
170
+ 또한 블록 매개변수를 통하여도 이름을 가진 매개변수에 접근할 수 있습니다.
71
171
 
72
- ```ruby
172
+ ``` ruby
73
173
  get '/hello/:name' do |n|
174
+ # "GET /hello/foo" 및 "GET /hello/bar"와 매치
175
+ # params[:name]은 'foo' 또는 'bar'
74
176
  "Hello #{n}!"
75
177
  end
76
178
  ```
77
179
 
78
- 라우터 패턴에는 스플랫(splat, 또는 와일드카드)도 포함될 수 있으며, 이럴 경우 `params[:splat]` 배열로 접근할 수 있다:
180
+ 라우터 패턴에는 스플랫(splat, 또는 와일드카드)도 매개변수도 포함될 수 있으며, 이럴 경우 `params[:splat]` 배열을 통해 접근할 수 있습니다.
79
181
 
80
- ```ruby
182
+ ``` ruby
81
183
  get '/say/*/to/*' do
82
184
  # /say/hello/to/world와 매치
83
185
  params[:splat] # => ["hello", "world"]
@@ -89,46 +191,46 @@ get '/download/*.*' do
89
191
  end
90
192
  ```
91
193
 
92
- 또는 블록 매개변수도 가능하다:
194
+ 블록 매개변수로도 접근할 수 있습니다.
93
195
 
94
- ```ruby
196
+ ``` ruby
95
197
  get '/download/*.*' do |path, ext|
96
198
  [path, ext] # => ["path/to/file", "xml"]
97
199
  end
98
200
  ```
99
201
 
100
- 정규표현식을 이용한 라우터 매칭:
202
+ 라우터는 정규표현식으로 매치할 수 있습니다.
101
203
 
102
- ```ruby
204
+ ``` ruby
103
205
  get %r{/hello/([\w]+)} do
104
206
  "Hello, #{params[:captures].first}!"
105
207
  end
106
208
  ```
107
209
 
108
- 또는 블록 매개변수로도 가능:
210
+ 블록 매개변수로도 사용가능합니다.
109
211
 
110
- ```ruby
212
+ ``` ruby
111
213
  get %r{/hello/([\w]+)} do |c|
112
214
  "Hello, #{c}!"
113
215
  end
114
216
  ```
115
217
 
116
- 라우터 패턴에는 선택적인(optional) 매개변수도 올 수 있다:
218
+ 라우터 패턴에는 선택적인(optional) 매개변수도 올 수 있습니다.
117
219
 
118
- ```ruby
220
+ ``` ruby
119
221
  get '/posts.?:format?' do
120
- # "GET /posts" "GET /posts.json", "GET /posts.xml" 와 같은 어떤 확장자와도 매칭
222
+ # "GET /posts" 물론 "GET /posts.json", "GET /posts.xml" 와 같은 어떤 확장자와도 매칭
121
223
  end
122
224
  ```
123
225
 
124
226
  한편, 경로 탐색 공격 방지(path traversal attack protection, 아래 참조)를 비활성화시키지 않았다면,
125
- 요청 경로는 라우터와 매칭되기 이전에 수정될 수 있다.
227
+ 요청 경로는 라우터와 매칭되기 이전에 수정될 수 있습니다.
126
228
 
127
229
  ### 조건(Conditions)
128
230
 
129
- 라우터는 예를 들면 사용자 에이전트(user agent)같은 다양한 매칭 조건을 포함할 수 있다:
231
+ 라우터는 사용자 에이전트(user agent)같은 다양한 매칭 조건을 포함할 수 있습니다.
130
232
 
131
- ```ruby
233
+ ``` ruby
132
234
  get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
133
235
  "Songbird 버전 #{params[:agent][0]}을 사용하는군요!"
134
236
  end
@@ -138,9 +240,9 @@ get '/foo' do
138
240
  end
139
241
  ```
140
242
 
141
- 밖에 다른 조건으로는 `host_name`과 `provides`가 있다:
243
+ 다른 가능한 조건에는 `host_name`과 `provides`가 있습니다.
142
244
 
143
- ```ruby
245
+ ``` ruby
144
246
  get '/', :host_name => /^admin\./ do
145
247
  "Admin Area, Access denied!"
146
248
  end
@@ -154,9 +256,9 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
154
256
  end
155
257
  ```
156
258
 
157
- 여러분만의 조건도 쉽게 정의할있다:
259
+ 사용자 정의 조건도 쉽게 만들있습니다.
158
260
 
159
- ```ruby
261
+ ``` ruby
160
262
  set(:probability) { |value| condition { rand <= value } }
161
263
 
162
264
  get '/win_a_car', :probability => 0.1 do
@@ -168,9 +270,9 @@ get '/win_a_car' do
168
270
  end
169
271
  ```
170
272
 
171
- 여러 값을 받는 조건에는 스플랫(splat)을 사용하자:
273
+ 여러 값을 받는 조건에는 스플랫(splat)을 사용합니다.
172
274
 
173
- ```ruby
275
+ ``` ruby
174
276
  set(:auth) do |*roles| # <- 이게 스플랫
175
277
  condition do
176
278
  unless logged_in? && roles.any? {|role| current_user.in_role? role }
@@ -190,19 +292,19 @@ end
190
292
 
191
293
  ### 반환값(Return Values)
192
294
 
193
- 라우터 블록의 반환값은 HTTP 클라이언트로 전달되는 응답 본문을 결정하거나, 또는 Rack 스택에서 다음 번 미들웨어를 결정한다.
194
- 대부분의 경우, 이 반환값은 위의 예제에서 보듯 문자열이지만, 다른 값도 가능하다.
295
+ 라우터 블록의 반환 값은 HTTP 클라이언트로 전달되는 응답 본문만을 결정하거나, 또는 Rack 스택에서 다음 번 미들웨어만를 결정합니다.
296
+ 위의 예제에서 볼 수 있지만 대부분의 경우 이 반환값은 문자열입니다.하지만 다른 값도 허용됩니다.
195
297
 
196
- 유효한 Rack 응답, Rack 본문 객체 또는 HTTP 상태 코드가 되는 어떠한 객체라도 반환할 수 있다:
298
+ 유효한 Rack 응답, Rack 본문 객체 또는 HTTP 상태 코드가 되는 어떠한 객체라도 반환할 수 있습니다.
197
299
 
198
300
  * 세 요소를 가진 배열: `[상태 (Fixnum), 헤더 (Hash), 응답 본문 (#each에 반응)]`
199
301
  * 두 요소를 가진 배열: `[상태 (Fixnum), 응답 본문 (#each에 반응)]`
200
302
  * `#each`에 반응하고 주어진 블록으로 문자열만을 전달하는 객체
201
303
  * 상태 코드를 의미하는 Fixnum
202
304
 
203
- 이에 따라 우리는, 예를 들면, 스트리밍(streaming) 예제를 쉽게 구현할 수 있다:
305
+ 이것을 이용한 예를 들자면, 스트리밍(streaming) 예제를 쉽게 구현할 수 있습니다.
204
306
 
205
- ```ruby
307
+ ``` ruby
206
308
  class Stream
207
309
  def each
208
310
  100.times { |i| yield "#{i}\n" }
@@ -212,14 +314,14 @@ end
212
314
  get('/') { Stream.new }
213
315
  ```
214
316
 
215
- 이런 번거로움을 줄이기 위해 `stream` 헬퍼 메서드(아래 참조)를 사용하여 스트리밍 로직을 라우터 속에 수도 있다.
317
+ `stream` 헬퍼 메서드(아래 참조)를 사용하면 이런 번거로움을 줄이고 스트리밍 로직을 라우터 속에 포함 시킬 수도 있습니다.
216
318
 
217
319
  ### 커스텀 라우터 매처(Custom Route Matchers)
218
320
 
219
- 위에서 보듯, Sinatra에는 문자열 패턴 및 정규표현식을 이용한 라우터 매칭 지원이 내장되어 있다.
220
- 그렇지만, 그게 끝이 아니다. 여러분 만의 매처(matcher)도 쉽게 정의할 수 있다:
321
+ 위에서 보듯, Sinatra에는 문자열 패턴 및 정규표현식을 이용한 라우터 매칭 지원이 내장되어 있습니다.
322
+ 하지만, 그게 끝은 아닙니다. 여러분 만의 매처(matcher)도 쉽게 정의할 수 있습니다.
221
323
 
222
- ```ruby
324
+ ``` ruby
223
325
  class AllButPattern
224
326
  Match = Struct.new(:captures)
225
327
 
@@ -242,18 +344,18 @@ get all_but("/index") do
242
344
  end
243
345
  ```
244
346
 
245
- 사실 위의 예제는 조금 과하게 작성된 면이 있다. 다음과 같이 표현할 수도 있다:
347
+ 사실 위의 예제는 조금 과하게 작성된 면이 있습니다. 간단하게 표현할 수도 있어요.
246
348
 
247
- ```ruby
349
+ ``` ruby
248
350
  get // do
249
351
  pass if request.path_info == "/index"
250
352
  # ...
251
353
  end
252
354
  ```
253
355
 
254
- 또는 네거티브 룩어헤드(negative look ahead) 사용할 수도 있다:
356
+ 또는 거꾸로 탐색(negative look ahead) 수도 있습니다.
255
357
 
256
- ```ruby
358
+ ``` ruby
257
359
  get %r{^(?!/index$)} do
258
360
  # ...
259
361
  end
@@ -261,62 +363,62 @@ end
261
363
 
262
364
  ## 정적 파일(Static Files)
263
365
 
264
- 정적 파일들은 `./public`에서 제공된다.
265
- 위치를 다른 곳으로 변경하려면 `:public_folder` 옵션을 사용하면 된다:
366
+ 정적 파일들은 `./public` 디렉터리에서 제공됩니다. 위치를 다른 곳으로
367
+ 변경하려면 `:public_folder` 옵션을 지정하면 됩니다.
266
368
 
267
- ```ruby
369
+ ``` ruby
268
370
  set :public_folder, File.dirname(__FILE__) + '/static'
269
371
  ```
270
372
 
271
- 이 때 public 디렉터리명은 URL에 포함되지 않는다는 점에 유의.
272
- `./public/css/style.css` 파일은 `http://example.com/css/style.css` 로 접근할 수 있다.
373
+ public 디렉터리명은 URL에 포함되지 않는다는 점에 주의하세요.
374
+ `./public/css/style.css` 파일은 아마 `http://example.com/css/style.css` 로 접근할 수 있을 것 입니다.
273
375
 
274
- `Cache-Control` 헤더 정보를 추가하려면 `:static_cache_control` 설정(아래 참조)을 사용하면 된다.
376
+ `Cache-Control` 헤더 정보를 추가하려면 `:static_cache_control` 설정(아래 참조)을 사용하면 됩니다.
275
377
 
276
378
  ## 뷰 / 템플릿(Views / Templates)
277
379
 
278
- 템플릿 언어는 그들만의 고유한 렌더링 메서드를 통해 표출된다.
279
- 이들 메서드는 단순히 문자열을 반환한다.
380
+ 템플릿 언어들은 각각의 렌더링 메서드를 통해 표출됩니다.
381
+ 이들 메서드는 문자열을 반환할 뿐입니다.
280
382
 
281
- ```ruby
383
+ ``` ruby
282
384
  get '/' do
283
385
  erb :index
284
386
  end
285
387
  ```
286
388
 
287
- 메서드는 `views/index.erb`를 렌더한다.
389
+ 구문은 `views/index.erb`를 렌더합니다.
288
390
 
289
- 템플릿 이름 대신 템플릿의 내용을 직접 전달할 수도 있다:
391
+ 템플릿 이름 대신 템플릿의 내용을 직접 넘길 수도 있습니다.
290
392
 
291
- ```ruby
393
+ ``` ruby
292
394
  get '/' do
293
395
  code = "<%= Time.now %>"
294
396
  erb code
295
397
  end
296
398
  ```
297
399
 
298
- 템플릿은 두 번째 인자로 옵션값의 해시를 받는다:
400
+ 템플릿은 두 번째 인자로 옵션값의 해시를 받습니다.
299
401
 
300
- ```ruby
402
+ ``` ruby
301
403
  get '/' do
302
404
  erb :index, :layout => :post
303
405
  end
304
406
  ```
305
407
 
306
- 이렇게 하면 `views/post.erb` 속에 내장된 `views/index.erb`를 렌더한다.
307
- (기본값은 `views/layout.erb`이며, 파일이 존재할 경우에만 먹는다).
408
+ 구문은 `views/post.erb` 속에 내장된 `views/index.erb`를 렌더합니다.
409
+ (`views/layout.erb`파일이 존재할 경우 기본값은 `views/layout.erb`입니다.)
308
410
 
309
- Sinatra가 이해하지 못하는 모든 옵션값들은 템플릿 엔진으로 전달될 것이다:
411
+ Sinatra가 이해하지 못하는 모든 옵션값들은 템플릿 엔진으로 전달됩니다.
310
412
 
311
- ```ruby
413
+ ``` ruby
312
414
  get '/' do
313
415
  haml :index, :format => :html5
314
416
  end
315
417
  ```
316
418
 
317
- 옵션값은 템플릿 언어별로 일반적으로 설정할 수도 있다:
419
+ 옵션값은 템플릿 언어별로 전역적으로 설정할 수도 있습니다.
318
420
 
319
- ```ruby
421
+ ``` ruby
320
422
  set :haml, :format => :html5
321
423
 
322
424
  get '/' do
@@ -324,215 +426,241 @@ get '/' do
324
426
  end
325
427
  ```
326
428
 
327
- render 메서드에서 전달된 옵션값들은 `set`을 통해 설정한 옵션값을 덮어 쓴다.
429
+ render 메서드에서 전달된 옵션값들은 `set`을 통해 설정한 옵션값보다 우선합니다.
328
430
 
329
- 가능한 옵션값들:
431
+ 가능한 옵션값들은 다음과 같습니다.
330
432
 
331
433
  <dl>
332
434
  <dt>locals</dt>
333
- <dd>문서로 전달되는 local 목록. 파셜과 함께 사용하기 좋음.
334
- 예제: <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>
435
+ <dd>
436
+ 문서로 전달되는 local 목록. 파셜과 함께 사용하기 좋음.
437
+ 예제: <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>
335
438
  </dd>
336
439
 
337
440
  <dt>default_encoding</dt>
338
- <dd>불확실한 경우에 사용할 문자열 인코딩. 기본값은 <tt>settings.default_encoding</tt>.</dd>
441
+ <dd>
442
+ 불확실한 경우에 사용할 문자열 인코딩.
443
+ 기본값은 <tt>settings.default_encoding</tt>.
444
+ </dd>
339
445
 
340
446
  <dt>views</dt>
341
- <dd>템플릿을 로드할 뷰 폴더. 기본값은 <tt>settings.views</tt>.</dd>
447
+ <dd>
448
+ 템플릿을 로드할 뷰 폴더.
449
+ 기본값은 <tt>settings.views</tt>.
450
+ </dd>
342
451
 
343
452
  <dt>layout</dt>
344
- <dd>레이아웃을 사용할지 여부 (<tt>true</tt> 또는 <tt>false</tt>), 만약 이 값이 심볼일 경우,
345
- 사용할 템플릿을 지정. 예제: <tt>erb :index, :layout => !request.xhr?</tt>
453
+ <dd>
454
+ 레이아웃을 사용할지 여부 (<tt>true</tt> 또는 <tt>false</tt>), 만약 값이 심볼일 경우,
455
+ 사용할 템플릿을 지정. 예제: <tt>erb :index, :layout => !request.xhr?</tt>
346
456
  </dd>
347
457
 
348
458
  <dt>content_type</dt>
349
- <dd>템플릿이 생성하는 Content-Type, 기본값은 템플릿 언어에 의존.</dd>
459
+ <dd>
460
+ 템플릿이 생성하는 Content-Type, 기본값은 템플릿 언어에 의존.
461
+ </dd>
350
462
 
351
463
  <dt>scope</dt>
352
- <dd>템플릿을 렌더링하는 범위. 기본값은 어플리케이션 인스턴스.
353
- 만약 값을 변경하면, 인스턴스 변수와 헬퍼 메서드들을 사용할 수 없게 됨.</dd>
464
+ <dd>
465
+ 템플릿을 렌더링하는 범위. 기본값은 어플리케이션 인스턴스.
466
+ 만약 이 값을 변경하면, 인스턴스 변수와 헬퍼 메서드들을 사용할 수 없게 됨.
467
+ </dd>
354
468
 
355
469
  <dt>layout_engine</dt>
356
470
  <dd>
357
- 레이아웃 렌더링에 사용할 템플릿 엔진. 레이아웃을 지원하지 않는 언어인 경우에 유용.
358
- 기본값은 템플릿에서 사용하는 엔진. 예제: <tt>set :rdoc, :layout_engine => :erb</tt>
471
+ 레이아웃 렌더링에 사용할 템플릿 엔진. 레이아웃을 지원하지 않는 언어인 경우에 유용.
472
+ 기본값은 템플릿에서 사용하는 엔진. 예제: <tt>set :rdoc, :layout_engine => :erb</tt>
359
473
  </dd>
360
474
  </dl>
361
475
 
362
476
 
363
- 템플릿은 `./views` 아래에 놓이는 것으로 가정됨. 만약 뷰 디렉터리를 다른 곳으로 두려면:
477
+ 템플릿은 `./views` 디렉터리에 있는 것으로 가정됩니다. 뷰 디렉터리를
478
+ 다른 곳으로 하고 싶으시면 이렇게 하세요.
364
479
 
365
- ```ruby
480
+ ``` ruby
366
481
  set :views, settings.root + '/templates'
367
482
  ```
368
483
 
369
- 꼭 알아야 할 중요한 점 한 가지는 템플릿은 언제나 심볼로 참조된다는 것이며,
370
- 템플릿이 하위 디렉터리에 위치한 경우라도 마찬가지임(그럴 경우에는 `:'subdir/template'`을 사용).
371
- 반드시 심볼이어야 하는 이유는, 만약 그렇게 하지 않으면 렌더링 메서드가 전달된 문자열을 직접 렌더하려 할 것이기 때문임.
484
+ 템플릿은 언제나 심볼로 참조되어야 한다는 것에 주의하세요.
485
+ 템플릿이 하위 디렉터리에 위치한 경우(그럴 경우에는 `:'subdir/template'`을
486
+ 사용)에도 예외는 없습니다. 반드시 심볼이어야 하는 이유는, 문자열을 넘기면
487
+ 렌더링 메서드가 전달된 문자열을 직접 렌더하기 때문입니다.
488
+
489
+ ### 리터럴 템플릿(Literal Templates)
490
+
491
+ ``` ruby
492
+ get '/' do
493
+ haml '%div.title Hello World'
494
+ end
495
+ ```
496
+
497
+ 템플릿 문자열을 렌더합니다.
372
498
 
373
499
  ### 가능한 템플릿 언어들(Available Template Languages)
374
500
 
375
- 일부 언어는 여러 개의 구현이 있음. 어느 구현을 사용할지 저정하려면(그리고 스레드-안전thread-safe 모드로 하려면),
376
- 먼저 require 시키기만 하면 됨:
501
+ 일부 언어는 여러 개의 구현이 있습니다. (스레드에 안전하게 thread-safe) 어느 구현을
502
+ 사용할지 저정하려면, 먼저 require 하기만 하면 됩니다.
377
503
 
378
- ```ruby
504
+ ``` ruby
379
505
  require 'rdiscount' # or require 'bluecloth'
380
506
  get('/') { markdown :index }
381
507
  ```
382
508
 
383
- ### Haml 템플릿
509
+ #### Haml 템플릿
384
510
 
385
511
  <table>
386
512
  <tr>
387
- <td>의존</td>
388
- <td><a href="http://haml.info/">haml</a></td>
513
+ <td>의존성</td>
514
+ <td><a href="http://haml.info/">haml</a></td>
389
515
  </tr>
390
516
  <tr>
391
- <td>파일 확장자</td>
392
- <td><tt>.haml</tt></td>
517
+ <td>파일 확장자</td>
518
+ <td><tt>.haml</tt></td>
393
519
  </tr>
394
520
  <tr>
395
- <td>예</td>
396
- <td><tt>haml :index, :format => :html5</tt></td>
521
+ <td>예제</td>
522
+ <td><tt>haml :index, :format => :html5</tt></td>
397
523
  </tr>
398
524
  </table>
399
525
 
400
- ### Erb 템플릿
526
+ #### Erb 템플릿
401
527
 
402
528
  <table>
403
529
  <tr>
404
- <td>의존</td>
405
- <td><a href="http://www.kuwata-lab.com/erubis/">erubis</a> 또는 erb (루비 속에 포함)</td>
530
+ <td>의존성</td>
531
+ <td><a href="http://www.kuwata-lab.com/erubis/">erubis</a> 또는 erb (루비 속에 포함)</td>
406
532
  </tr>
407
533
  <tr>
408
- <td>파일 확장자</td>
409
- <td><tt>.erb</tt>, <tt>.rhtml</tt> 또는 <tt>.erubis</tt> (Erubis만 해당)</td>
534
+ <td>파일 확장자</td>
535
+ <td><tt>.erb</tt>, <tt>.rhtml</tt>, <tt>.erubis</tt> (Erubis만 해당)</td>
410
536
  </tr>
411
537
  <tr>
412
- <td>예제</td>
413
- <td><tt>erb :index</tt></td>
538
+ <td>예제</td>
539
+ <td><tt>erb :index</tt></td>
414
540
  </tr>
415
541
  </table>
416
542
 
417
- ### Builder 템플릿
543
+ #### Builder 템플릿
418
544
 
419
545
  <table>
420
546
  <tr>
421
- <td>의존</td>
422
- <td><a href="http://builder.rubyforge.org/">builder</a></td>
547
+ <td>의존성</td>
548
+ <td><a href="http://builder.rubyforge.org/">builder</a></td>
423
549
  </tr>
424
550
  <tr>
425
- <td>파일 확장자</td>
426
- <td><tt>.builder</tt></td>
551
+ <td>파일 확장자</td>
552
+ <td><tt>.builder</tt></td>
427
553
  </tr>
428
554
  <tr>
429
- <td>Example</td>
430
- <td><tt>builder { |xml| xml.em "hi" }</tt></td>
555
+ <td>예제</td>
556
+ <td><tt>builder { |xml| xml.em "hi" }</tt></td>
431
557
  </tr>
432
558
  </table>
433
559
 
434
- 인라인 템플릿으로 블록을 받음(예제 참조).
560
+ 인라인 템플릿으로 블록을 받을 수도 있습니다(예제 참조).
435
561
 
436
- ### Nokogiri 템플릿
562
+ #### Nokogiri 템플릿
437
563
 
438
564
  <table>
439
565
  <tr>
440
- <td>의존</td>
441
- <td><a href="http://nokogiri.org/">nokogiri</a></td>
566
+ <td>의존성</td>
567
+ <td><a href="http://nokogiri.org/">nokogiri</a></td>
442
568
  </tr>
443
569
  <tr>
444
- <td>파일 확장자</td>
445
- <td><tt>.nokogiri</tt></td>
570
+ <td>파일 확장자</td>
571
+ <td><tt>.nokogiri</tt></td>
446
572
  </tr>
447
573
  <tr>
448
- <td>예제</td>
449
- <td><tt>nokogiri { |xml| xml.em "hi" }</tt></td>
574
+ <td>예제</td>
575
+ <td><tt>nokogiri { |xml| xml.em "hi" }</tt></td>
450
576
  </tr>
451
577
  </table>
452
578
 
453
- 인라인 템플릿으로 블록을 받음(예제 참조).
579
+ 인라인 템플릿으로 블록을 받을 수도 있습니다(예제 참조).
454
580
 
455
- ### Sass 템플릿
581
+ #### Sass 템플릿
456
582
 
457
583
  <table>
458
584
  <tr>
459
- <td>의존</td>
460
- <td><a href="http://sass-lang.com/">sass</a></td>
585
+ <td>의존성</td>
586
+ <td><a href="http://sass-lang.com/">sass</a></td>
461
587
  </tr>
462
588
  <tr>
463
- <td>파일 확장자</td>
464
- <td><tt>.sass</tt></td>
589
+ <td>파일 확장자</td>
590
+ <td><tt>.sass</tt></td>
465
591
  </tr>
466
592
  <tr>
467
- <td>예제</td>
468
- <td><tt>sass :stylesheet, :style => :expanded</tt></td>
593
+ <td>예제</td>
594
+ <td><tt>sass :stylesheet, :style => :expanded</tt></td>
469
595
  </tr>
470
596
  </table>
471
597
 
472
- ### SCSS 템플릿
598
+ #### SCSS 템플릿
473
599
 
474
600
  <table>
475
601
  <tr>
476
- <td>의존</td>
477
- <td><a href="http://sass-lang.com/">sass</a></td>
602
+ <td>의존성</td>
603
+ <td><a href="http://sass-lang.com/">sass</a></td>
478
604
  </tr>
479
605
  <tr>
480
- <td>파일 확장자</td>
481
- <td><tt>.scss</tt></td>
606
+ <td>파일 확장자</td>
607
+ <td><tt>.scss</tt></td>
482
608
  </tr>
483
609
  <tr>
484
- <td>예제</td>
485
- <td><tt>scss :stylesheet, :style => :expanded</tt></td>
610
+ <td>예제</td>
611
+ <td><tt>scss :stylesheet, :style => :expanded</tt></td>
486
612
  </tr>
487
613
  </table>
488
614
 
489
- ### Less 템플릿
615
+ #### Less 템플릿
490
616
 
491
617
  <table>
492
618
  <tr>
493
- <td>의존</td>
494
- <td><a href="http://www.lesscss.org/">less</a></td>
619
+ <td>의존성</td>
620
+ <td><a href="http://www.lesscss.org/">less</a></td>
495
621
  </tr>
496
622
  <tr>
497
- <td>파일 확장자</td>
498
- <td><tt>.less</tt></td>
623
+ <td>파일 확장자</td>
624
+ <td><tt>.less</tt></td>
499
625
  </tr>
500
626
  <tr>
501
- <td>예제</td>
502
- <td><tt>less :stylesheet</tt></td>
627
+ <td>예제</td>
628
+ <td><tt>less :stylesheet</tt></td>
503
629
  </tr>
504
630
  </table>
505
631
 
506
- ### Liquid 템플릿
632
+ #### Liquid 템플릿
507
633
 
508
634
  <table>
509
635
  <tr>
510
- <td>의존</td>
511
- <td><a href="http://www.liquidmarkup.org/">liquid</a></td>
636
+ <td>의존성</td>
637
+ <td><a href="http://www.liquidmarkup.org/">liquid</a></td>
512
638
  </tr>
513
639
  <tr>
514
- <td>파일 확장자</td>
515
- <td><tt>.liquid</tt></td>
640
+ <td>파일 확장자</td>
641
+ <td><tt>.liquid</tt></td>
516
642
  </tr>
517
643
  <tr>
518
- <td>예제</td>
519
- <td><tt>liquid :index, :locals => { :key => 'value' }</tt></td>
644
+ <td>예제</td>
645
+ <td><tt>liquid :index, :locals => { :key => 'value' }</tt></td>
520
646
  </tr>
521
647
  </table>
522
648
 
523
- Liquid 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없기 때문에, 거의 대부분의 경우 locals를 전달해야 함.
649
+ Liquid 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없기
650
+ 때문에, 거의 대부분의 경우 locals를 전달해야 합니다.
524
651
 
525
- ### Markdown 템플릿
652
+ #### Markdown 템플릿
526
653
 
527
654
  <table>
528
655
  <tr>
529
- <td>의존</td>
656
+ <td>의존성</td>
530
657
  <td>
531
- <a href="https://github.com/rtomayko/rdiscount">rdiscount</a>,
532
- <a href="https://github.com/vmg/redcarpet">redcarpet</a>,
533
- <a href="http://deveiate.org/projects/BlueCloth">bluecloth</a>,
534
- <a href="http://kramdown.rubyforge.org/">kramdown</a> *또는*
535
- <a href="http://maruku.rubyforge.org/">maruku</a>
658
+ <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
659
+ <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
660
+ <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
661
+ <a href="http://kramdown.rubyforge.org/" title="kramdown">kramdown</a>,
662
+ <a href="http://maruku.rubyforge.org/" title="maruku">maruku</a>
663
+ 중 아무거나
536
664
  </td>
537
665
  </tr>
538
666
  <tr>
@@ -545,289 +673,386 @@ Liquid 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없
545
673
  </tr>
546
674
  </table>
547
675
 
548
- 마크다운에서는 메서드 호출 뿐 아니라 locals 전달도 안됨.
549
- 따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 될 것임:
676
+ Markdown에서는 메서드 호출 뿐 아니라 locals 전달도 안됩니다.
677
+ 따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 됩니다.
550
678
 
551
- ```ruby
679
+ ``` ruby
552
680
  erb :overview, :locals => { :text => markdown(:introduction) }
553
681
  ```
554
682
 
555
- 또한 다른 템플릿 속에서 `markdown` 메서드를 호출할 수도 있음:
683
+ 다른 템플릿 속에서 `markdown` 메서드를 호출할 수도 있습니다.
556
684
 
557
- ```ruby
685
+ ``` ruby
558
686
  %h1 안녕 Haml!
559
687
  %p= markdown(:greetings)
560
688
  ```
561
689
 
562
- Markdown에서 루비를 호출할 수 없기 때문에, Markdown으로 작성된 레이아웃은 사용할 수 없음.
563
- 단, `:layout_engine` 옵션으로 템플릿의 레이아웃은 다른 렌더링 엔진을 사용하는 것은 가능.
690
+ Markdown에서 루비를 호출할 수 없기 때문에, Markdown으로 작성된 레이아웃은
691
+ 사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
692
+ 다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
564
693
 
565
- ### Textile 템플릿
694
+ #### Textile 템플릿
566
695
 
567
696
  <table>
568
697
  <tr>
569
- <td>의존</td>
570
- <td><a href="http://redcloth.org/">RedCloth</a></td>
698
+ <td>의존성</td>
699
+ <td><a href="http://redcloth.org/">RedCloth</a></td>
571
700
  </tr>
572
701
  <tr>
573
- <td>파일 확장자</td>
574
- <td><tt>.textile</tt></td>
702
+ <td>파일 확장자</td>
703
+ <td><tt>.textile</tt></td>
575
704
  </tr>
576
705
  <tr>
577
- <td>예제</td>
578
- <td><tt>textile :index, :layout_engine => :erb</tt></td>
706
+ <td>예제</td>
707
+ <td><tt>textile :index, :layout_engine => :erb</tt></td>
579
708
  </tr>
580
709
  </table>
581
710
 
582
- Textile에서 메서드를 호출하거나 locals 전달하는 것은 불가능함.
583
- 따라서 일반적으로 다른 렌더링 엔진과 함께 사용하게 될 것임:
711
+ Textile에서는 메서드 호출 뿐 아니라 locals 전달도 안됩니다.
712
+ 따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 됩니다.
584
713
 
585
- ```ruby
714
+ ``` ruby
586
715
  erb :overview, :locals => { :text => textile(:introduction) }
587
716
  ```
588
717
 
589
- 또한 다른 템플릿 속에서 `textile` 메서드를 호출할 수도 있음:
718
+ 다른 템플릿 속에서 `textile` 메서드를 호출할 수도 있습니다.
590
719
 
591
- ```ruby
720
+ ``` ruby
592
721
  %h1 안녕 Haml!
593
722
  %p= textile(:greetings)
594
723
  ```
595
724
 
596
- Textile에서 루비를 호출할 수 없기 때문에, Textile 작성된 레이아웃은 사용할 수 없음.
597
- 단, `:layout_engine` 옵션으로 템플릿의 레이아웃은 다른 렌더링 엔진을 사용하는 것은 가능.
725
+ Textile에서 루비를 호출할 수 없기 때문에, Textile으로 작성된 레이아웃은
726
+ 사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
727
+ 다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
598
728
 
599
- ### RDoc 템플릿
729
+ #### RDoc 템플릿
600
730
 
601
731
  <table>
602
732
  <tr>
603
- <td>의존</td>
604
- <td><a href="http://rdoc.rubyforge.org/">rdoc</a></td>
733
+ <td>의존성</td>
734
+ <td><a href="http://rdoc.rubyforge.org/">rdoc</a></td>
605
735
  </tr>
606
736
  <tr>
607
- <td>파일 확장자</td>
608
- <td><tt>.rdoc</tt></td>
737
+ <td>파일 확장자</td>
738
+ <td><tt>.rdoc</tt></td>
609
739
  </tr>
610
740
  <tr>
611
- <td>예제</td>
612
- <td><tt>rdoc :README, :layout_engine => :erb</tt></td>
741
+ <td>예제</td>
742
+ <td><tt>rdoc :README, :layout_engine => :erb</tt></td>
613
743
  </tr>
614
744
  </table>
615
745
 
616
- rdoc에서 메서드를 호출하거나 locals 전달하는 것은 불가능함.
617
- 따라서 일반적으로 다른 렌더링 엔진과 함께 사용하게 될 것임:
746
+ RDoc에서는 메서드 호출 뿐 아니라 locals 전달도 안됩니다.
747
+ 따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 됩니다.
618
748
 
619
- ```ruby
749
+ ``` ruby
620
750
  erb :overview, :locals => { :text => rdoc(:introduction) }
621
751
  ```
622
752
 
623
- 또한 다른 템플릿 속에서 `rdoc` 메서드를 호출할 수도 있음:
753
+ 다른 템플릿 속에서 `rdoc` 메서드를 호출할 수도 있습니다.
624
754
 
625
- ```ruby
755
+ ``` ruby
626
756
  %h1 Hello From Haml!
627
757
  %p= rdoc(:greetings)
628
758
  ```
629
759
 
630
- RDoc에서 루비를 호출할 수 없기 때문에, RDoc 작성된 레이아웃은 사용할 수 없음.
631
- 단, `:layout_engine` 옵션으로 템플릿의 레이아웃은 다른 렌더링 엔진을 사용하는 것은 가능.
632
- ### Radius 템플릿
760
+ RDoc에서 루비를 호출할 수 없기 때문에, RDoc으로 작성된 레이아웃은
761
+ 사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
762
+ 다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
763
+
764
+ #### Radius 템플릿
633
765
 
634
766
  <table>
635
767
  <tr>
636
- <td>의존</td>
637
- <td><a href="http://radius.rubyforge.org/">radius</a></td>
768
+ <td>의존성</td>
769
+ <td><a href="http://radius.rubyforge.org/">radius</a></td>
638
770
  </tr>
639
771
  <tr>
640
- <td>파일 확장자</td>
641
- <td><tt>.radius</tt></td>
772
+ <td>파일 확장자</td>
773
+ <td><tt>.radius</tt></td>
642
774
  </tr>
643
775
  <tr>
644
- <td>예제</td>
645
- <td><tt>radius :index, :locals => { :key => 'value' }</tt></td>
776
+ <td>예제</td>
777
+ <td><tt>radius :index, :locals => { :key => 'value' }</tt></td>
646
778
  </tr>
647
779
  </table>
648
780
 
649
- Radius 템플릿에서는 루비 메서드를 호출할 수 없기 때문에, 거의 대부분의 경우 locals로 전달하게 될 것임.
781
+ Radius 템플릿에서는 루비 메서드를 호출할 수 없기
782
+ 때문에, 거의 대부분의 경우 locals를 전달해야 합니다.
650
783
 
651
- ### Markaby 템플릿
784
+ #### Markaby 템플릿
652
785
 
653
786
  <table>
654
787
  <tr>
655
- <td>의존</td>
656
- <td><a href="http://markaby.github.com/">markaby</a></td>
788
+ <td>의존성</td>
789
+ <td><a href="http://markaby.github.com/">markaby</a></td>
657
790
  </tr>
658
791
  <tr>
659
- <td>파일확장</td>
660
- <td><tt>.mab</tt></td>
792
+ <td>파일확장</td>
793
+ <td><tt>.mab</tt></td>
661
794
  </tr>
662
795
  <tr>
663
- <td>예제</td>
664
- <td><tt>markaby { h1 "Welcome!" }</tt></td>
796
+ <td>예제</td>
797
+ <td><tt>markaby { h1 "Welcome!" }</tt></td>
665
798
  </tr>
666
799
  </table>
667
800
 
668
- 인라인 템플릿으로 블록을 받을 수도 있음(예제 참조).
801
+ 인라인 템플릿으로 블록을 받을 수도 있습니다(예제 참조).
669
802
 
670
- ### RABL 템플릿
803
+ #### RABL 템플릿
671
804
 
672
805
  <table>
673
806
  <tr>
674
- <td>의존</td>
675
- <td><a href="https://github.com/nesquena/rabl">rabl</a></td>
807
+ <td>의존성</td>
808
+ <td><a href="https://github.com/nesquena/rabl">rabl</a></td>
676
809
  </tr>
677
810
  <tr>
678
- <td>파일 확장자</td>
679
- <td><tt>.rabl</tt></td>
811
+ <td>파일 확장자</td>
812
+ <td><tt>.rabl</tt></td>
680
813
  </tr>
681
814
  <tr>
682
- <td>예제</td>
683
- <td><tt>rabl :index</tt></td>
815
+ <td>예제</td>
816
+ <td><tt>rabl :index</tt></td>
684
817
  </tr>
685
818
  </table>
686
819
 
687
- ### Slim 템플릿
820
+ #### Slim 템플릿
688
821
 
689
822
  <table>
690
823
  <tr>
691
- <td>의존</td>
692
- <td><a href="http://slim-lang.com/">slim</a></td>
824
+ <td>의존성</td>
825
+ <td><a href="http://slim-lang.com/">slim</a></td>
693
826
  </tr>
694
827
  <tr>
695
- <td>파일 확장자</td>
696
- <td><tt>.slim</tt></td>
828
+ <td>파일 확장자</td>
829
+ <td><tt>.slim</tt></td>
697
830
  </tr>
698
831
  <tr>
699
- <td>예제</td>
700
- <td><tt>slim :index</tt></td>
832
+ <td>예제</td>
833
+ <td><tt>slim :index</tt></td>
701
834
  </tr>
702
835
  </table>
703
836
 
704
- ### Creole 템플릿
837
+ #### Creole 템플릿
705
838
 
706
839
  <table>
707
840
  <tr>
708
- <td>의존</td>
709
- <td><a href="https://github.com/minad/creole">creole</a></td>
841
+ <td>의존성</td>
842
+ <td><a href="https://github.com/minad/creole">creole</a></td>
710
843
  </tr>
711
844
  <tr>
712
- <td>파일 확장자</td>
713
- <td><tt>.creole</tt></td>
845
+ <td>파일 확장자</td>
846
+ <td><tt>.creole</tt></td>
714
847
  </tr>
715
848
  <tr>
716
- <td>예제</td>
717
- <td><tt>creole :wiki, :layout_engine => :erb</tt></td>
849
+ <td>예제</td>
850
+ <td><tt>creole :wiki, :layout_engine => :erb</tt></td>
718
851
  </tr>
719
852
  </table>
720
853
 
721
- creole에서는 루비 메서드를 호출할 없고 locals 전달할 수 없음.
722
- 따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 될 것임.
854
+ Creole에서는 메서드 호출 아니라 locals 전달도 안됩니다.
855
+ 따라서 일반적으로는 다른 렌더링 엔진과 함께 사용하게 됩니다.
723
856
 
724
- ```ruby
857
+ ``` ruby
725
858
  erb :overview, :locals => { :text => creole(:introduction) }
726
859
  ```
727
860
 
728
- 또한 다른 템플릿 속에서 `creole` 메서드를 호출할 수도 있음:
861
+ 다른 템플릿 속에서 `creole` 메서드를 호출할 수도 있습니다.
729
862
 
730
- ```ruby
863
+ ``` ruby
731
864
  %h1 Hello From Haml!
732
865
  %p= creole(:greetings)
733
866
  ```
734
867
 
735
- Creole에서 루비를 호출할 수 없기 때문에, Creole 작성된 레이아웃은 사용할 수 없음.
736
- 단, `:layout_engine` 옵션으로 템플릿의 레이아웃은 다른 렌더링 엔진을 사용하는 것은 가능.
868
+ Creole에서 루비를 호출할 수 없기 때문에, Creole으로 작성된 레이아웃은
869
+ 사용할 수 없습니다. 하지만, `:layout_engine` 옵션으로 레이아웃의 템플릿을
870
+ 다른 렌더링 엔진으로 렌더링 할 수는 있습니다.
737
871
 
738
- ### CoffeeScript 템플릿
872
+ #### CoffeeScript 템플릿
739
873
 
740
874
  <table>
741
875
  <tr>
742
- <td>의존성</td>
743
- <td><a href="https://github.com/josh/ruby-coffee-script">coffee-script</a>
744
- <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme">자바스크립트 실행법</a>
745
- </td>
876
+ <td>의존성</td>
877
+ <td>
878
+ <a href="https://github.com/josh/ruby-coffee-script" title="Ruby CoffeeScript">
879
+ CoffeeScript
880
+ </a> 와
881
+ <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
882
+ 자바스크립트 실행법
883
+ </a>
884
+ </td>
746
885
  </tr>
747
886
  <tr>
748
- <td>파일 확장자</td>
749
- <td><tt>.coffee</tt></td>
887
+ <td>파일 확장자</td>
888
+ <td><tt>.coffee</tt></td>
750
889
  </tr>
751
890
  <tr>
752
- <td>예제</td>
753
- <td><tt>coffee :index</tt></td>
891
+ <td>예제</td>
892
+ <td><tt>coffee :index</tt></td>
754
893
  </tr>
755
894
  </table>
756
895
 
896
+ #### Stylus 템플릿
757
897
 
758
- ### Yajl 템플릿
898
+ <table>
899
+ <tr>
900
+ <td>의존성</td>
901
+ <td>
902
+ <a href="https://github.com/lucasmazza/ruby-stylus" title="Ruby Stylus">
903
+ Stylus
904
+ </a> 와
905
+ <a href="https://github.com/sstephenson/execjs/blob/master/README.md#readme" title="ExecJS">
906
+ 자바스크립트 실행법
907
+ </a>
908
+ </td>
909
+ </tr>
910
+ <tr>
911
+ <td>파일 확장자</td>
912
+ <td><tt>.styl</tt></td>
913
+ </tr>
914
+ <tr>
915
+ <td>예제</td>
916
+ <td><tt>stylus :index</tt></td>
917
+ </tr>
918
+ </table>
919
+
920
+ Stylus 템플릿을 사용가능하게 하려면, 먼저 `stylus`와 `stylus/tilt`를 로드
921
+ 해야합니다.
922
+
923
+ ``` ruby
924
+ require 'sinatra'
925
+ require 'stylus'
926
+ require 'stylus/tilt'
927
+
928
+ get '/' do
929
+ stylus :example
930
+ end
931
+ ```
932
+
933
+ #### Yajl 템플릿
759
934
 
760
935
  <table>
761
936
  <tr>
762
- <td>의존</td>
763
- <td><a href="https://github.com/brianmario/yajl-ruby">yajl-ruby</a></td>
937
+ <td>의존성</td>
938
+ <td><a href="https://github.com/brianmario/yajl-ruby">yajl-ruby</a></td>
764
939
  </tr>
765
940
  <tr>
766
- <td>파일 확장자</td>
767
- <td><tt>.yajl</tt></td>
941
+ <td>파일 확장자</td>
942
+ <td><tt>.yajl</tt></td>
768
943
  </tr>
769
944
  <tr>
770
- <td>예제</td>
771
- <td><tt>yajl :index, :locals => { :key => 'qux' }, :callback => 'present', :variable => 'resource' </tt></td>
945
+ <td>예제</td>
946
+ <td>
947
+ <tt>
948
+ yajl :index,
949
+ :locals => { :key => 'qux' },
950
+ :callback => 'present',
951
+ :variable => 'resource'
952
+ </tt>
953
+ </td>
772
954
  </tr>
773
955
  </table>
774
956
 
775
- The template source is evaluated as a Ruby string, and the resulting json variable is converted #to_json.
776
- 템플릿 소스는 루비 문자열로 평가(evaluate)되고, 결과인 json 변수는 #to_json으로 변환됨.
957
+ 템플릿 소스는 루비 문자열로 평가(evaluate)되고, 결과인 json 변수는 `#to_json`으로 변환됩니다.
777
958
 
778
- ```ruby
959
+ ``` ruby
779
960
  json = { :foo => 'bar' }
780
961
  json[:baz] = key
781
962
  ```
782
963
 
783
- `:callback`과 `:variable` 옵션은 렌더된 객체를 꾸미는데(decorate) 사용할 수 있음.
964
+ `:callback`과 `:variable` 옵션은 렌더된 객체를 꾸미는데(decorate) 사용할 수 있습니다.
784
965
 
785
- ```ruby
786
- var resource = {"foo":"bar","baz":"qux"}; present(resource);
966
+ ```javascript
967
+ var resource = {"foo":"bar","baz":"qux"};
968
+ present(resource);
787
969
  ```
788
970
 
789
- ### 내장된(Embedded) 템플릿
971
+ #### WLang 템플릿
790
972
 
791
- ```ruby
792
- get '/' do
793
- haml '%div.title Hello World'
794
- end
795
- ```
973
+ <table>
974
+ <tr>
975
+ <td>의존성</td>
976
+ <td><a href="https://github.com/blambeau/wlang/" title="WLang">WLang</a></td>
977
+ </tr>
978
+ <tr>
979
+ <td>파일 확장자</td>
980
+ <td><tt>.wlang</tt></td>
981
+ </tr>
982
+ <tr>
983
+ <td>예제</td>
984
+ <td><tt>wlang :index, :locals => { :key => 'value' }</tt></td>
985
+ </tr>
986
+ </table>
796
987
 
797
- 내장된 템플릿 문자열을 렌더함.
988
+ WLang 템플릿에서는 루비 메서드(`yield` 제외)를 호출할 수 없기
989
+ 때문에, 거의 대부분의 경우 locals를 전달해야 합니다. 그래도
990
+ WLang으로 쓰여진 레이아웃과 `yield`는 지원합니다.
798
991
 
799
992
  ### 템플릿에서 변수에 접근하기
800
993
 
801
- Templates are evaluated within the same context as route handlers. Instance
802
- variables set in route handlers are directly accessible by templates:
803
- 템플릿은 라우터 핸들러와 같은 맥락(context)에서 평가된다.
804
- 라우터 핸들러에서 설정한 인스턴스 변수들은 템플릿에서 접근 가능하다:
994
+ 템플릿은 라우터 핸들러와 같은 맥락(context)에서 평가됩니다. 라우터
995
+ 핸들러에서 설정한 인스턴스 변수들은 템플릿에서 직접 접근 가능합니다.
805
996
 
806
- ```ruby
997
+ ``` ruby
807
998
  get '/:id' do
808
999
  @foo = Foo.find(params[:id])
809
1000
  haml '%h1= @foo.name'
810
1001
  end
811
1002
  ```
812
1003
 
813
- 또는, 명시적으로 로컬 변수의 해시를 지정:
1004
+ 명시적으로 로컬 변수의 해시를 지정할 수도 있습니다.
814
1005
 
815
- ```ruby
1006
+ ``` ruby
816
1007
  get '/:id' do
817
1008
  foo = Foo.find(params[:id])
818
1009
  haml '%h1= bar.name', :locals => { :bar => foo }
819
1010
  end
820
1011
  ```
821
1012
 
822
- This is typically used when rendering templates as partials from within
823
- other templates.
824
- 이 방법은 통상적으로 템플릿을 다른 템플릿 속에서 파셜(partial)로 렌더링할 때 사용된다.
1013
+ 방법은 주로 템플릿을 다른 템플릿 속에서 파셜(partial)로 렌더링할
1014
+ 사용됩니다.
1015
+
1016
+ ### 템플릿에서의 `yield` 와 중첩 레이아웃
1017
+
1018
+ 레이아웃은 보통 `yield`만 호출하는 템플릿입니다.
1019
+ 위에 설명된 `:template` 옵션을 통해 템플릿을 사용하거나,
1020
+ 다음 예제처럼 블록으로 렌더링 할 수 있습니다.
1021
+
1022
+ ``` ruby
1023
+ erb :post, :layout => false do
1024
+ erb :index
1025
+ end
1026
+ ```
1027
+
1028
+ 위 코드는 `erb :index, :layout => :post`와 대부분 동일합니다.
1029
+
1030
+ 렌더링 메서드에 블록 넘기기는 중첩 레이아웃을 만들때 유용합니다.
1031
+
1032
+ ``` ruby
1033
+ erb :main_layout, :layout => false do
1034
+ erb :admin_layout do
1035
+ erb :user
1036
+ end
1037
+ end
1038
+ ```
1039
+
1040
+ 위의 코드도 줄일 수 있습니다.
1041
+
1042
+ ``` ruby
1043
+ erb :admin_layout, :layout => :main_layout do
1044
+ erb :user
1045
+ end
1046
+ ```
1047
+
1048
+ 현재, `erb`, `haml`, `liquid`, `slim `, `wlang`는 블럭을 지원합니다.
1049
+ 일반적인 `render` 메소드도 블럭을 지원합니다.
825
1050
 
826
1051
  ### 인라인 템플릿
827
1052
 
828
- 템플릿은 소스 파일의 마지막에서 정의할 수도 있다:
1053
+ 템플릿은 소스 파일의 마지막에서 정의할 수도 있습니다.
829
1054
 
830
- ```ruby
1055
+ ``` ruby
831
1056
  require 'sinatra'
832
1057
 
833
1058
  get '/' do
@@ -844,14 +1069,15 @@ __END__
844
1069
  %div.title Hello world.
845
1070
  ```
846
1071
 
847
- 참고: require sinatra 시킨 소스 파일에 정의된 인라인 템플릿은 자동으로 로드된다.
848
- 다른 소스 파일에서 인라인 템플릿을 사용하려면 명시적으로 `enable :inline_templates`을 호출하면 됨.
1072
+ 참고: sinatra require한 소스 파일에 정의된 인라인 템플릿은 자동으로
1073
+ 로드됩니다. 다른 소스 파일에서 인라인 템플릿을 사용하려면 명시적으로
1074
+ `enable :inline_templates`을 호출하면 됩니다.
849
1075
 
850
1076
  ### 이름을 가지는 템플릿(Named Templates)
851
1077
 
852
- 템플릿은 톱 레벨(top-level)에서 `template`메서드를 사용하여 정의할 수 있다:
1078
+ 템플릿은 톱 레벨(top-level)에서 `template`메서드로도 정의할 수 있습니다.
853
1079
 
854
- ```ruby
1080
+ ``` ruby
855
1081
  template :layout do
856
1082
  "%html\n =yield\n"
857
1083
  end
@@ -865,11 +1091,12 @@ get '/' do
865
1091
  end
866
1092
  ```
867
1093
 
868
- "layout"이라는 이름의 템플릿이 존재하면, 매번 템플릿이 렌더될 때마다 사용될 것이다.
869
- `:layout => false`를 전달하여 개별적으로 레이아웃을 비활성시키거나
870
- 또는 `set :haml, :layout => false`으로 기본값을 비활성으로 둘 수 있다:
1094
+ "layout"이라는 이름의 템플릿이 존재하면, 템플릿이 렌더될 때마다 사용됩니다.
1095
+ 레이아웃을 비활성화할 때는 `:layout => false`를 전달하여 개별적으로
1096
+ 비활성시키거나 `set :haml, :layout => false`으로 기본값을 비활성으로 둘 수
1097
+ 있습니다.
871
1098
 
872
- ```ruby
1099
+ ``` ruby
873
1100
  get '/' do
874
1101
  haml :index, :layout => !request.xhr?
875
1102
  end
@@ -877,18 +1104,19 @@ end
877
1104
 
878
1105
  ### 파일 확장자 연결하기
879
1106
 
880
- 어떤 파일 확장자를 특정 템플릿 엔진과 연결하려면, `Tilt.register`를 사용하면 된다.
881
- 예를 들어, `tt`라는 파일 확장자를 Textile 템플릿과 연결하고 싶다면, 다음과 같이 하면 된다:
1107
+ 어떤 파일 확장자를 특정 템플릿 엔진과 연결하려면, `Tilt.register`를 사용하면
1108
+ 됩니다. 예를 들어, `tt`라는 파일 확장자를 Textile 템플릿과 연결하고 싶다면,
1109
+ 다음과 같이 하면 됩니다.
882
1110
 
883
- ```ruby
1111
+ ``` ruby
884
1112
  Tilt.register :tt, Tilt[:textile]
885
1113
  ```
886
1114
 
887
1115
  ### 나만의 고유한 템플릿 엔진 추가하기
888
1116
 
889
- 우선, Tilt로 여러분 엔진을 등록하고, 그런 다음 렌더링 메서드를 생성하자:
1117
+ 우선, Tilt로 여러분 엔진을 등록하고, 렌더링 메서드를 생성합니다.
890
1118
 
891
- ```ruby
1119
+ ``` ruby
892
1120
  Tilt.register :myat, MyAwesomeTemplateEngine
893
1121
 
894
1122
  helpers do
@@ -900,15 +1128,16 @@ get '/' do
900
1128
  end
901
1129
  ```
902
1130
 
903
- `./views/index.myat` 를 렌더함.
904
- Tilt에 대한 더 자세한 내용은 https://github.com/rtomayko/tilt 참조.
1131
+ 위 코드는 `./views/index.myat` 를 렌더합니다.
1132
+ Tilt에 대한 더 자세한 내용은 https://github.com/rtomayko/tilt 참조하세요.
905
1133
 
906
1134
  ## 필터(Filters)
907
1135
 
908
- 사전 필터(before filter)는 라우터와 동일한 맥락에서 매 요청 전에 평가되며 요청과 응답을 변형할 수 있다.
909
- 필터에서 설정된 인스턴스 변수들은 라우터와 템플릿 속에서 접근 가능하다:
1136
+ 사전 필터(before filter)는 라우터와 동일한 맥락에서 매 요청 전에 평가되며
1137
+ 요청과 응답을 변형할 수 있습니다. 필터에서 설정된 인스턴스 변수들은 라우터와
1138
+ 템플릿에서 접근 가능합니다.
910
1139
 
911
- ```ruby
1140
+ ``` ruby
912
1141
  before do
913
1142
  @note = 'Hi!'
914
1143
  request.path_info = '/foo/bar/baz'
@@ -920,20 +1149,24 @@ get '/foo/*' do
920
1149
  end
921
1150
  ```
922
1151
 
923
- 사후 필터(after filter)는 라우터와 동일한 맥락에서 매 요청 이후에 평가되며 마찬가지로 요청과 응답을 변형할 수 있다.
924
- 사전 필터와 라우터에서 설정된 인스턴스 변수들은 사후 필터에서 접근 가능하다:
1152
+ 사후 필터(after filter)는 라우터와 동일한 맥락에서 매 요청 이후에 평가되며
1153
+ 마찬가지로 요청과 응답을 변형할 있습니다. 사전 필터와 라우터에서 설정된
1154
+ 인스턴스 변수들은 사후 필터에서 접근 가능합니다.
925
1155
 
926
- ```ruby
1156
+ ``` ruby
927
1157
  after do
928
1158
  puts response.status
929
1159
  end
930
1160
  ```
931
1161
 
932
- 참고: 만약 라우터에서 `body` 메서드를 사용하지 않고 그냥 문자열만 반환한 경우라면, body는 나중에 생성되는 탓에, 아직 사후 필터에서 사용할 수 없을 것이다.
1162
+ 참고: 만약 라우터에서 `body` 메서드를 사용하지 않고 그냥 문자열만 반환한
1163
+ 경우라면, body는 나중에 생성되는 탓에, 아직 사후 필터에서 사용할 수 없을
1164
+ 것입니다.
933
1165
 
934
- 필터는 선택적으로 패턴을 취할 있으며, 이 경우 요청 경로가 그 패턴과 매치할 경우에만 필터가 평가될 것이다.
1166
+ 필터는 패턴을 취할 수도 있으며, 이 경우 요청 경로가 그 패턴과 매치할
1167
+ 경우에만 필터가 평가될 것입니다.
935
1168
 
936
- ```ruby
1169
+ ``` ruby
937
1170
  before '/protected/*' do
938
1171
  authenticate!
939
1172
  end
@@ -943,9 +1176,9 @@ after '/create/:slug' do |slug|
943
1176
  end
944
1177
  ```
945
1178
 
946
- 라우터와 마찬가지로, 필터 역시 조건을 갖는다:
1179
+ 라우터와 마찬가지로, 필터 역시 조건을 취할 수 있습니다.
947
1180
 
948
- ```ruby
1181
+ ``` ruby
949
1182
  before :agent => /Songbird/ do
950
1183
  # ...
951
1184
  end
@@ -957,9 +1190,10 @@ end
957
1190
 
958
1191
  ## 헬퍼(Helpers)
959
1192
 
960
- 톱-레벨의 `helpers` 메서드를 사용하여 라우터 핸들러와 템플릿에서 사용할 헬퍼 메서드들을 정의할 수 있다:
1193
+ 톱-레벨의 `helpers` 메서드를 사용하여 라우터 핸들러와 템플릿에서 사용할 헬퍼
1194
+ 메서드들을 정의할 수 있습니다.
961
1195
 
962
- ```ruby
1196
+ ``` ruby
963
1197
  helpers do
964
1198
  def bar(name)
965
1199
  "#{name}bar"
@@ -971,9 +1205,9 @@ get '/:name' do
971
1205
  end
972
1206
  ```
973
1207
 
974
- 또는, 헬퍼 메서드는 별도의 모듈 속에 정의할 수도 있다:
1208
+ 또는, 헬퍼 메서드는 별도의 모듈 속에 정의할 수도 있습니다.
975
1209
 
976
- ```ruby
1210
+ ``` ruby
977
1211
  module FooUtils
978
1212
  def foo(name) "#{name}foo" end
979
1213
  end
@@ -985,14 +1219,14 @@ end
985
1219
  helpers FooUtils, BarUtils
986
1220
  ```
987
1221
 
988
- 경우 모듈을 애플리케이션 클래스에 포함(include)시킨 것과 동일한 효과를 갖는다.
1222
+ 것은 모듈을 애플리케이션 클래스에 포함(include)시킨 것과 같습니다.
989
1223
 
990
1224
  ### 세션(Sessions) 사용하기
991
1225
 
992
- 세션은 요청 동안에 상태를 유지하기 위해 사용한다.
993
- 세션이 활성화되면, 사용자 세션 당 session 해시 하나씩을 갖게 된다:
1226
+ 세션은 요청 동안에 상태를 유지하기 위해 사용합니다.
1227
+ 세션이 활성화되면, 사용자 세션 당 세션 해시 하나씩을 갖게 됩니다.
994
1228
 
995
- ```ruby
1229
+ ``` ruby
996
1230
  enable :sessions
997
1231
 
998
1232
  get '/' do
@@ -1004,13 +1238,14 @@ get '/:value' do
1004
1238
  end
1005
1239
  ```
1006
1240
 
1007
- `enable :sessions`은 실은 모든 데이터를 쿠키 속에 저장함에 유의하자.
1008
- 항상 이렇게 하고 싶지 않을 수도 있을 것이다(예를 들어, 많은 양의 데이터를 저장하게 되면 트래픽이 높아진다).
1009
- 때는 여러 가지 랙 세션 미들웨어(Rack session middleware)를 사용할 수 있을 것이다:
1010
- 이렇게 경우라면, `enable :sessions`을 호출하지 *말고*,
1011
- 대신 여러분이 선택한 미들웨어를 다른 모든 미들웨어들처럼 포함시키면 된다:
1241
+ `enable :sessions`은 실은 모든 데이터를 쿠키 속에 저장하는 것에 주의하세요.
1242
+ 방식이 바람직하지 않을 수도 있습니다. (예를 들어, 많은 양의 데이터를
1243
+ 저장하게 되면 트래픽이 늘어납니다).
1244
+ 이런 경우에는 세션 미들웨어(Rack session middleware)를 사용할 수 있습니다.
1245
+ `enable :sessions`을 호출하지 **않는** 대신에, 선택한 미들웨어를 다른
1246
+ 미들웨어들처럼 포함시키면 됩니다.
1012
1247
 
1013
- ```ruby
1248
+ ``` ruby
1014
1249
  use Rack::Session::Pool, :expire_after => 2592000
1015
1250
 
1016
1251
  get '/' do
@@ -1022,64 +1257,72 @@ get '/:value' do
1022
1257
  end
1023
1258
  ```
1024
1259
 
1025
- 보안을 위해서, 쿠키 속의 세션 데이터는 세션 시크릿(secret)으로 사인(sign)된다.
1026
- Sinatra는 여러분을 위해 무작위 시크릿을 생성한다.
1027
- 그렇지만, 이 시크릿은 여러분 애플리케이션 시작 시마다 변경될 있기 때문에,
1028
- 여러분은 여러분 애플리케이션의 모든 인스턴스들이 공유할 시크릿을 직접 만들고 싶을 수도 있다:
1260
+ 보안 강화을 위해서, 쿠키 속의 세션 데이터는 세션 시크릿(secret)으로
1261
+ 사인(sign)됩니다. Sinatra는 무작위 시크릿을 생성합니다. 하지만, 이
1262
+ 시크릿은 애플리케이션 시작 시마다 변경되기 때문에, 애플리케이션의
1263
+ 모든 인스턴스들이 공유할 시크릿을 직접 만들 수도 있습니다.
1029
1264
 
1030
- ```ruby
1265
+ ``` ruby
1031
1266
  set :session_secret, 'super secret'
1032
1267
  ```
1033
1268
 
1034
- 조금 더 세부적인 설정이 필요하다면, `sessions` 설정에서 옵션이 있는 해시를 저장할 수도 있을 것이다:
1269
+ 조금 더 세부적인 설정이 필요하다면, `sessions` 설정에서 옵션이 있는
1270
+ 해시를 저장할 수도 있습니다.
1035
1271
 
1036
- ```ruby
1272
+ ``` ruby
1037
1273
  set :sessions, :domain => 'foo.com'
1038
1274
  ```
1039
1275
 
1276
+ 세션을 다른 foo.com의 서브도메인 들과 공유하기 원한다면, 다음에 나오는
1277
+ 것 처럼 도메인 앞에 *.*을 붙이셔야 합니다.
1278
+
1279
+ ``` ruby
1280
+ set :sessions, :domain => '.foo.com'
1281
+ ```
1282
+
1040
1283
  ### 중단하기(Halting)
1041
1284
 
1042
- 필터나 라우터에서 요청을 즉각 중단하고 싶을 때 사용하라:
1285
+ 필터나 라우터에서 요청을 즉각 중단하고 싶을 때 사용하합니다.
1043
1286
 
1044
- ```ruby
1287
+ ``` ruby
1045
1288
  halt
1046
1289
  ```
1047
1290
 
1048
- 중단할 때 상태를 지정할 수도 있다:
1291
+ 중단할 때 상태를 지정할 수도 있습니다.
1049
1292
 
1050
- ```ruby
1293
+ ``` ruby
1051
1294
  halt 410
1052
1295
  ```
1053
1296
 
1054
- 또는 본문을 넣을 수도 있다:
1297
+ 본문을 넣을 수도 있습니다.
1055
1298
 
1056
- ```ruby
1299
+ ``` ruby
1057
1300
  halt 'this will be the body'
1058
1301
  ```
1059
1302
 
1060
- 또는 다도 가능하다:
1303
+ 할 수도 있습니다.
1061
1304
 
1062
- ```ruby
1305
+ ``` ruby
1063
1306
  halt 401, 'go away!'
1064
1307
  ```
1065
1308
 
1066
- 헤더를 추가할 경우에는 다음과 같이 하면 된다:
1309
+ 헤더를 추가할 경우에는 다음과 같이 하면 됩니다.
1067
1310
 
1068
- ```ruby
1311
+ ``` ruby
1069
1312
  halt 402, {'Content-Type' => 'text/plain'}, 'revenge'
1070
1313
  ```
1071
1314
 
1072
- 물론 `halt`를 템플릿과 결합하는 것도 가능하다:
1315
+ 당연히 `halt`와 템플릿은 같이 사용할 수 있습니다.
1073
1316
 
1074
- ```ruby
1317
+ ``` ruby
1075
1318
  halt erb(:error)
1076
1319
  ```
1077
1320
 
1078
1321
  ### 넘기기(Passing)
1079
1322
 
1080
- 라우터는 `pass`를 사용하여 다음 번 매칭되는 라우터로 처리를 넘길 수 있다:
1323
+ 라우터는 `pass`를 사용하여 다음 번 매칭되는 라우터로 처리를 넘길 수 있습니다.
1081
1324
 
1082
- ```ruby
1325
+ ``` ruby
1083
1326
  get '/guess/:who' do
1084
1327
  pass unless params[:who] == 'Frank'
1085
1328
  'You got me!'
@@ -1090,15 +1333,15 @@ get '/guess/*' do
1090
1333
  end
1091
1334
  ```
1092
1335
 
1093
- 라우터 블록에서 즉각 빠져나오게 되고 제어는 다음 번 매칭되는 라우터로 넘어간다.
1094
- 만약 매칭되는 라우터를 찾지 못하면, 404가 반환된다.
1336
+ 라우터 블록에서 즉각 빠져나오게 되고 제어는 다음 번 매칭되는 라우터로
1337
+ 넘어갑니다. 만약 매칭되는 라우터를 찾지 못하면, 404가 반환됩니다.
1095
1338
 
1096
1339
  ### 다른 라우터 부르기(Triggering Another Route)
1097
1340
 
1098
- 경우에 따라서는 `pass`가 아니라, 다른 라우터를 호출한 결과를 얻고 싶은 경우도 있을 것이다.
1099
- 때는 간단하게 +`call`+을 사용하면 된다:
1341
+ 때로는 `pass`가 아니라, 다른 라우터를 호출한 결과를 얻고 싶을 때도
1342
+ 있습니다. 이럴때는 간단하게 `call`을 사용하면 됩니다.
1100
1343
 
1101
- ```ruby
1344
+ ``` ruby
1102
1345
  get '/foo' do
1103
1346
  status, headers, body = call env.merge("PATH_INFO" => '/bar')
1104
1347
  [status, headers, body.map(&:upcase)]
@@ -1109,21 +1352,22 @@ get '/bar' do
1109
1352
  end
1110
1353
  ```
1111
1354
 
1112
- 위 예제의 경우, `"bar"`를 헬퍼로 옮겨 `/foo`와 `/bar` 모두에서 사용하도록 함으로써
1113
- 테스팅을 쉽게 하고 성능을 높일 수 있을 것이다.
1355
+ 위 예제의 경우, `"bar"`를 헬퍼로 옮겨 `/foo`와 `/bar` 모두에서 사용하도록
1356
+ 하면 테스팅을 쉽게 하고 성능을 높일 수 있습니다.
1114
1357
 
1115
- 만약 그 요청이 사본이 아닌 바로 그 동일 인스턴스로 보내지도록 하고 싶다면,
1116
- `call` 대신 `call!`을 사용하면 된다.
1358
+ 요청의 사본이 아닌 바로 그 인스턴스로 보내지도록 하고 싶다면,
1359
+ `call` 대신 `call!`을 사용하면 됩니다.
1117
1360
 
1118
- `call`에 대한 더 자세한 내용은 Rack 명세를 참고하면 된다.
1361
+ `call`에 대한 더 자세한 내용은 Rack 명세를 참고하세요.
1119
1362
 
1120
1363
  ### 본문, 상태 코드 및 헤더 설정하기
1121
1364
 
1122
- 라우터 블록의 반환값과 함께 상태 코드(status code)와 응답 본문(response body)을 설정하는 것은 가능하기도 하거니와 권장되는 방법이다. 그렇지만, 경우에 따라서는 본문을 실행 흐름 중의 임의 지점에서 설정하고 싶을 수도 있다.
1123
- 때는 `body` 헬퍼 메서드를 사용하면 된다.
1124
- 이렇게 하면, 순간부터 본문에 접근할 메서드를 사용할 수가 있다:
1365
+ 라우터 블록의 반환값과 함께 상태 코드(status code)와 응답 본문(response body)을
1366
+ 설정할수 있고 권장됩니다. 하지만, 경우에 따라서는 본문을 실행 흐름 중의 임의
1367
+ 지점에서 설정해야 할때도 있습니다. 이런 경우 `body` 헬퍼 메서드를 사용하면
1368
+ 됩니다. 이렇게 하면, 그 순간부터 본문에 접근할 때 그 메서드를 사용할 수가 있습니다.
1125
1369
 
1126
- ```ruby
1370
+ ``` ruby
1127
1371
  get '/foo' do
1128
1372
  body "bar"
1129
1373
  end
@@ -1133,12 +1377,13 @@ after do
1133
1377
  end
1134
1378
  ```
1135
1379
 
1136
- `body`로 블록을 전달하는 것도 가능하며, 이 블록은 랙(Rack) 핸들러에 의해 실행될 것이다.
1137
- (이 방법은 스트리밍을 구현할 때 사용할 수 있는데, "값 반환하기"를 참고).
1380
+ `body`로 블록을 전달하는 것도 가능하며, 이 블록은 랙(Rack) 핸들러에 의해
1381
+ 실행됩니다. (이 방법은 스트리밍을 구현할 때 사용할 수 있습니다. "값
1382
+ 반환하기"를 참고하세요).
1138
1383
 
1139
- 본문와 마찬가지로, 상태코드와 헤더도 설정할 수 있다:
1384
+ 본문와 마찬가지로, 상태코드와 헤더도 설정할 수 있습니다.
1140
1385
 
1141
- ```ruby
1386
+ ``` ruby
1142
1387
  get '/foo' do
1143
1388
  status 418
1144
1389
  headers \
@@ -1148,104 +1393,123 @@ get '/foo' do
1148
1393
  end
1149
1394
  ```
1150
1395
 
1151
- `body`처럼, `header`와 `status`도 매개변수 없이 사용하여 그것의 현재 값을 액세스하는 데 사용될 수 있다.
1396
+ `body`처럼, `header`와 `status`도 매개변수 없이 사용하여 현재 값을
1397
+ 액세스할 수 있습니다.
1152
1398
 
1153
1399
  ### 응답 스트리밍(Streaming Responses)
1154
1400
 
1155
- 응답 본문의 일정 부분을 계속 생성하는 가운데 데이터를 내보내기 시작하고 싶을 경우도 있을 것이다.
1156
- 극단적인 예제로, 클라이언트가 접속을 끊기 전까지 계속 데이터를 내보내고 싶을 수도 있다.
1157
- 여러분만의 래퍼(wrapper)를 만들기 싫다면 `stream` 헬퍼를 사용하면 된다:
1401
+ 응답 본문의 일정 부분을 계속 생성하는 가운데 데이터를 내보내기 시작하고
1402
+ 싶을 경우가 있습니다. 극단적인 예제로, 클라이언트가 접속을 끊기 전까지
1403
+ 계속 데이터를 내보내고 싶을 경우도 있죠. 여러분만의 래퍼(wrapper)를
1404
+ 만들지 않으려면 `stream` 헬퍼를 사용하면 됩니다.
1158
1405
 
1159
- ```ruby
1406
+ ``` ruby
1160
1407
  get '/' do
1161
1408
  stream do |out|
1162
- out << "It's gonna be legen -\n"
1163
- sleep 0.5
1164
- out << " (wait for it) \n"
1165
- sleep 1
1166
- out << "- dary!\n"
1409
+ out << "It's gonna be legen -\n"
1410
+ sleep 0.5
1411
+ out << " (wait for it) \n"
1412
+ sleep 1
1413
+ out << "- dary!\n"
1167
1414
  end
1168
1415
  end
1169
1416
  ```
1170
1417
 
1171
- 이렇게 하면 스트리밍 API나
1172
- [서버 발송 이벤트Server Sent Events](http://dev.w3.org/html5/eventsource/)를 구현할 수 있게 주며,
1173
- [WebSockets](http://en.wikipedia.org/wiki/WebSocket)을 위한 기반으로 사용될 수 있다.
1174
- 또한 이 방법은 일부 콘텐츠가 느린 자원에 의존하는 경우에
1175
- 스로풋(throughtput)을 높이기 위해 사용될 수도 있다.
1418
+ 이렇게 스트리밍 API나 [서버 발송 이벤트Server Sent
1419
+ Events](http://dev.w3.org/html5/eventsource/)를 구현할 수 있고, 방법은
1420
+ [WebSockets](http://en.wikipedia.org/wiki/WebSocket)을 위한 기반으로 사용됩니다.
1421
+ 이 방법은 일부 콘텐츠가 느린 자원에 의존하는 경우에 스로풋(throughtput)을
1422
+ 높이기 위해 사용되기도 합니다.
1423
+
1424
+ 스트리밍 동작, 특히 동시 요청의 수는 애플리케이션을 서빙하는 웹서버에 크게
1425
+ 의존합니다. WEBRick서버 같은 일부의 경우 아예 스트리밍을 지원하지 조차 않습니다.
1426
+ 만약 서버가 스트리밍을 지원하지 않는다면, 본문은 `stream` 으로 전달된 블록이
1427
+ 수행을 마친 후에 한꺼번에 반환됩니다. 이런 한번에 쏘는 샷건같은 방식으로는
1428
+ 스트리밍은 움직이지 않습니다.
1176
1429
 
1177
- 스트리밍 동작, 특히 동시 요청의 수는 애플리케이션을 서빙하는 웹서버에 크게 의존적이다.
1178
- 어떤 서버, 예컨대 WEBRick 같은 경우는 아예 스트리밍을 지원조차 하지 못할 것이다.
1179
- 만약 서버가 스트리밍을 지원하지 않는다면, 본문은 `stream` 으로 전달된 블록이 수행을 마친 후에 한꺼번에 반환될 것이다.
1180
- 스트리밍은 Shotgun에서는 작동하지 않는다.
1430
+ 선택적 매개변수 `keep_open`이 설정되어 있다면, 스트림 객체에서 `close`를
1431
+ 호출하지 않을 것이고, 나중에 실행 흐름 상의 어느 시점에서 스트림을 닫을
1432
+ 있습니다. 옵션은 Thin과 Rainbow 같은 이벤트 기반 서버에서만 작동하고
1433
+ 다른 서버들은 여전히 스트림을 닫습니다.
1181
1434
 
1182
- 만약 선택적 매개변수 `keep_open`이 설정되어 있다면, 스트림 객체에서 `close`를 호출하지 않을 것이고,
1183
- 따라서 여러분은 나중에 실행 흐름 상의 어느 시점에서 스트림을 닫을 수 있다.
1184
- 이 옵션은 Thin과 Rainbow 같은 이벤트 기반 서버에서만 작동한다.
1185
- 다른 서버들은 여전히 스트림을 닫을 것이다:
1435
+ ``` ruby
1436
+ # long polling
1186
1437
 
1187
- ```ruby
1188
1438
  set :server, :thin
1189
1439
  connections = []
1190
1440
 
1191
- get '/' do
1192
- # 스트림을 열린 유지
1441
+ get '/subscribe' do
1442
+ # register a client's interest in server events
1193
1443
  stream(:keep_open) { |out| connections << out }
1444
+
1445
+ # purge dead connections
1446
+ connections.reject!(&:closed?)
1447
+
1448
+ # acknowledge
1449
+ "subscribed"
1194
1450
  end
1195
1451
 
1196
- post '/' do
1197
- # 모든 열린 스트림에 쓰기
1198
- connections.each { |out| out << params[:message] << "\n" }
1199
- "message sent"
1452
+ post '/message' do
1453
+ connections.each do |out|
1454
+ # notify client that a new message has arrived
1455
+ out << params[:message] << "\n"
1456
+
1457
+ # indicate client to connect again
1458
+ out.close
1459
+ end
1460
+
1461
+ # acknowledge
1462
+ "message received"
1200
1463
  end
1201
1464
  ```
1202
1465
 
1203
1466
  ### 로깅(Logging)
1204
1467
 
1205
- In the request scope, the `logger` helper exposes a `Logger` instance:
1206
- 요청 스코프(request scope) 내에서, `Logger`의 인스턴스인 `logger` 헬퍼를 사용할 수 있다:
1468
+ 요청 스코프(request scope) 내에서, `Logger`의 인스턴스인 `logger`
1469
+ 헬퍼를 사용할 수 있습니다.
1207
1470
 
1208
- ```ruby
1471
+ ``` ruby
1209
1472
  get '/' do
1210
1473
  logger.info "loading data"
1211
1474
  # ...
1212
1475
  end
1213
1476
  ```
1214
1477
 
1215
- 이 로거는 여러분이 Rack 핸들러에서 설정한 로그 셋팅을 자동으로 참고한다.
1216
- 만약 로깅이 비활성이라면, 이 메서드는 더미(dummy) 객체를 반환할 것이며,
1217
- 따라서 여러분은 라우터나 필터에서 이 부분에 대해 걱정할 필요는 없다.
1478
+ 이 로거는 자동으로 Rack 핸들러에서 설정한 로그설정을 참고합니다.
1479
+ 만약 로깅이 비활성상태라면, 이 메서드는 더미(dummy) 객체를 반환하기 때문에,
1480
+ 라우터나 필터에서 이 부분에 대해 걱정할 필요는 없습니다.
1218
1481
 
1219
- 로깅은 `Sinatra::Application`에서만 기본으로 활성화되어 있음에 유의하자.
1220
- 만약 `Sinatra::Base`로부터 상속받은 경우라면 직접 활성화시켜 줘야 한다:
1482
+ 로깅은 `Sinatra::Application`에서만 기본으로 활성화되어 있음에 유의합시다.
1483
+ 만약 `Sinatra::Base`로부터 상속받은 경우라면 직접 활성화시켜 줘야 합니다.
1221
1484
 
1222
- ```ruby
1485
+ ``` ruby
1223
1486
  class MyApp < Sinatra::Base
1224
1487
  configure :production, :development do
1225
- enable :logging
1488
+ enable :logging
1226
1489
  end
1227
1490
  end
1228
1491
  ```
1229
1492
 
1230
- 어떠한 로깅 미들웨어도 설정되지 않게 하려면, `logging` 설정을 `nil`로 두면 된다.
1231
- 그렇지만, 이럴 경우 `logger`는 `nil`을 반환할 것임에 유의하자.
1232
- 통상적인 유스케이스는 여러분만의 로거를 사용하고자 할 경우일 것이다.
1233
- Sinatra는 `env['rack.logger']`에서 찾은 것을 사용할 것이다.
1493
+ 로깅 미들웨어를 사용하지 않으려면, `logging` 설정을 `nil`로 두면 됩니다.
1494
+ 하지만, 경우 주의할 것은 `logger`는 `nil`을 반환하는 것입니다.
1495
+ 통상적인 유스케이스는 여러분만의 로거를 사용하고자 할 경우일 것입니다.
1496
+ Sinatra는 `env['rack.logger']`에서 찾은 로거를 사용할 것입니다.
1234
1497
 
1235
1498
  ### 마임 타입(Mime Types)
1236
1499
 
1237
- `send_file`이나 정적인 파일을 사용할 때에 Sinatra가 인식하지 못하는 마임 타입이 있을 수 있다.
1238
- 이 경우 `mime_type`을 사용하여 파일 확장자를 등록하면 된다:
1500
+ `send_file`이나 정적인 파일을 사용할 때에 Sinatra가 인식하지 못하는
1501
+ 마임 타입이 있을 수 있습니다. 이 경우 `mime_type`을 사용하여 파일
1502
+ 확장자를 등록합니다.
1239
1503
 
1240
- ```ruby
1504
+ ``` ruby
1241
1505
  configure do
1242
1506
  mime_type :foo, 'text/foo'
1243
1507
  end
1244
1508
  ```
1245
1509
 
1246
- 또는 `content_type` 헬퍼와 함께 사용할 수도 있다:
1510
+ `content_type` 헬퍼로 수도 있습니다.
1247
1511
 
1248
- ```ruby
1512
+ ``` ruby
1249
1513
  get '/' do
1250
1514
  content_type :foo
1251
1515
  "foo foo foo"
@@ -1254,37 +1518,38 @@ end
1254
1518
 
1255
1519
  ### URL 생성하기
1256
1520
 
1257
- URL을 생성하려면 `url` 헬퍼 메서드를 사용해야 한다. 예를 들어 Haml에서:
1521
+ URL을 생성할때 `url` 헬퍼 메서드를 사용합니다. 예를 들어 Haml에서는 이렇게
1522
+ 합니다.
1258
1523
 
1259
- ```ruby
1524
+ ``` ruby
1260
1525
  %a{:href => url('/foo')} foo
1261
1526
  ```
1262
1527
 
1263
- 이것은 리버스 프록시(reverse proxies)와 Rack 라우터를, 만약 존재한다면, 참고한다.
1528
+ 이것은 리버스 프록시(reverse proxies)와 Rack 라우터가 있다면 참고합니다.
1264
1529
 
1265
- This method is also aliased to `to` (see below for an example).
1266
- 이 메서드는 `to`라는 별칭으로도 사용할 수 있다 (아래 예제 참조).
1530
+ 메서드는 `to`라는 별칭으로도 사용할 있습니다. (아래 예제 참조)
1267
1531
 
1268
1532
  ### 브라우저 재지정(Browser Redirect)
1269
1533
 
1270
- `redirect` 헬퍼 메서드를 사용하여 브라우저 리다이렉트를 촉발시킬있다:
1534
+ `redirect` 헬퍼 메서드를 사용하여 브라우저를 리다이렉트 시킬있습니다.
1271
1535
 
1272
- ```ruby
1536
+ ``` ruby
1273
1537
  get '/foo' do
1274
1538
  redirect to('/bar')
1275
1539
  end
1276
1540
  ```
1277
1541
 
1278
- 여타 부가적인 매개변수들은 `halt`에서 전달한 인자들처럼 다루어 진다:
1542
+ 다른 부가적인 매개변수들은 `halt`에 전달하는 인자들과 비슷합니다.
1279
1543
 
1280
- ```ruby
1544
+ ``` ruby
1281
1545
  redirect to('/bar'), 303
1282
1546
  redirect 'http://google.com', 'wrong place, buddy'
1283
1547
  ```
1284
1548
 
1285
- `redirect back`을 사용하면 사용자가 왔던 페이지로 다시 돌아가는 리다이렉트도 쉽게 할 수 있다:
1549
+ `redirect back`을 사용하면 쉽게 사용자가 왔던 페이지로 다시 돌아가게
1550
+ 할 수 있습니다.
1286
1551
 
1287
- ```ruby
1552
+ ``` ruby
1288
1553
  get '/foo' do
1289
1554
  "<a href='/bar'>do something</a>"
1290
1555
  end
@@ -1295,15 +1560,15 @@ get '/bar' do
1295
1560
  end
1296
1561
  ```
1297
1562
 
1298
- 리다이렉트와 함께 인자를 전달하려면, 쿼리에 붙이거나:
1563
+ 리다이렉트와 함께 인자를 전달하려면, 쿼리로 붙이거나,
1299
1564
 
1300
- ```ruby
1565
+ ``` ruby
1301
1566
  redirect to('/bar?sum=42')
1302
1567
  ```
1303
1568
 
1304
- 또는 세션을 사용하면 된다:
1569
+ 세션을 사용하면 됩니다.
1305
1570
 
1306
- ```ruby
1571
+ ``` ruby
1307
1572
  enable :sessions
1308
1573
 
1309
1574
  get '/foo' do
@@ -1318,39 +1583,40 @@ end
1318
1583
 
1319
1584
  ### 캐시 컨트롤(Cache Control)
1320
1585
 
1321
- 헤더를 정확하게 설정하는 것은 적절한 HTTP 캐싱의 기본이다.
1586
+ 헤더를 정확하게 설정하는 것은 적절한 HTTP 캐싱의 기본입니다.
1322
1587
 
1323
- Cache-Control 헤더를 다음과 같이 간단하게 설정할 수 있다:
1588
+ Cache-Control 헤더를 다음과 같이 간단하게 설정할 수 있습니다.
1324
1589
 
1325
- ```ruby
1590
+ ``` ruby
1326
1591
  get '/' do
1327
1592
  cache_control :public
1328
1593
  "cache it!"
1329
1594
  end
1330
1595
  ```
1331
1596
 
1332
- 프로 팁: 캐싱은 사전 필터에서 설정하라:
1597
+ 프로 팁: 캐싱은 사전 필터에서 설정하세요.
1333
1598
 
1334
- ```ruby
1599
+ ``` ruby
1335
1600
  before do
1336
1601
  cache_control :public, :must_revalidate, :max_age => 60
1337
1602
  end
1338
1603
  ```
1339
1604
 
1340
1605
  `expires` 헬퍼를 사용하여 그에 상응하는 헤더를 설정한다면,
1341
- `Cache-Control`이 자동으로 설정될 것이다:
1606
+ `Cache-Control`이 자동으로 설정됩니다.
1342
1607
 
1343
- ```ruby
1608
+ ``` ruby
1344
1609
  before do
1345
1610
  expires 500, :public, :must_revalidate
1346
1611
  end
1347
1612
  ```
1348
1613
 
1349
1614
  캐시를 잘 사용하려면, `etag` 또는 `last_modified`의 사용을 고려해야 할 것이다.
1350
- 무거운 작업을 하기 *전*에 이들 헬퍼를 호출할 것을 권장하는데,
1351
- 이러면 만약 클라이언트 캐시에 현재 버전이 이미 들어 있을 경우엔 즉각 응답을 반환(flush)하게 될 것이다:
1615
+ 무거운 작업을 하기 *전*에 이들 헬퍼를 호출하길 권장합니다. 이렇게 하면,
1616
+ 클라이언트 캐시에 현재 버전이 이미 들어 있을 경우엔 즉각 응답을
1617
+ 뿌릴(flush) 것입니다.
1352
1618
 
1353
- ```ruby
1619
+ ``` ruby
1354
1620
  get '/article/:id' do
1355
1621
  @article = Article.find params[:id]
1356
1622
  last_modified @article.updated_at
@@ -1359,17 +1625,18 @@ get '/article/:id' do
1359
1625
  end
1360
1626
  ```
1361
1627
 
1362
- [약한 ETag](http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation)를 사용하는 것도 가능하다:
1628
+ [약한 ETag](http://en.wikipedia.org/wiki/HTTP_ETag#Strong_and_weak_validation)를
1629
+ 사용할 수 도 있습니다.
1363
1630
 
1364
- ```ruby
1631
+ ``` ruby
1365
1632
  etag @article.sha1, :weak
1366
1633
  ```
1367
1634
 
1368
- 이들 헬퍼는 어떠한 캐싱도 하지 않으며, 대신 필요한 정보를 캐시에 제공한다.
1369
- 여러분이 만약 손쉬운 리버스 프록시(reverse-proxy) 캐싱 솔루션을 찾고 있다면,
1370
- [rack-cache](https://github.com/rtomayko/rack-cache)를 써보라:
1635
+ 이들 헬퍼는 어떠한 캐싱도 하지 않으며, 대신 캐시에 필요한 정보를 제공합니다.
1636
+ 손쉬운 리버스 프록시(reverse-proxy) 캐싱 솔루션을 찾고 있다면,
1637
+ [rack-cache](https://github.com/rtomayko/rack-cache)를 써보세요.
1371
1638
 
1372
- ```ruby
1639
+ ``` ruby
1373
1640
  require "rack/cache"
1374
1641
  require "sinatra"
1375
1642
 
@@ -1382,14 +1649,16 @@ get '/' do
1382
1649
  end
1383
1650
  ```
1384
1651
 
1385
- 정적 파일에 `Cache-Control` 헤더 정보를 추가하려면 `:static_cache_control` 설정(아래 참조)을 사용하라:
1652
+ 정적 파일에 `Cache-Control` 헤더 정보를 추가하려면 `:static_cache_control`
1653
+ 설정(아래 참조)을 쓰세요.
1386
1654
 
1387
- RFC 2616에 따르면 If-Match 또는 If-None-Match 헤더가 `*`로 설정된 경우 요청한 리소스(resource)가 이미 존재하느냐 여부에 따라 다르게 취급해야 한다고 되어 있다.
1388
- Sinatra는 (get 처럼) 안전하거나 (put 처럼) 멱등인 요청에 대한 리소스는 이미 존재한다고 가정하며,
1389
- 반면 다른 리소스(예를 들면 post 요청 같은) 경우는 리소스로 취급한다.
1390
- 이런 설정은 `:new_resource` 옵션으로 전달하여 변경할 있다:
1655
+ RFC 2616에 따르면 If-Match 또는 If-None-Match 헤더가 `*`로 설정된 경우 요청한
1656
+ 리소스(resource) 이미 존재하느냐 여부에 따라 다르게 취급해야 한다고 되어
1657
+ 있습니다. Sinatra는 (get 처럼) 안전하거나 (put 처럼) 멱등인 요청에 대한 리소스는
1658
+ 이미 존재한다고 가정하지만, 다른 리소스(예를 들면 post 요청 같은)의 경우는
1659
+ 새 리소스로 취급합니다. 이 행동은 `:new_resource` 옵션을 전달하여 변경할 수 있습니다.
1391
1660
 
1392
- ```ruby
1661
+ ``` ruby
1393
1662
  get '/create' do
1394
1663
  etag '', :new_resource => true
1395
1664
  Article.create
@@ -1397,25 +1666,25 @@ get '/create' do
1397
1666
  end
1398
1667
  ```
1399
1668
 
1400
- 여전히 약한 ETag를 사용하고자 한다면, `:kind`으로 전달하자:
1669
+ 약한 ETag를 사용하고자 한다면, `:kind`으로 전달합시다.
1401
1670
 
1402
- ```ruby
1671
+ ``` ruby
1403
1672
  etag '', :new_resource => true, :kind => :weak
1404
1673
  ```
1405
1674
 
1406
1675
  ### 파일 전송하기(Sending Files)
1407
1676
 
1408
- 파일을 전송하려면, `send_file` 헬퍼 메서드를 사용하면 된다:
1677
+ 파일을 전송하려면, `send_file` 헬퍼 메서드를 사용하면 됩니다.
1409
1678
 
1410
- ```ruby
1679
+ ``` ruby
1411
1680
  get '/' do
1412
1681
  send_file 'foo.png'
1413
1682
  end
1414
1683
  ```
1415
1684
 
1416
- 이 메서드는 몇 가지 옵션을 받는다:
1685
+ 이 메서드는 몇 가지 옵션을 받습니다.
1417
1686
 
1418
- ```ruby
1687
+ ``` ruby
1419
1688
  send_file 'foo.png', :type => :jpg
1420
1689
  ```
1421
1690
 
@@ -1423,33 +1692,40 @@ send_file 'foo.png', :type => :jpg
1423
1692
 
1424
1693
  <dl>
1425
1694
  <dt>filename</dt>
1426
- <dd>응답에서의 파일명. 기본값은 실제 파일명이다.</dd>
1695
+ <dd>응답에서의 파일명. 기본값은 실제 파일명.</dd>
1427
1696
 
1428
1697
  <dt>last_modified</dt>
1429
- <dd>Last-Modified 헤더값. 기본값은 파일의 mtime.</dd>
1698
+ <dd>Last-Modified 헤더값. 기본값은 파일의 mtime.</dd>
1430
1699
 
1431
1700
  <dt>type</dt>
1432
- <dd>사용할 컨텐츠 유형. 없으면 파일 확장자로부터 유추된다.</dd>
1701
+ <dd>사용할 컨텐츠 유형. 없으면 파일 확장자로부터 유추.</dd>
1433
1702
 
1434
1703
  <dt>disposition</dt>
1435
- <dd>Content-Disposition에서 사용됨. 가능한 값들: <tt>nil</tt> (기본값),
1436
- <tt>:attachment</tt> <tt>:inline</tt></dd>
1704
+ <dd>
1705
+ Content-Disposition에서 사용됨. 가능한 값들: <tt>nil</tt> (기본값),
1706
+ <tt>:attachment</tt> 및 <tt>:inline</tt>
1707
+ </dd>
1437
1708
 
1438
1709
  <dt>length</dt>
1439
- <dd>Content-Length, 기본값은 파일 크기.</dd>
1710
+ <dd>Content-Length, 기본값은 파일 크기.</dd>
1440
1711
 
1441
1712
  <dt>status</dt>
1442
- <dd>전송할 상태 코드. 오류 페이지로 정적 파일을 전송할 경우에 유용.</dd>
1713
+ <dd>
1714
+ 전송할 상태 코드. 오류 페이지로 정적 파일을 전송할 경우에 유용.
1715
+
1716
+ Rack 핸들러가 지원할 경우, Ruby 프로세스로부터의 스트리밍이 아닌
1717
+ 다른 수단이 사용가능함. 이 헬퍼 메서드를 사용하게 되면, Sinatra는
1718
+ 자동으로 범위 요청(range request)을 처리함.
1719
+ </dd>
1443
1720
  </dl>
1444
1721
 
1445
- Rack 핸들러가 지원할 경우, Ruby 프로세스로부터의 스트리밍이 아닌 다른 수단을 사용할 수 있다.
1446
- 만약 이 헬퍼 메서드를 사용하게 되면, Sinatra는 자동으로 범위 요청(range request)을 처리할 것이다.
1447
1722
 
1448
1723
  ### 요청 객체에 접근하기(Accessing the Request Object)
1449
1724
 
1450
- 인입되는 요청 객에는 요청 레벨(필터, 라우터, 오류 핸들러)에서 `request` 메서드를 통해 접근 가능하다:
1725
+ 들어오는 요청 객에는 요청 레벨(필터, 라우터, 오류 핸들러)에서 `request`
1726
+ 메서드를 통해 접근 가능합니다.
1451
1727
 
1452
- ```ruby
1728
+ ``` ruby
1453
1729
  # http://example.com/example 상에서 실행 중인 앱
1454
1730
  get '/foo' do
1455
1731
  t = %w[text/css text/html application/javascript]
@@ -1482,9 +1758,9 @@ get '/foo' do
1482
1758
  end
1483
1759
  ```
1484
1760
 
1485
- 일부 옵션들, `script_name` 또는 `path_info`와 같은 일부 옵션은 쓸 수도 있다:
1761
+ `script_name`, `path_info`같은 일부 옵션들은 이렇게 쓸 수도 있습니다.
1486
1762
 
1487
- ```ruby
1763
+ ``` ruby
1488
1764
  before { request.path_info = "/" }
1489
1765
 
1490
1766
  get "/" do
@@ -1492,9 +1768,9 @@ get "/" do
1492
1768
  end
1493
1769
  ```
1494
1770
 
1495
- `request.body`는 IO 또는 StringIO 객체이다:
1771
+ `request.body`는 IO 객체이거나 StringIO 객체입니다.
1496
1772
 
1497
- ```ruby
1773
+ ``` ruby
1498
1774
  post "/api" do
1499
1775
  request.body.rewind # 누군가 이미 읽은 경우
1500
1776
  data = JSON.parse request.body.read
@@ -1504,19 +1780,19 @@ end
1504
1780
 
1505
1781
  ### 첨부(Attachments)
1506
1782
 
1507
- `attachment` 헬퍼를 사용하여 브라우저에게 응답이 브라우저에 표시되는 게 아니라
1508
- 디스크에 저장되어야 함을 알릴 수 있다:
1783
+ `attachment` 헬퍼를 사용하여 응답이 브라우저에 표시하는 대신
1784
+ 디스크에 저장되어야 함을 블라우저에게 알릴 수 있습니다.
1509
1785
 
1510
- ```ruby
1786
+ ``` ruby
1511
1787
  get '/' do
1512
1788
  attachment
1513
1789
  "store it!"
1514
1790
  end
1515
1791
  ```
1516
1792
 
1517
- 이 때 파일명을 전달할 수도 있다:
1793
+ 파일명을 전달할 수도 있습니다.
1518
1794
 
1519
- ```ruby
1795
+ ``` ruby
1520
1796
  get '/' do
1521
1797
  attachment "info.txt"
1522
1798
  "store it!"
@@ -1525,21 +1801,22 @@ end
1525
1801
 
1526
1802
  ### 날짜와 시간 다루기
1527
1803
 
1528
- Sinatra는 `time_for_` 헬퍼 메서드를 제공하는데, 이 메서드는 주어진 값으로부터 Time 객체를 생성한다.
1529
- `DateTime` 이나 `Date` 또는 유사한 클래스들도 변환 가능하다:
1804
+ Sinatra는 `time_for_` 헬퍼 메서드를 제공합니다. 이 메서드는
1805
+ 주어진 값으로부터 Time 객체를 생성한다. `DateTime`, `Date` 같은
1806
+ 비슷한 클래스들도 변환됩니다.
1530
1807
 
1531
- ```ruby
1808
+ ``` ruby
1532
1809
  get '/' do
1533
1810
  pass if Time.now > time_for('Dec 23, 2012')
1534
1811
  "still time"
1535
1812
  end
1536
1813
  ```
1537
1814
 
1538
- 이 메서드는 내부적으로 `expires` 나 `last_modified` 같은 곳에서 사용된다.
1539
- 따라서 여러분은 애플리케이션에서 `time_for`를 오버라이딩하여
1540
- 이들 메서드의 동작을 쉽게 확장할 수 있다:
1815
+ 이 메서드는 내부적으로 `expires` 나 `last_modified` 같은 곳에서 사용됩니다.
1816
+ 따라서 여러분은 애플리케이션에서 `time_for`를 오버라이딩하여 이들 메서드의
1817
+ 동작을 쉽게 확장할 수 있습니다.
1541
1818
 
1542
- ```ruby
1819
+ ``` ruby
1543
1820
  helpers do
1544
1821
  def time_for(value)
1545
1822
  case value
@@ -1559,21 +1836,19 @@ end
1559
1836
 
1560
1837
  ### 템플릿 파일 참조하기
1561
1838
 
1562
- `find_template`는 렌더링할 템플릿 파일을 찾는데 사용된다:
1839
+ `find_template`는 렌더링할 템플릿 파일을 찾는데 사용됩니다.
1563
1840
 
1564
- ```ruby
1841
+ ``` ruby
1565
1842
  find_template settings.views, 'foo', Tilt[:haml] do |file|
1566
1843
  puts "could be #{file}"
1567
1844
  end
1568
1845
  ```
1569
1846
 
1570
- This is not really useful. But it is useful that you can actually override this
1571
- method to hook in your own lookup mechanism. For instance, if you want to be
1572
- able to use more than one view directory:
1573
- 이건 별로 유용하지 않다. 그렇지만 이 메서드를 오버라이드하여 여러분만의 참조 메커니즘에서 가로채는 것은 유용하다.
1574
- 예를 들어, 하나 이상의 뷰 디렉터리를 사용하고자 한다면:
1847
+ 이것만으로는 그렇게 유용하지는 않습니다만, 메서드를 오버라이드하여 여러분만의
1848
+ 참조 메커니즘에서 가로채게 하면 유용해집니다. 예를 들어, 하나 이상의 디렉터리를
1849
+ 사용하고자 한다면 이렇게 하세요.
1575
1850
 
1576
- ```ruby
1851
+ ``` ruby
1577
1852
  set :views, ['views', 'templates']
1578
1853
 
1579
1854
  helpers do
@@ -1583,9 +1858,9 @@ helpers do
1583
1858
  end
1584
1859
  ```
1585
1860
 
1586
- 또다른 예제는 각각의 엔진마다 다른 디렉터리를 사용할 경우다:
1861
+ 다른 예제는 엔진마다 다른 디렉터리를 사용할 경우입니다.
1587
1862
 
1588
- ```ruby
1863
+ ``` ruby
1589
1864
  set :views, :sass => 'views/sass', :haml => 'templates', :default => 'views'
1590
1865
 
1591
1866
  helpers do
@@ -1599,17 +1874,17 @@ end
1599
1874
 
1600
1875
  여러분은 이것을 간단하게 확장(extension)으로 만들어 다른 사람들과 공유할 수 있다!
1601
1876
 
1602
- `find_template`은 그 파일이 실제 존재하는지 검사하지 않음에 유의하자.
1603
- 대신 모든 가능한 경로에 대해 주어진 블록을 호출할 뿐이다.
1604
- 이것은 성능 문제는 아닌 것이, `render`는 파일이 발견되는 즉시 `break`를 사용할 것이기 때문이다.
1605
- 또한, 템플릿 위치(그리고 콘텐츠)는 개발 모드에서 실행 중이 아니라면 캐시될 것이다.
1606
- 정말로 멋진 메세드를 작성하고 싶다면 이 점을 명심하자.
1877
+ `find_template`은 그 파일이 실제 존재하는지 검사하지 않음에 유의합니다.
1878
+ 모든 가능한 경로에 대해 주어진 블록을 호출할 뿐입니다. 이것은 성능 문제는
1879
+ 되지 않습니다. 왜냐하면 `render`는 파일이 발견되는 즉시 `break`하기 때문입니다.
1880
+ 또한, 템플릿 위치(그리고 콘텐츠)는 개발 모드에서 실행 중이 아니라면 캐시될 것입니다.
1881
+ 정말로 멋진 메세드를 작성하고 싶다면 이 점을 명심하세요.
1607
1882
 
1608
1883
  ## 설정(Configuration)
1609
1884
 
1610
- 모든 환경에서, 시작될 때, 한번만 실행:
1885
+ 모든 환경에서, 시작될 때, 한번만 실행되게 하려면 이렇게 하면 됩니다.
1611
1886
 
1612
- ```ruby
1887
+ ``` ruby
1613
1888
  configure do
1614
1889
  # 옵션 하나 설정
1615
1890
  set :option, 'value'
@@ -1628,25 +1903,25 @@ configure do
1628
1903
  end
1629
1904
  ```
1630
1905
 
1631
- 환경(RACK_ENV 환경 변수)이 `:production`일 때만 실행:
1906
+ 환경(RACK_ENV 환경 변수)이 `:production`일 때만 실행되게 하려면 이렇게 하면 됩니다.
1632
1907
 
1633
- ```ruby
1908
+ ``` ruby
1634
1909
  configure :production do
1635
1910
  ...
1636
1911
  end
1637
1912
  ```
1638
1913
 
1639
- 환경이 `:production` 또는 `:test`일 때 실행:
1914
+ 환경이 `:production` 또는 `:test`일 때 실행되게 하려면 이렇게 하면 됩니다.
1640
1915
 
1641
- ```ruby
1916
+ ``` ruby
1642
1917
  configure :production, :test do
1643
1918
  ...
1644
1919
  end
1645
1920
  ```
1646
1921
 
1647
- 이들 옵션은 `settings`를 통해 접근 가능하다:
1922
+ 옵션들은 `settings`를 통해 접근 가능합니다.
1648
1923
 
1649
- ```ruby
1924
+ ``` ruby
1650
1925
  configure do
1651
1926
  set :foo, 'bar'
1652
1927
  end
@@ -1661,25 +1936,34 @@ end
1661
1936
  ### 공격 방어 설정하기(Configuring attack protection)
1662
1937
 
1663
1938
  Sinatra는 [Rack::Protection](https://github.com/rkh/rack-protection#readme)을 사용하여
1664
- 일반적인, 일어날 수 있는 공격에 대비한다.
1665
- 부분은 간단하게 비활성시킬 있다(성능 향상 효과를 가져올 것이다):
1939
+ 일반적이고 일어날 수 있는 공격에 대비합니다. 이 모듈은 간단하게 비활성시킬 수 있습니다.
1940
+ (하지만 애플리케이션에 엄청나게 많은 취약성을 야기합니다.)
1666
1941
 
1667
- ```ruby
1942
+ ``` ruby
1668
1943
  disable :protection
1669
1944
  ```
1670
1945
 
1671
- 하나의 방어층만 스킵하려면, 옵션 해시에 `protection`을 설정하면 된다:
1946
+ 하나의 방어층만 스킵하려면, 옵션 해시에 `protection`을 설정하면 됩니다.
1672
1947
 
1673
- ```ruby
1948
+ ``` ruby
1674
1949
  set :protection, :except => :path_traversal
1675
1950
  ```
1676
1951
 
1677
- 방어막 여러 개를 비활성하려면, 배열로 주면 된다:
1952
+ 배열로 넘김으로써 방어층 여러 개를 비활성화할 있습니다.
1678
1953
 
1679
- ```ruby
1954
+ ``` ruby
1680
1955
  set :protection, :except => [:path_traversal, :session_hijacking]
1681
1956
  ```
1682
1957
 
1958
+ 기본적으로 `:sessions`가 활성 중일 때만 Sinatra는 방어층을 설정합니다.
1959
+ 때로는 자신만의 세션을 설정할 때도 있습니다. 이런 경우 `:session` 옵션을
1960
+ 넘겨줌으로써 세션을 기반으로한 방어층을 설정 할 수 있습니다.
1961
+
1962
+ ``` ruby
1963
+ use Rack::Session::Pool
1964
+ set :protection, :session => true
1965
+ ```
1966
+
1683
1967
  ### 가능한 설정들(Available Settings)
1684
1968
 
1685
1969
  <dl>
@@ -1687,202 +1971,248 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1687
1971
  <dd>
1688
1972
  만약 비활성이면, Sinatra는 상대경로 리다이렉트를 허용할 것이지만,
1689
1973
  이렇게 되면 Sinatra는 더 이상 오직 절대경로 리다이렉트만 허용하고 있는
1690
- RFC 2616(HTTP 1.1)에 위배될 것이다.
1691
-
1974
+ RFC 2616(HTTP 1.1)에 위배됨.
1975
+ </dd>
1976
+ <dd>
1692
1977
  적정하게 설정되지 않은 리버스 프록시 하에서 앱을 실행 중이라면 활성화시킬 것.
1693
1978
  <tt>rul</tt> 헬퍼는, 만약 두 번째 매개변수로 <tt>false</tt>를 전달하지만 않는다면,
1694
- 여전히 절대경로 URL을 생성할 것임에 유의하자.
1695
-
1696
- 기본값은 비활성.
1979
+ 여전히 절대경로 URL을 생성할 것임에 유의.
1697
1980
  </dd>
1981
+ <dd>기본값은 비활성.</dd>
1698
1982
 
1699
1983
  <dt>add_charsets</dt>
1700
1984
  <dd>
1701
1985
  <tt>content_type</tt>가 문자셋 정보에 자동으로 추가하게 될 마임(mime) 타입.
1702
-
1703
- 이 옵션은 오버라이딩하지 말고 추가해야 한다:
1704
-
1986
+ 이 옵션은 오버라이딩하지 말고 추가해야 함.
1705
1987
  <tt>settings.add_charsets << "application/foobar"</tt>
1706
1988
  </dd>
1707
1989
 
1708
1990
  <dt>app_file</dt>
1709
- <dd>메인 애플리케이션 파일의 경로. 프로젝트 루트와 뷰, 그리고 public 폴더, 인라인 템플릿을
1710
- 파악할 사용됨.
1991
+ <dd>
1992
+ 메인 애플리케이션 파일의 경로. 프로젝트 루트, 뷰, public 폴더,
1993
+ 인라인 템플릿을 파악할 때 사용됨.
1711
1994
  </dd>
1712
1995
 
1713
1996
  <dt>bind</dt>
1714
- <dd>바인드할 IP 주소(기본값: 0.0.0.0).
1715
- 오직 빌트인(built-in) 서버에서만 사용됨.
1716
- </dd>
1997
+ <dd>바인드할 IP 주소(기본값: <tt>0.0.0.0</tt> <em>이나</em> `environment`가 개발로 설정 되어있으면 <tt>localhost</tt>). 오직 빌트인(built-in) 서버에서만 사용됨.</dd>
1717
1998
 
1718
1999
  <dt>default_encoding</dt>
1719
- <dd>모를가정할 인코딩
1720
- (기본값은 <tt>"utf-8"</tt>).
1721
- </dd>
2000
+ <dd>인코딩을 알 수 없을 인코딩(기본값은 <tt>"utf-8"</tt>).</dd>
1722
2001
 
1723
2002
  <dt>dump_errors</dt>
1724
- <dd>
1725
- 로그로 에러 출력.
1726
- </dd>
2003
+ <dd>로그안의 에러 출력.</dd>
1727
2004
 
1728
2005
  <dt>environment</dt>
1729
- <dd>현재 환경, 기본값은 <tt>ENV['RACK_ENV']</tt> 또는 알 수 없을 경우 "development".</dd>
2006
+ <dd>
2007
+ 현재 환경, 기본값은 <tt>ENV['RACK_ENV']</tt> ENV에 없을 경우엔 "development".
2008
+ </dd>
1730
2009
 
1731
2010
  <dt>logging</dt>
1732
2011
  <dd>로거(logger) 사용.</dd>
1733
2012
 
1734
2013
  <dt>lock</dt>
1735
- <dd>매 요청에 걸쳐 잠금(lock)을 설정. Ruby 프로세스 당 요청을 동시에 할 경우.
1736
-
1737
- 앱이 스레드 안전(thread-safe)이 아니라면 활성화시킬 것.
1738
- 기본값은 비활성.</dd>
2014
+ <dd>
2015
+ Ruby 프로세스 당 요청을 동시에 할 경우에만 매 요청에 걸쳐 잠금(lock)을 설정.
2016
+ </dd>
2017
+ <dd>앱이 스레드에 안전(thread-safe)하지 않으면 활성화시킬 것. 기본값은 비활성.</dd>
1739
2018
 
1740
2019
  <dt>method_override</dt>
1741
- <dd>put/delete를 지원하지 않는 브라우저에서 put/delete 폼을 허용하는
1742
- <tt>_method</tt> 꼼수 사용.</dd>
2020
+ <dd>
2021
+ put/delete를 지원하지 않는 브라우저에서 put/delete 폼을 허용하는
2022
+ <tt>_method</tt> 꼼수 사용.
2023
+ </dd>
1743
2024
 
1744
2025
  <dt>port</dt>
1745
2026
  <dd>접속 포트. 빌트인 서버에서만 사용됨.</dd>
1746
2027
 
1747
2028
  <dt>prefixed_redirects</dt>
1748
- <dd>절대경로가 주어지지 않은 리다이렉트에 <tt>request.script_name</tt>를
1749
- 삽입할지 여부. 이렇게 하면 <tt>redirect '/foo'</tt>는 <tt>redirect to('/foo')</tt>
1750
- 처럼 동작. 기본값은 비활성.</dd>
2029
+ <dd>
2030
+ 절대경로가 주어지지 않은 리다이렉트에 <tt>request.script_name</tt>를
2031
+ 삽입할지 여부를 결정. 활성화 하면 <tt>redirect '/foo'</tt>는
2032
+ <tt>redirect to('/foo')</tt>처럼 동작. 기본값은 비활성.
2033
+ </dd>
1751
2034
 
1752
2035
  <dt>protection</dt>
1753
2036
  <dd>웹 공격 방어를 활성화시킬 건지 여부. 위의 보안 섹션 참조.</dd>
1754
2037
 
2038
+ <dt>public_dir</dt>
2039
+ <dd><tt>public_folder</tt>의 별칭. 밑을 참조.</dd>
2040
+
1755
2041
  <dt>public_folder</dt>
1756
- <dd>public 파일이 제공될 폴더의 경로.
1757
- static 파일 제공이 활성화된 경우만 사용됨(아래 <tt>static</tt>참조).
1758
- 만약 설정이 없으면 <tt>app_file</tt>로부터 유추됨.</dd>
2042
+ <dd>
2043
+ public 파일이 제공될 폴더의 경로.
2044
+ static 파일 제공이 활성화된 경우만 사용됨(아래 <tt>static</tt>참조).
2045
+ 만약 설정이 없으면 <tt>app_file</tt>로부터 유추됨.
2046
+ </dd>
1759
2047
 
1760
2048
  <dt>reload_templates</dt>
1761
- <dd>요청 간에 템플릿을 리로드(reload)할 건지 여부.
1762
- 개발 모드에서는 활성됨.</dd>
2049
+ <dd>
2050
+ 요청 간에 템플릿을 리로드(reload)할 건지 여부. 개발 모드에서는 활성됨.
2051
+ </dd>
1763
2052
 
1764
2053
  <dt>root</dt>
1765
- <dd>프로젝트 루트 디렉터리 경로.
1766
- 설정이 없으면 <tt>app_file</tt> 설정으로부터 유추됨.</dd>
2054
+ <dd>
2055
+ 프로젝트 루트 디렉터리 경로. 설정이 없으면 <tt>app_file</tt> 설정으로부터 유추됨.
2056
+ </dd>
1767
2057
 
1768
2058
  <dt>raise_errors</dt>
1769
- <dd>예외 발생(애플리케이션은 중단됨).
1770
- 기본값은 <tt>environment</tt>가 <tt>"test"</tt>인 경우는 활성, 그렇지 않으면 비활성.</dd>
2059
+ <dd>
2060
+ 예외 발생(애플리케이션은 중단됨).
2061
+ 기본값은 <tt>environment</tt>가 <tt>"test"</tt>인 경우는 활성, 그렇지 않으면 비활성.
2062
+ </dd>
1771
2063
 
1772
2064
  <dt>run</dt>
1773
- <dd>활성화되면, Sinatra가 웹서버의 시작을 핸들링.
1774
- rackup 또는 다른 도구를 사용하는 경우라면 활성화시키지 말 것.</dd>
2065
+ <dd>
2066
+ 활성화되면, Sinatra가 웹서버의 시작을 핸들링.
2067
+ rackup 또는 다른 도구를 사용하는 경우라면 활성화시키지 말 것.
2068
+ </dd>
1775
2069
 
1776
2070
  <dt>running</dt>
1777
- <dd>빌트인 서버가 실행 중인지?
1778
- 이 설정은 변경하지 말 것!</dd>
2071
+ <dd>빌트인 서버가 실행 중인가? 이 설정은 변경하지 말 것!</dd>
1779
2072
 
1780
2073
  <dt>server</dt>
1781
2074
  <dd>
1782
2075
  빌트인 서버로 사용할 서버 또는 서버 목록.
1783
- 기본값은 ['thin', 'mongrel', 'webrick']이며 순서는 우선순위를 의미.
2076
+ 기본값은 루비구현에 따라 다르며 순서는 우선순위를 의미.
1784
2077
  </dd>
2078
+
1785
2079
  <dt>sessions</dt>
1786
- <dd><tt>Rack::Session::Cookie</tt>를 사용한 쿠키 기반 세션 활성화.
1787
- 보다 자세한 정보는 '세션 사용하기' 참조.</dd>
2080
+ <dd>
2081
+ <tt>Rack::Session::Cookie</tt>를 사용한 쿠키 기반 세션 활성화.
2082
+ 보다 자세한 정보는 '세션 사용하기' 참조.
2083
+ </dd>
1788
2084
 
1789
2085
  <dt>show_exceptions</dt>
1790
- <dd>예외 발생 시에 브라우저에 스택 추적을 보임.
1791
- 기본값은 <tt>environment</tt>가 <tt>"development"</tt>인 경우는 활성, 나머지는 비활성.
2086
+ <dd>
2087
+ 예외 발생 시에 브라우저에 스택 추적을 보임.
2088
+ 기본값은 <tt>environment</tt>가 <tt>"development"</tt>인
2089
+ 경우는 활성, 나머지는 비활성.
2090
+ </dd>
2091
+ <dd>
2092
+ <tt>:after_handler</tt>를 설정함으로써 브라우저에서
2093
+ 스택 트레이스를 보여주기 전에 앱에 특화된 에러 핸들링을
2094
+ 할 수도 있음.
1792
2095
  </dd>
1793
2096
 
1794
2097
  <dt>static</dt>
1795
- <dd>Sinatra가 정적(static) 파일을 핸들링할 지 여부.
1796
- 기능을 수행하는 서버를 사용하는 경우라면 비활성시킬 것.
1797
- 비활성시키면 성능이 올라감.
1798
- 기본값은 전통적 방식에서는 활성, 모듈 앱에서는 비활성.</dd>
2098
+ <dd>Sinatra가 정적(static) 파일을 핸들링할 지 여부를 설정.</dd>
2099
+ <dd>이 기능이 가능한 서버를 사용하는 경우라면 비활성시킬 것.</dd>
2100
+ <dd>비활성시키면 성능이 올라감.</dd>
2101
+ <dd>
2102
+ 기본값은 전통적 방식에서는 활성, 모듈 앱에서는 비활성.
2103
+ </dd>
1799
2104
 
1800
2105
  <dt>static_cache_control</dt>
1801
- <dd>Sinatra가 정적 파일을 제공하는 경우, 응답에 <tt>Cache-Control</tt> 헤더를 추가할 때 설정.
1802
- <tt>cache_control</tt> 헬퍼를 사용.
1803
- 기본값은 비활성.
1804
- 여러 값을 설정할 경우는 명시적으로 배열을 사용할 것:
1805
- <tt>set :static_cache_control, [:public, :max_age => 300]</tt>
2106
+ <dd>
2107
+ Sinatra가 정적 파일을 제공하는 경우, 응답에 <tt>Cache-Control</tt> 헤더를
2108
+ 추가할 때 설정. <tt>cache_control</tt> 헬퍼를 사용.
2109
+ 기본값은 비활성.
2110
+ </dd>
2111
+ <dd>
2112
+ 여러 값을 설정할 경우는 명시적으로 배열을 사용할 것:
2113
+ <tt>set :static_cache_control, [:public, :max_age => 300]</tt>
1806
2114
  </dd>
1807
2115
 
1808
2116
  <dt>threaded</dt>
1809
- <dd><tt>true</tt>로 설정하면, Thin이 요청을 처리하는데 있어 <tt>EventMachine.defer</tt>를 사용하도록 함. </dd>
2117
+ <dd>
2118
+ <tt>true</tt>로 설정하면, Thin이 요청을 처리하는데 있어
2119
+ <tt>EventMachine.defer</tt>를 사용하도록 함.
2120
+ </dd>
1810
2121
 
1811
2122
  <dt>views</dt>
1812
- <dd>뷰 폴더 경로. 설정하지 않은 경우 <tt>app_file</tt>로부터 유추됨.</dd>
2123
+ <dd>
2124
+ 뷰 폴더 경로. 설정하지 않은 경우 <tt>app_file</tt>로부터 유추됨.
2125
+ </dd>
2126
+
2127
+ <dt>x_cascade</dt>
2128
+ <dd>
2129
+ 라우트를 찾지못했을 때의 X-Cascade 해더를 설정여부.
2130
+ 기본값은 <tt>true</tt>
2131
+ </dd>
1813
2132
  </dl>
1814
2133
 
1815
2134
 
1816
2135
  ## 환경(Environments)
1817
2136
 
1818
- 환경은 `RACK_ENV` 환경 변수를 통해서도 설정할 수 있다. 기본값은 "development"다.
1819
- 모드에서, 모든 템플릿들은 요청 간에 리로드된다.
1820
- 특별한 `not_found` `error` 핸들러가 환경에 설치되기 때문에
1821
- 브라우저에서 스택 추적을 있을 것이다.
1822
- `"production"`과 `"test"`에서는 템플릿은 캐시되는 기본값이다.
2137
+ 3가지의 미리 정의된 `environments` `"development"`, `"production"`, `"test"`
2138
+ 있습니다. 환경은 `RACK_ENV` 환경 변수를 통해서도 설정됩니다. 기본값은
2139
+ `"development"`입니다. `"development"` 모드에서는 모든 템플릿들은 요청 간에
2140
+ 리로드됩니다. 또, `"development"` 모드에서는 특별한 `not_found` 와 `error`
2141
+ 핸들러가 브라우저에서 스택 트레이스를 수 있게합니다.
2142
+ `"production"`과 `"test"`에서는 기본적으로 템플릿은 캐시됩니다.
1823
2143
 
1824
- 다른 환경으로 실행시키려면 `-e`옵션을 사용하면 된다:
2144
+ 다른 환경으로 실행시키려면 `RACK_ENV` 환경 변수를 사용하세요.
1825
2145
 
1826
- ```ruby
1827
- ruby my_app.rb -e [ENVIRONMENT]
2146
+ ``` shell
2147
+ RACK_ENV=production ruby my_app.rb
1828
2148
  ```
1829
2149
 
1830
- 현재 설정된 환경이 무엇인지 검사하기 위해 사전 정의된 `development?`, `test?` 및 `production?` 메서드를
1831
- 사용할 수 있다.
2150
+ 현재 설정된 환경이 무엇인지 검사하기 위해서는 준비된 `development?`, `test?`,
2151
+ `production?` 메서드를 사용할 수 있습니다.
2152
+
2153
+ ``` ruby
2154
+ get '/' do
2155
+ if settings.development?
2156
+ "development!"
2157
+ else
2158
+ "not development!"
2159
+ end
2160
+ end
2161
+ ```
1832
2162
 
1833
- ## 예외 처리(Error Handling)
2163
+ ## 에러 처리(Error Handling)
1834
2164
 
1835
- 예외 핸들러는 라우터 및 사전 필터와 동일한 맥락에서 실행된다.
1836
- 이 말인즉, 이들이 제공하는 모든 것들을 사용할 수 있다는 말이다. 예를 들면 `haml`,
1837
- `erb`, `halt`, 등등.
2165
+ 예외 핸들러는 라우터 및 사전 필터와 동일한 맥락에서 실행됩니다.
2166
+ 이 말인즉, `haml`, `erb`, `halt`같은 이들이 제공하는 모든 것들을 사용할 수
2167
+ 있다는 뜻입니다.
1838
2168
 
1839
2169
  ### 찾을 수 없음(Not Found)
1840
2170
 
1841
2171
  `Sinatra::NotFound` 예외가 발생하거나 또는 응답의 상태 코드가 404라면,
1842
- `not_found` 핸들러가 호출된다:
2172
+ `not_found` 핸들러가 호출됩니다.
1843
2173
 
1844
- ```ruby
2174
+ ``` ruby
1845
2175
  not_found do
1846
2176
  '아무 곳에도 찾을 수 없습니다.'
1847
2177
  end
1848
2178
  ```
1849
2179
 
1850
- ### 오류(Error)
2180
+ ### 에러
1851
2181
 
1852
- `error` 핸들러는 라우터 또는 필터에서 뭐든 오류가 발생할 경우에 호출된다.
1853
- 예외 객체는 Rack 변수 `sinatra.error`로부터 얻을 수 있다:
2182
+ `error` 핸들러는 라우터 또는 필터에서 뭐든 오류가 발생할 경우에 호출됩니다.
2183
+ 예외 객체는 Rack 변수 `sinatra.error`로부터 얻을 수 있습니다.
1854
2184
 
1855
- ```ruby
2185
+ ``` ruby
1856
2186
  error do
1857
2187
  '고약한 오류가 발생했군요 - ' + env['sinatra.error'].name
1858
2188
  end
1859
2189
  ```
1860
2190
 
1861
- 사용자 정의 오류:
2191
+ 사용자 정의 오류는 이렇게 정의한다.
1862
2192
 
1863
- ```ruby
2193
+ ``` ruby
1864
2194
  error MyCustomError do
1865
2195
  '무슨 일이 생겼나면요...' + env['sinatra.error'].message
1866
2196
  end
1867
2197
  ```
1868
2198
 
1869
- 그런 다음, 이 오류가 발생하면:
2199
+ 그런 다음, 이 오류가 발생하면 이렇게 처리한다.
1870
2200
 
1871
- ```ruby
2201
+ ``` ruby
1872
2202
  get '/' do
1873
2203
  raise MyCustomError, '안좋은 일'
1874
2204
  end
1875
2205
  ```
1876
2206
 
1877
- 다음을 얻는다:
2207
+ 결과는 이렇습니다.
1878
2208
 
1879
- ```ruby
2209
+ ```
1880
2210
  무슨 일이 생겼냐면요... 안좋은 일
1881
2211
  ```
1882
2212
 
1883
- 또는, 상태 코드에 대해 오류 핸들러를 설치할 있다:
2213
+ 상태 코드에 대해 오류 핸들러를 설치할 수도 있습니다.
1884
2214
 
1885
- ```ruby
2215
+ ``` ruby
1886
2216
  error 403 do
1887
2217
  '액세스가 금지됨'
1888
2218
  end
@@ -1892,29 +2222,29 @@ get '/secret' do
1892
2222
  end
1893
2223
  ```
1894
2224
 
1895
- Or a range:
2225
+ 범위로 지정할 수도 있습니다.
1896
2226
 
1897
- ```ruby
2227
+ ``` ruby
1898
2228
  error 400..510 do
1899
2229
  '어이쿠'
1900
2230
  end
1901
2231
  ```
1902
2232
 
1903
- Sinatra는 개발 환경에서 동작할 경우에
1904
- 특별한 `not_found` 와 `error` 핸들러를 설치한다.
2233
+ Sinatra는 개발 환경에서 동작할 때 브라우저에 괜찮은 스택 트레이스와 추가적인
2234
+ 디버그 정보를 보여주기 위해 특별한 `not_found` 와 `error` 핸들러를 설치합니다.
1905
2235
 
1906
2236
  ## Rack 미들웨어(Rack Middleware)
1907
2237
 
1908
- Sinatra는 [Rack](http://rack.rubyforge.org/) 위에서 동작하며,
1909
- Rack은 루비 웹 프레임워크를 위한 최소한의 표준 인터페이스이다.
1910
- Rack이 애플리케이션 개발자들에게 제공하는 가장 흥미로운 기능 하나가 바로
1911
- "미들웨어(middleware)"에 대한 지원이며, 여기서 미들웨어란 서버와 여러분의 애플리케이션 사이에
1912
- 위치하면서 HTTP 요청/응답을 모니터링하거나/또는 조작함으로써
1913
- 다양한 유형의 공통 기능을 제공하는 컴포넌트(component)다.
2238
+ Sinatra는 [Rack](http://rack.rubyforge.org/) 위에서 동작하며, Rack은 루비 웹
2239
+ 프레임워크를 위한 최소한의 표준 인터페이스입니다. Rack이 애플리케이션 개발자들에게
2240
+ 제공하는 가장 흥미로운 기능은 "미들웨어(middleware)"에 대한 지원입니다.
2241
+ 여기서 미들웨어란 서버와 여러분의 애플리케이션 사이에 위치하면서 HTTP 요청/응답을
2242
+ 모니터링하거나/조작함으로써 다양한 유형의 공통 기능을 제공하는 컴포넌트입니다.
1914
2243
 
1915
- Sinatra는 톱레벨의 `use` 메서드를 사용하여 Rack 미들웨어의 파이프라인을 만드는 일을 식은 죽 먹기로 만든다:
2244
+ Sinatra는 톱레벨의 `use` 메서드를 사용하여 Rack 미들웨어의 파이프라인을 만드는 일을
2245
+ 식은 죽 먹기로 만듭니다.
1916
2246
 
1917
- ```ruby
2247
+ ``` ruby
1918
2248
  require 'sinatra'
1919
2249
  require 'my_custom_middleware'
1920
2250
 
@@ -1926,33 +2256,32 @@ get '/hello' do
1926
2256
  end
1927
2257
  ```
1928
2258
 
1929
- `use`의 의미는 [Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html]) DSL
1930
- (rackup 파일에서 가장 많이 사용된다)에서 정의한 것들과 동일하다.
1931
- 예를 들어, `use` 메서드는 블록 뿐 아니라 여러 개의/가변적인 인자도 받는다:
2259
+ `use`문법은 [Rack::Builder](http://rack.rubyforge.org/doc/classes/Rack/Builder.html]) DSL
2260
+ (rackup 파일에서 가장 많이 사용)에서 정의한 것과 동일합니다. 예를 들어, `use` 메서드는
2261
+ 블록이나 여러 개의/가변적인 인자도 받을 수 있습니다.
1932
2262
 
1933
- ```ruby
2263
+ ``` ruby
1934
2264
  use Rack::Auth::Basic do |username, password|
1935
2265
  username == 'admin' && password == 'secret'
1936
2266
  end
1937
2267
  ```
1938
2268
 
1939
- Rack은 로깅, 디버깅, URL 라우팅, 인증, 그리고 세센 핸들링을 위한 다양한 표준 미들웨어로 분산되어 있다.
1940
- Sinatra는 설정에 기반하여 이들 컴포넌트들 중 많은 것들을 자동으로 사용하며,
1941
- 따라서 여러분은 일반적으로는 `use`를 명시적으로 사용할 필요가 없을 것이다.
2269
+ Rack은 로깅, 디버깅, URL 라우팅, 인증, 그리고 세센 핸들링을 위한 다양한 표준
2270
+ 미들웨어로 분산되어 있습니다. Sinatra는 설정에 기반하여 이들 컴포넌트들 중
2271
+ 많은 것들을 자동으로 사용하며, 따라서 여러분은 일반적으로는 `use`를 명시적으로
2272
+ 사용할 필요가 없을 것입니다.
1942
2273
 
1943
- 유용한 미들웨어들은
1944
2274
  [rack](https://github.com/rack/rack/tree/master/lib/rack),
1945
2275
  [rack-contrib](https://github.com/rack/rack-contrib#readme),
1946
- [CodeRack](http://coderack.org/) 또는
1947
2276
  [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware)
1948
- 에서 찾을 수 있다.
2277
+ 에서 유용한 미들웨어들을 찾을 수 있습니다.
1949
2278
 
1950
2279
  ## 테스팅(Testing)
1951
2280
 
1952
- Sinatra 테스트는 Rack 기반 어떠한 테스팅 라이브러리 또는 프레임워크를 사용하여도 작성할 수 있다.
1953
- [Rack::Test](http://rdoc.info/github/brynary/rack-test/master/frames)를 권장한다:
2281
+ Sinatra 테스트는 많은 Rack 기반 테스팅 라이브러리, 프레임워크를 사용하여 작성가능합니다.
2282
+ 그 중 [Rack::Test](http://rdoc.info/github/brynary/rack-test/master/frames)를 권장합니다.
1954
2283
 
1955
- ```ruby
2284
+ ``` ruby
1956
2285
  require 'my_sinatra_app'
1957
2286
  require 'test/unit'
1958
2287
  require 'rack/test'
@@ -1981,16 +2310,19 @@ class MyAppTest < Test::Unit::TestCase
1981
2310
  end
1982
2311
  ```
1983
2312
 
2313
+ 주의: Sinatra를 모듈러 방식으로 사용한다면, `Sinatra::Application`
2314
+ 를 앱에서 사용하는 클래스 이름으로 바꾸세요.
2315
+
1984
2316
  ## Sinatra::Base - 미들웨어(Middleware), 라이브러리(Libraries), 그리고 모듈 앱(Modular Apps)
1985
2317
 
1986
2318
  톱레벨에서 앱을 정의하는 것은 마이크로 앱(micro-app) 수준에서는 잘 동작하지만,
1987
- Rack 미들웨어나, Rails 메탈(metal) 또는 서버 컴포넌트를 갖는 간단한 라이브러리, 또는 더 나아가
1988
- Sinatra 익스텐션(extension) 같은 재사용 가능한 컴포넌트들을 구축할 경우에는 심각한 약점을 가진다.
1989
- 톱레벨은 마이크로 앱 스타일의 설정을 가정한다(즉, 하나의 단일 애플리케이션 파일과
1990
- `./public` 및 `./views` 디렉터리, 로깅, 예외 상세 페이지 등등).
1991
- 이게 바로 `Sinatra::Base`가 필요한 부분이다:
2319
+ Rack 미들웨어나, Rails 메탈(metal) 또는 서버 컴포넌트를 갖는 간단한 라이브러리,
2320
+ 또는 더 나아가 Sinatra 익스텐션(extension) 같은 재사용 가능한 컴포넌트들을 구축할
2321
+ 경우에는 심각한 약점이 있습니다. 톱레벨은 마이크로 앱 스타일의 설정을 가정하는
2322
+ 입니다. (즉, 하나의 단일 애플리케이션 파일과 `./public` 및 `./views` 디렉터리,
2323
+ 로깅, 예외 상세 페이지 등등). 이 곳에서 `Sinatra::Base`가 필요합니다.
1992
2324
 
1993
- ```ruby
2325
+ ``` ruby
1994
2326
  require 'sinatra/base'
1995
2327
 
1996
2328
  class MyApp < Sinatra::Base
@@ -2003,36 +2335,37 @@ class MyApp < Sinatra::Base
2003
2335
  end
2004
2336
  ```
2005
2337
 
2006
- `Sinatra::Base` 서브클래스에서 사용가능한 메서드들은 톱레벨 DSL로 접근 가능한 것들과 동일하다.
2007
- 대부분의 톱레벨 앱들이 다음 두 가지만 수정하면 `Sinatra::Base` 컴포넌트로 변환 가능하다:
2338
+ `Sinatra::Base` 서브클래스에서 사용가능한 메서드들은 톱레벨 DSL로 접근 가능한 것들과
2339
+ 동일합니다. 대부분의 톱레벨 앱들은 다음 두 가지만 수정하면 `Sinatra::Base` 컴포넌트로
2340
+ 변환 가능합니다.
2008
2341
 
2009
- * 파일은 `sinatra`가 아닌 `sinatra/base`를 require해야 하며, 그렇지 않으면
2010
- 모든 Sinatra의 DSL 메서드들이 메인 네임스페이스에 불러지게 된다.
2011
- * 앱의 라우터, 예외 핸들러, 필터, 그리고 옵션들을 `Sinatra::Base`의 서브클래스에 둘 것.
2342
+ * 파일은 `sinatra`가 아닌 `sinatra/base`를 require해야 합니다.
2343
+ 그렇지 않으면 모든 Sinatra의 DSL 메서드들이 메인 네임스페이스에 불러지게
2344
+ 됩니다.
2345
+ * 앱의 라우터, 예외 핸들러, 필터, 옵션은 `Sinatra::Base`의 서브클래스에 두어야
2346
+ 합니다.
2012
2347
 
2013
- `Sinatra::Base`는 빈서판(blank slate)이다.
2014
- 빌트인 서버를 비롯한 대부분의 옵션들이 기본값으로 꺼져 있다.
2015
- 가능한 옵션들과 그 작동에 대한 상세는 [Options and Configuration](http://sinatra.github.com/configuration.html)을 참조할 것.
2348
+ `Sinatra::Base`는 백지상태(blank slate)입니다. 빌트인 서버를 비롯한 대부분의 옵션들이
2349
+ 기본값으로 꺼져 있습니다. 가능한 옵션들과 작동에 대한 상세는 [옵션과
2350
+ 설정](http://sinatra.github.com/configuration.html)을 참조하세요.
2016
2351
 
2017
2352
  ### 모듈(Modular) vs. 전통적 방식(Classic Style)
2018
2353
 
2019
- 일반적인 믿음과는 반대로, 전통적 방식에 잘못된 부분은 없다.
2020
- 여러분 애플리케이션에 맞다면, 모듈 애플리케이션으로 전환할 필요는 없다.
2354
+ 일반적인 믿음과는 반대로, 전통적 방식에 잘못된 부분은 없습니다. 여러분 애플리케이션에
2355
+ 맞다면, 모듈 애플리케이션으로 전환할 필요는 없습니다.
2021
2356
 
2022
2357
  모듈 방식이 아닌 전통적 방식을 사용할 경우 생기는 주된 단점은 루비 프로세스 당
2023
- 오직 하나의 Sinatra 애플리케이션만 사용할 수 있다는 점이다.
2024
- 만약 하나 이상을 사용할 계획이라면, 모듈 방식으로 전환하라.
2025
- 모듈 방식과 전통적 방식을 섞어쓰지 못할 이유는 없다.
2358
+ 하나의 Sinatra 애플리케이션만 사용할 수 있다는 점입니다. 만약 하나 이상을 사용할
2359
+ 계획이라면 모듈 방식으로 전환하세요. 모듈 방식과 전통적 방식을 섞어쓰지 못할
2360
+ 이유는 없습니다.
2026
2361
 
2027
- 하나의 방식에서 다른 것으로 전환할 경우에는, 기본값 설정의 미묘한 차이에 유의해야 한다:
2028
-
2029
- 설정전통적 방식 모듈 방식
2362
+ 방식을 전환할 경우에는, 기본값 설정의 미묘한 차이에 유의해야 합니다.
2030
2363
 
2031
2364
  <table>
2032
2365
  <tr>
2033
- <th>Setting</th>
2034
- <th>Classic</th>
2035
- <th>Modular</th>
2366
+ <th>설정</th>
2367
+ <th>전통적 방식</th>
2368
+ <th>모듈</th>
2036
2369
  </tr>
2037
2370
  <tr>
2038
2371
  <td>app_file</td>
@@ -2068,10 +2401,10 @@ end
2068
2401
 
2069
2402
  ### 모듈 애플리케이션(Modular Application) 제공하기
2070
2403
 
2071
- 모듈 앱을 시작하는 두 가지 일반적인 옵션이 있는데,
2072
- 공격적으로 `run!`으로 시작하거나:
2404
+ 모듈 앱을 시작하는 두 가지 일반적인 옵션이 있습니다.
2405
+ `run!`으로 능동적으로 시작하는 방법은 이렇습니다.
2073
2406
 
2074
- ```ruby
2407
+ ``` ruby
2075
2408
  # my_app.rb
2076
2409
  require 'sinatra/base'
2077
2410
 
@@ -2083,31 +2416,32 @@ class MyApp < Sinatra::Base
2083
2416
  end
2084
2417
  ```
2085
2418
 
2086
- 다음과 같이 시작:
2419
+ 이렇게 시작할 수도 있습니다.
2087
2420
 
2088
- ```ruby
2421
+ ``` shell
2089
2422
  ruby my_app.rb
2090
2423
  ```
2091
2424
 
2092
- 또는 `config.ru`와 함께 사용하며, 이 경우는 어떠한 Rack 핸들러라도 사용할 수 있다:
2425
+ `config.ru`와 함께 사용할수도 있습니다. 이 경우는 어떠한 Rack 핸들러도 사용할 수 있도록
2426
+ 허용 합다.
2093
2427
 
2094
- ```ruby
2428
+ ``` ruby
2095
2429
  # config.ru
2096
2430
  require './my_app'
2097
2431
  run MyApp
2098
2432
  ```
2099
2433
 
2100
- 실행:
2434
+ 실행은 이렇게 합니다.
2101
2435
 
2102
- ```ruby
2436
+ ``` shell
2103
2437
  rackup -p 4567
2104
2438
  ```
2105
2439
 
2106
2440
  ### config.ru로 전통적 방식의 애플리케이션 사용하기
2107
2441
 
2108
- 앱 파일을 다음과 같이 작성하고:
2442
+ 앱 파일을 다음과 같이 작성합니다.
2109
2443
 
2110
- ```ruby
2444
+ ``` ruby
2111
2445
  # app.rb
2112
2446
  require 'sinatra'
2113
2447
 
@@ -2116,33 +2450,33 @@ get '/' do
2116
2450
  end
2117
2451
  ```
2118
2452
 
2119
- 대응하는 `config.ru`는 다음과 같이 작성:
2453
+ 대응하는 `config.ru`는 다음과 같이 작성합니다.
2120
2454
 
2121
- ```ruby
2455
+ ``` ruby
2122
2456
  require './app'
2123
2457
  run Sinatra::Application
2124
2458
  ```
2125
2459
 
2126
2460
  ### 언제 config.ru를 사용할까?
2127
2461
 
2128
- Good signs you probably want to use a `config.ru`:
2129
- 다음은 `config.ru`를 사용하게 될 징후들이다:
2462
+ `config.ru`는 다음 경우에 권장 됩니다.
2130
2463
 
2131
2464
  * 다른 Rack 핸들러(Passenger, Unicorn, Heroku, ...)로 배포하고자 할 때.
2132
2465
  * 하나 이상의 `Sinatra::Base` 서브클래스를 사용하고자 할 때.
2133
2466
  * Sinatra를 최종점(endpoint)이 아니라, 오로지 미들웨어로만 사용하고자 할 때.
2134
2467
 
2135
2468
  **모듈 방식으로 전환했다는 이유만으로 `config.ru`로 전환할 필요는 없으며,
2136
- 또한 `config.ru`를 사용한다고 해서 모듈 방식을 사용해야 하는 것도 아니다.**
2469
+ 또한 `config.ru`를 사용한다고 해서 모듈 방식을 사용해야 하는 것도 아닙니다.**
2137
2470
 
2138
2471
  ### Sinatra를 미들웨어로 사용하기
2139
2472
 
2140
2473
  Sinatra에서 다른 Rack 미들웨어를 사용할 수 있을 뿐 아니라,
2141
- 모든 Sinatra 애플리케이션은 순차로 어떠한 Rack 종착점 앞에 미들웨어로 추가될 수 있다.
2142
- 이 종착점은 다른 Sinatra 애플리케이션이 될 수도 있고,
2143
- 또는 Rack 기반의 어떠한 애플리케이션(Rails/Ramaze/Camping/...)이라도 가능하다:
2474
+ 어떤 Sinatra 애플리케이션에서도 순차로 어떠한 Rack 종착점 앞에 미들웨어로
2475
+ 추가될 수 있습니다. 이 종착점은 다른 Sinatra 애플리케이션이 될 수도 있고,
2476
+ 또는 Rack 기반의 어떠한 애플리케이션(Rails/Ramaze/Camping/...) 될 수도
2477
+ 있습니다.
2144
2478
 
2145
- ```ruby
2479
+ ``` ruby
2146
2480
  require 'sinatra/base'
2147
2481
 
2148
2482
  class LoginScreen < Sinatra::Base
@@ -2151,11 +2485,11 @@ class LoginScreen < Sinatra::Base
2151
2485
  get('/login') { haml :login }
2152
2486
 
2153
2487
  post('/login') do
2154
- if params[:name] == 'admin' && params[:password] == 'admin'
2155
- session['user_name'] = params[:name]
2156
- else
2157
- redirect '/login'
2158
- end
2488
+ if params[:name] == 'admin' && params[:password] == 'admin'
2489
+ session['user_name'] = params[:name]
2490
+ else
2491
+ redirect '/login'
2492
+ end
2159
2493
  end
2160
2494
  end
2161
2495
 
@@ -2175,18 +2509,18 @@ end
2175
2509
 
2176
2510
  ### 동적인 애플리케이션 생성(Dynamic Application Creation)
2177
2511
 
2178
- 경우에 따라선 어떤 상수에 할당하지 않고 런타임에서 새 애플리케이션들을 생성하고 싶을 수도 있을 것인데,
2179
- 이 때는 `Sinatra.new`를 쓰면 된다:
2512
+ 어떤 상수에 할당하지 않고 런타임에서 새 애플리케이션들을 생성하려면,
2513
+ `Sinatra.new`를 쓰면 됩니다.
2180
2514
 
2181
- ```ruby
2515
+ ``` ruby
2182
2516
  require 'sinatra/base'
2183
2517
  my_app = Sinatra.new { get('/') { "hi" } }
2184
2518
  my_app.run!
2185
2519
  ```
2186
2520
 
2187
- 이것은 선택적 인자로 상속할 애플리케이션을 받는다:
2521
+ 선택적 인자로 상속할 애플리케이션을 받을 수 있습니다.
2188
2522
 
2189
- ```ruby
2523
+ ``` ruby
2190
2524
  # config.ru
2191
2525
  require 'sinatra/base'
2192
2526
 
@@ -2204,11 +2538,12 @@ map('/b') do
2204
2538
  end
2205
2539
  ```
2206
2540
 
2207
- 이것은 Sintra 익스텐션을 테스팅하거나 또는 여러분의 라이브러리에서 Sinatra를 사용할 경우에 특히 유용하다.
2541
+ 방법은 Sintra 익스텐션을 테스팅하거나 또는 여러분의 라이브러리에서 Sinatra를
2542
+ 사용할 경우에 특히 유용합니다.
2208
2543
 
2209
- 또한 이 방법은 Sinatra를 미들웨어로 사용하는 것을 아주 쉽게 만들어 준다:
2544
+ 이 방법은 Sinatra를 미들웨어로 사용하는 것을 아주 쉽게 만들어 주기도 합니다.
2210
2545
 
2211
- ```ruby
2546
+ ``` ruby
2212
2547
  require 'sinatra/base'
2213
2548
 
2214
2549
  use Sinatra do
@@ -2220,32 +2555,32 @@ run RailsProject::Application
2220
2555
 
2221
2556
  ## 범위(Scopes)와 바인딩(Binding)
2222
2557
 
2223
- 현재 어느 범위에 있느냐가 어떤 메서드와 변수를 사용할 수 있는지를 결정한다.
2558
+ 현재 어느 범위에 있느냐가 어떤 메서드와 변수를 사용할 수 있는지를 결정합니다.
2224
2559
 
2225
2560
  ### 애플리케이션/클래스 범위
2226
2561
 
2227
- 모든 Sinatra 애플리케이션은 `Sinatra::Base`의 서브클래스에 대응된다.
2228
- 만약 톱레벨 DSL (`require 'sinatra'`)을 사용한다면,
2229
- 이 클래스는 `Sinatra::Application`이며, 그렇지 않을 경우라면 여러분이 명시적으로 생성한
2230
- 그 서브클래스가 된다. 클래스 레벨에서는 `get` 이나 `before` 같은 메서드들을 가지나,
2231
- `request` 객체나 `session` 에는 접근할 수 없다. 왜냐면 모든 요청에 대해
2232
- 애플리케이션 클래스는 오직 하나이기 때문이다.
2562
+ 모든 Sinatra 애플리케이션은 `Sinatra::Base`의 서브클래스에 대응됩니다.
2563
+ 만약 톱레벨 DSL (`require 'sinatra'`)을 사용한다면, 이 클래스는
2564
+ `Sinatra::Application`이며, 그렇지 않을 경우라면 여러분이 명시적으로 생성한
2565
+ 그 서브클래스가 됩니다. 클래스 레벨에서는 `get` 이나 `before` 같은 메서드들을
2566
+ 가지나, `request` 객체나 `session` 에는 접근할 수 없습니다. 왜냐면 모든 요청에
2567
+ 대해 애플리케이션 클래스는 오직 하나이기 때문입니다.
2233
2568
 
2234
- `set`으로 생성한 옵션들은 클래스 레벨의 메서드들이다:
2569
+ `set`으로 생성한 옵션들은 클래스 레벨의 메서드들입니다.
2235
2570
 
2236
- ```ruby
2571
+ ``` ruby
2237
2572
  class MyApp < Sinatra::Base
2238
- # 이봐요, 저는 애플리케이션 범위에 있다구요!
2573
+ # 저기요, 저는 애플리케이션 범위에 있다구요!
2239
2574
  set :foo, 42
2240
2575
  foo # => 42
2241
2576
 
2242
2577
  get '/foo' do
2243
- # 저기요, 전 이제 더 이상 애플리케이션 범위 속에 있지 않아요!
2578
+ # 저기요, 전 이제 더 이상 애플리케이션 범위 속에 있지 않아요!
2244
2579
  end
2245
2580
  end
2246
2581
  ```
2247
2582
 
2248
- 다음 속에 있을 애플리케이션 범위가 된다:
2583
+ 애플리케이션 범위에는 이런 것들이 있습니다.
2249
2584
 
2250
2585
  * 애플리케이션 클래스 본문
2251
2586
  * 확장으로 정의된 메서드
@@ -2253,36 +2588,36 @@ end
2253
2588
  * `set`의 값으로 사용된 Procs/blocks
2254
2589
  * `Sinatra.new`로 전달된 블록
2255
2590
 
2256
- 범위 객체 (클래스)는 다음과 같이 접근할 수 있다:
2591
+ 범위 객체 (클래스)는 다음과 같이 접근할 수 있습니다.
2257
2592
 
2258
2593
  * configure 블록으로 전달된 객체를 통해(`configure { |c| ... }`)
2259
2594
  * 요청 범위 내에서 `settings`
2260
2595
 
2261
2596
  ### 요청/인스턴스 범위
2262
2597
 
2263
- 매 요청마다, 애플리케이션 클래스의 새 인스턴스가 생성되고 모든 핸들러 블록은 그 범위 내에서 실행된다.
2264
- 범위 내에서 여러분은 `request` 와 `session` 객체에 접근하거나
2265
- `erb` 나 `haml` 같은 렌더링 메서드를 호출할 수 있다.
2266
- 요청 범위 내에서 애플리케이션 범위는 `settings` 헬퍼를 통해 접근 가능하다:
2598
+ 매 요청마다, 애플리케이션 클래스의 새 인스턴스가 생성되고 모든 핸들러 블록은
2599
+ 범위 내에서 실행됩니다. 범위 내에서 여러분은 `request` 와 `session` 객체에
2600
+ 접근하거나 `erb` 나 `haml` 같은 렌더링 메서드를 호출할 수 있습니다. 요청 범위
2601
+ 내에서 `settings` 헬퍼를 통해 애플리케이션 범위에 접근 가능합니다.
2267
2602
 
2268
- ```ruby
2603
+ ``` ruby
2269
2604
  class MyApp < Sinatra::Base
2270
2605
  # 이봐요, 전 애플리케이션 범위에 있다구요!
2271
2606
  get '/define_route/:name' do
2272
- # '/define_route/:name'의 요청 범위
2273
- @value = 42
2607
+ # '/define_route/:name'의 요청 범위
2608
+ @value = 42
2274
2609
 
2275
- settings.get("/#{params[:name]}") do
2276
- # "/#{params[:name]}"의 요청 범위
2277
- @value # => nil (동일한 요청이 아님)
2278
- end
2610
+ settings.get("/#{params[:name]}") do
2611
+ # "/#{params[:name]}"의 요청 범위
2612
+ @value # => nil (동일한 요청이 아님)
2613
+ end
2279
2614
 
2280
- "라우터가 정의됨!"
2615
+ "라우터가 정의됨!"
2281
2616
  end
2282
2617
  end
2283
2618
  ```
2284
2619
 
2285
- 다음 속에 있을 요청 범위 바인딩이 된다:
2620
+ 요청 범위에는 이런 것들이 있습니다.
2286
2621
 
2287
2622
  * get/head/post/put/delete/options 블록
2288
2623
  * before/after 필터
@@ -2291,30 +2626,31 @@ end
2291
2626
 
2292
2627
  ### 위임 범위(Delegation Scope)
2293
2628
 
2294
- 위임 범위(delegation scope)는 메서드를 단순히 클래스 범위로 보낸다(forward).
2295
- 그렇지만, 100% 클래스 범위처럼 움직이진 않는데, 왜냐면 클래스 바인딩을 갖지 않기 때문이다.
2296
- 오직 명시적으로 위임(delegation) 표시된 메서드들만 사용 가능하며
2297
- 또한 클래스 범위와 변수/상태를 공유하지 않는다 (유의: `self`가 다르다).
2298
- `Sinatra::Delegator.delegate :method_name`을 호출하여 메서드 위임을 명시적으로 추가할 수 있다.
2629
+ 위임 범위(delegation scope)는 메서드를 단순히 클래스 범위로 보냅니다(forward).
2630
+ 하지만 클래스 바인딩을 갖지 않기에 완전히 클래스 범위처럼 동작하지는 않습니다.
2631
+ 오직 명시적으로 위임(delegation) 표시된 메서드들만 사용 가능하고,
2632
+ 또한 클래스 범위와 변수/상태를 공유하지 않습니다 (유의: `self`가 다름).
2633
+ `Sinatra::Delegator.delegate :method_name`을 호출하여 메서드 위임을 명시적으로
2634
+ 추가할 수 있습니다.
2299
2635
 
2300
- 다음 속에 있을 위임 범위 바인딩을 갖는다:
2636
+ 위임 범위에는 이런 것들이 있습니다.
2301
2637
 
2302
2638
  * 톱레벨 바인딩, `require "sinatra"`를 한 경우
2303
2639
  * `Sinatra::Delegator` 믹스인으로 확장된 객체
2304
2640
 
2305
- 직접 코드를 살펴보길 바란다:
2641
+ 직접 코드를 살펴보길 바랍니다.
2306
2642
  [Sinatra::Delegator 믹스인](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/base.rb#L1609-1633)
2307
- 코드는 [메인 객체를 확장한 것](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/main.rb#L28-30)이다.
2643
+ [메인 객체를 확장한 것](https://github.com/sinatra/sinatra/blob/ca06364/lib/sinatra/main.rb#L28-30) 입니다.
2308
2644
 
2309
2645
  ## 명령행(Command Line)
2310
2646
 
2311
- Sinatra 애플리케이션은 직접 실행할 수 있다:
2647
+ Sinatra 애플리케이션은 직접 실행할 수 있습니다.
2312
2648
 
2313
- ```ruby
2649
+ ``` shell
2314
2650
  ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2315
2651
  ```
2316
2652
 
2317
- 옵션들:
2653
+ 옵션들은 다음과 같습니다.
2318
2654
 
2319
2655
  ```
2320
2656
  -h # 도움말
@@ -2327,163 +2663,170 @@ ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2327
2663
 
2328
2664
  ## 요구사항(Requirement)
2329
2665
 
2330
- 다음의 루비 버전은 공식적으로 지원한다:
2331
-
2666
+ 다음의 루비 버전은 공식적으로 지원됩니다.
2332
2667
  <dl>
2333
2668
  <dt> Ruby 1.8.7 </dt>
2334
- <dd>1.8.7은 완전하게 지원되지만, 꼭 그래야할 특별한 이유가 없다면,
2335
- 1.9.2로 업그레이드하거나 또는 JRuby나 Rubinius로 전환할 것을 권장한다.
2336
- 1.8.7에 대한 지원은 Sinatra 2.0과 Ruby 2.0 이전에는 중단되지 않을 것이다.
2337
- 또한 그때도, 우리는 계속 지원할 것이다.
2338
- <b>Ruby 1.8.6은 더이상 지원되지 않는다.</b>
2339
- 만약 1.8.6으로 실행하려 한다면, Sinatra 1.2로 다운그레이드하라.
2340
- Sinatra 1.4.0이 릴리스될 때 까지는 버그 픽스를 받을 수 있을 것이다.
2669
+ <dd>
2670
+ 1.8.7은 완전하게 지원되지만, 그래야할 특별한 이유가 없다면,
2671
+ 1.9.2로 업그레이드하거나 또는 JRuby나 Rubinius로 전환할 것을 권장합니다.
2672
+ 1.8.7에 대한 지원은 Sinatra 2.0 이전에는 중단되지 않을 것입니다.
2673
+ Ruby 1.8.6은 더이상 지원하지 않습니다.
2674
+ </dd>
2341
2675
 
2342
- </dd>
2343
2676
  <dt> Ruby 1.9.2 </dt>
2344
- <dd>1.9.2는 완전하게 지원되면 권장된다. Radius와 Maraby는 현재 1.9와 호환되지 않음에 유의하라.
2345
- 1.9.2p0은, Sinatra를 실행했을 때 세그먼트 오류가 발생한다고 알려져 있으니 사용하지 말라.
2346
- Ruby 1.9.4/2.0 릴리스까지는 적어도 지원을 계속할 것이며,
2347
- 최신 1.9 릴리스에 대한 지원은 Ruby 코어팀이 지원하고 있는 한 계속 지원할 것이다.
2677
+ <dd>
2678
+ 1.9.2는 완전하게 지원됩니다. 1.9.2p0은, Sinatra를 실행했을 때 세그먼트 오류가
2679
+ 발생할수 있으므로 쓰지 마세요. 공식 지원은 Sinatra 1.5 이전에는 중단되지 않을
2680
+ 것입니다.
2681
+ </dd>
2348
2682
 
2349
- </dd>
2350
2683
  <dt> Ruby 1.9.3 </dt>
2351
- <dd>1.9.3은 완전하게 지원된다. 그렇지만 프로덕션에서의 사용은
2352
- 보다 상위의 패치 레벨이 릴리스될 때까지 기다리길 권장한다(현재는 p0).
2353
- 이전 버전에서 1.9.3으로 전환할 경우 모든 세션이 무효화된다는 점을 유의하라.
2684
+ <dd>
2685
+ 1.9.3은 완전하게 지원되고 권장합니다. 이전 버전에서 1.9.3으로 전환할 경우 모든
2686
+ 세션이 무효화되므로 주의하세요. 1.9.3 대한 지원은 Sinatra 2.0 이전에는
2687
+ 중단되지 않을 것입니다.
2688
+ </dd>
2354
2689
 
2355
- </dd>
2356
- <dt> Rubinius </dt>
2357
- <dd>Rubinius는 공식적으로 지원되며 (Rubinius >= 1.2.4), 모든 템플릿 언어를 포함한 모든 것들이 작동한다.
2358
- 조만간 출시될 2.0 릴리스 역시 지원할 것이다.
2690
+ <dt>Ruby 2.0.0</dt>
2691
+ <dd>
2692
+ 2.0.0은 완전하게 지원되고 권장합니다. 현재 공식 지원 중지 계획은 없습니다.
2693
+ </dd>
2359
2694
 
2360
- </dd>
2361
- <dt> JRuby </dt>
2362
- <dd>JRuby는 공식적으로 지원된다 (JRuby >= 1.6.5). 서드 파티 템플릿 라이브러리와의 문제는 알려진 바 없지만,
2363
- 만약 JRuby를 사용하기로 했다면, JRuby rack 핸들러를 찾아보길 바란다.
2364
- Thin 웹 서버는 JRuby에서 완전하게 지원되지 않는다.
2365
- JRuby의 C 확장 지원은 아직 실험 단계이며, RDiscount, Redcarpet 및 RedCloth가 현재
2366
- 이 영향을 받는다.
2695
+ <dt>Rubinius</dt>
2696
+ <dd>
2697
+ Rubinius는 공식적으로 지원됩니다. (Rubinius >= 2.x)
2698
+ <tt>gem install puma</tt>를 권장합니다.
2699
+ </dd>
2700
+
2701
+ <dt>JRuby</dt>
2702
+ <dd>
2703
+ JRuby의 마지막 안정판은 공식적으로 지원됩니다. C 확장을 JRuby와 사용하는
2704
+ 것은 권장되지 않습니다.
2705
+ <tt>gem install trinidad</tt>를 권장합니다.
2367
2706
  </dd>
2368
2707
  </dl>
2369
2708
 
2370
- 또한 우리는 새로 나오는 루비 버전을 주시한다.
2709
+ 새로 나오는 루비 버전도 주시하고 있습니다.
2371
2710
 
2372
2711
  다음 루비 구현체들은 공식적으로 지원하지 않지만
2373
- 여전히 Sinatra를 실행할 수 있는 것으로 알려져 있다:
2712
+ 여전히 Sinatra를 실행할 수 있는 것으로 알려져 있습니다.
2374
2713
 
2375
2714
  * JRuby와 Rubinius 예전 버전
2376
2715
  * Ruby Enterprise Edition
2377
2716
  * MacRuby, Maglev, IronRuby
2378
- * Ruby 1.9.0 및 1.9.1 (그러나 이 버전들은 사용하지 말 것을 권함)
2717
+ * Ruby 1.9.0 및 1.9.1 (이 버전들은 사용하지 말 것을 권합니다)
2379
2718
 
2380
- 공식적으로 지원하지 않는다는 것의 의미는 무언가가 그쪽에서만 잘못되고
2381
- 지원되는 플랫폼에서는 그러지 않을 경우, 우리의 문제가 아니라 그쪽의 문제로 간주한다는 뜻이다.
2719
+ 공식적으로 지원하지 않는다는 것의 의미는 무언가가 플랫폼에서만 잘못되고
2720
+ 지원되는 플랫폼에서는 그러지 않을 경우, 우리의 문제가 아니라 플랫폼의 문제로
2721
+ 간주한다는 뜻입니다.
2382
2722
 
2383
- 또한 우리는 CI를 ruby-head (곧 나올 2.0.0) 과 1.9.4 브랜치에 맞춰 실행하지만,
2384
- 계속해서 변하고 있기 때문에 아무 것도 보장할 수는 없다.
2385
- 1.9.4p0와 2.0.0p0가 지원되길 기대한다.
2723
+ 또한 우리는 CI를 ruby-head (곧 나올 2.1.0) 브랜치에 맞춰 실행하지만,
2724
+ 계속해서 변하고 있기 때문에 아무 것도 보장할 수는 없습니다.
2725
+ 2.1.0가 완전히 지원되길 기대합시다.
2386
2726
 
2387
- Sinatra는 선택한 루비 구현체가 지원하는 어떠한 운영체제에서도 작동해야 한다.
2727
+ Sinatra는 선택한 루비 구현체가 지원하는 어떠한 운영체제에서도 작동해야
2728
+ 합니다.
2388
2729
 
2389
2730
  현재 Cardinal, SmallRuby, BlueRuby 또는 1.8.7 이전의 루비 버전에서는
2390
- Sinatra를 실행할 수 없을 것이다.
2731
+ Sinatra를 실행할 수 없을 것입니다.
2391
2732
 
2392
2733
  ## 최신(The Bleeding Edge)
2393
2734
 
2394
- Sinatra의 가장 최근 코드를 사용하고자 한다면,
2395
- 여러분 애플리케이션을 마스터 브랜치에 맞춰 실행하면 되지만, 덜 안정적일 것임에 분명하다.
2735
+ Sinatra의 가장 최근 코드를 사용하고자 한다면, 애플리케이션을 마스터 브랜치에 맞춰
2736
+ 실행하면 되므로 부담가지지 마세요. 하지만 덜 안정적일 입니다.
2396
2737
 
2397
- 또한 우리는 가끔 사전배포(prerelease) 젬을 푸시하기 때문에, 다음과 같이 수 있다
2738
+ 주기적으로 사전배포(prerelease) 젬을 푸시하기 때문에, 최신 기능들을 얻기 위해
2739
+ 다음과 같이 할 수도 있습니다.
2398
2740
 
2399
- ```ruby
2741
+ ``` shell
2400
2742
  gem install sinatra --pre
2401
2743
  ```
2402
2744
 
2403
- 최신 기능들을 얻기 위해선
2404
-
2405
2745
  ### Bundler를 사용하여
2406
2746
 
2407
2747
  여러분 애플리케이션을 최신 Sinatra로 실행하고자 한다면,
2408
- [Bundler](http://gembundler.com/)를 사용할 것을 권장한다.
2748
+ [Bundler](http://gembundler.com/)를 사용할 것을 권장합니다.
2409
2749
 
2410
- 우선, 아직 설치하지 않았다면 bundler를 설치한다:
2750
+ 우선, 아직 설치하지 않았다면 bundler를 설치합니다.
2411
2751
 
2412
- ```ruby
2752
+ ``` shell
2413
2753
  gem install bundler
2414
2754
  ```
2415
2755
 
2416
- 그런 다음, 프로젝트 디렉터리에서, `Gemfile`을 하나 만든다:
2756
+ 그런 다음, 프로젝트 디렉터리에서, `Gemfile`을 만듭니다.
2417
2757
 
2418
- ```ruby
2419
- source :rubygems
2420
- gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
2758
+ ``` ruby
2759
+ source 'https://rubygems.org'
2760
+ gem 'sinatra', :github => "sinatra/sinatra"
2421
2761
 
2422
2762
  # 다른 의존관계들
2423
- gem 'haml'# 예를 들어, haml을 사용한다면
2763
+ gem 'haml' # 예를 들어, haml을 사용한다면
2424
2764
  gem 'activerecord', '~> 3.0' # 아마도 ActiveRecord 3.x도 필요할 것
2425
2765
  ```
2426
2766
 
2427
- 속에 애플리케이션의 모든 의존관계를 나열해야 함에 유의하자.
2428
- 그렇지만, Sinatra가 직접적인 의존관계에 있는 것들 (Rack과 Tilt)은
2429
- Bundler가 자동으로 추출하여 추가할 것이다.
2767
+ `Gemfile`안에 애플리케이션의 모든 의존성을 적어야 합니다.
2768
+ 하지만, Sinatra가 직접적인 의존관계에 있는 것들(Rack과 Tilt)은
2769
+ Bundler가 자동으로 찾아서 추가할 것입니다.
2430
2770
 
2431
- 이제 여러분은 다음과 같이 앱을 실행할 수 있다:
2771
+ 이제 앱을 실행할 수 있습니다.
2432
2772
 
2433
- ```ruby
2773
+ ``` shell
2434
2774
  bundle exec ruby myapp.rb
2435
2775
  ```
2436
2776
 
2437
2777
  ### 직접 하기(Roll Your Own)
2438
2778
 
2439
2779
  로컬 클론(clone)을 생성한 다음 `$LOAD_PATH`에 `sinatra/lib` 디렉터리를 주고
2440
- 여러분 앱을 실행한다:
2780
+ 여러분 앱을 실행합니다.
2441
2781
 
2442
- ```ruby
2782
+ ``` shell
2443
2783
  cd myapp
2444
2784
  git clone git://github.com/sinatra/sinatra.git
2445
- ruby -Isinatra/lib myapp.rb
2785
+ ruby -I sinatra/lib myapp.rb
2446
2786
  ```
2447
2787
 
2448
- 이후에 Sinatra 소스를 업데이트하려면:
2788
+ 이후에 Sinatra 소스를 업데이트하려면 이렇게 하세요.
2449
2789
 
2450
- ```ruby
2790
+ ``` shell
2451
2791
  cd myapp/sinatra
2452
2792
  git pull
2453
2793
  ```
2454
2794
 
2455
2795
  ### 전역으로 설치(Install Globally)
2456
2796
 
2457
- 젬을 직접 빌드할 수 있다:
2797
+ 젬을 직접 빌드할 수 있습니다.
2458
2798
 
2459
- ```ruby
2799
+ ``` shell
2460
2800
  git clone git://github.com/sinatra/sinatra.git
2461
2801
  cd sinatra
2462
2802
  rake sinatra.gemspec
2463
2803
  rake install
2464
2804
  ```
2465
2805
 
2466
- 만약 젬을 루트로 설치한다면, 마지막 단계는 다음과 같이 해야 한다
2806
+ 만약 젬을 루트로 설치한다면, 마지막 단계는 다음과 같이 해야 합니다.
2467
2807
 
2468
- ```ruby
2808
+ ``` shell
2469
2809
  sudo rake install
2470
2810
  ```
2471
2811
 
2472
2812
  ## 버저닝(Versioning)
2473
2813
 
2474
- Sinatra는 [시맨틱 버저닝Semantic Versioning](http://semver.org/)을 준수한다.
2475
- SemVer 및 SemVerTag 둘 다 해당된.
2814
+ Sinatra는 [시맨틱 버저닝Semantic Versioning](http://semver.org/)
2815
+ [(번역)](http://surpreem.com/archives/380)의 SemVer,
2816
+ SemVerTag를 준수합니다.
2476
2817
 
2477
2818
  ## 더 읽을 거리(Further Reading)
2478
2819
 
2479
- * [프로젝트 웹사이트](http://www.sinatrarb.com/) - 추가 문서들, 뉴스, 그리고 다른 리소스들에 대한 링크.
2480
- * [기여하기](http://www.sinatrarb.com/contributing) - 버그를 찾았나요? 도움이 필요한가요? 패치를 하셨나요?
2820
+ * [프로젝트 웹사이트](http://www.sinatrarb.com/) - 추가 문서들, 뉴스,
2821
+ 그리고 다른 리소스들에 대한 링크.
2822
+ * [기여하기](http://www.sinatrarb.com/contributing) - 버그를 찾았나요?
2823
+ 도움이 필요한가요? 패치를 하셨나요?
2481
2824
  * [이슈 트래커](http://github.com/sinatra/sinatra/issues)
2482
2825
  * [트위터](http://twitter.com/sinatra)
2483
- * [Mailing List](http://groups.google.com/group/sinatrarb/topics)
2484
- * [IRC: #sinatra](irc://chat.freenode.net/#sinatra) http://freenode.net
2826
+ * [메일링 리스트](http://groups.google.com/group/sinatrarb/topics)
2827
+ * IRC: [#sinatra](irc://chat.freenode.net/#sinatra) http://freenode.net
2485
2828
  * [Sinatra Book](http://sinatra-book.gittr.com) Cookbook 튜토리얼
2486
2829
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) 커뮤니티가 만드는 레시피
2487
2830
  * http://rubydoc.info에 있는 [최종 릴리스](http://rubydoc.info/gems/sinatra)
2488
- 또는 [current HEAD](http://rubydoc.info/github/sinatra/sinatra)에 대한 API 문서
2831
+ 또는 [current HEAD](http://rubydoc.info/github/sinatra/sinatra)에 대한 API 문서
2489
2832
  * [CI server](http://travis-ci.org/sinatra/sinatra)