-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathactive_record_basics.html
536 lines (500 loc) · 39.4 KB
/
active_record_basics.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>액티브 레코드 기본 — Ruby on Rails Guides</title>
<link rel="stylesheet" type="text/css" href="stylesheets/style.css" data-turbolinks-track="reload">
<link rel="stylesheet" type="text/css" href="stylesheets/print.css" media="print">
<link rel="stylesheet" type="text/css" href="stylesheets/syntaxhighlighter/shCore.css" data-turbolinks-track="reload">
<link rel="stylesheet" type="text/css" href="stylesheets/syntaxhighlighter/shThemeRailsGuides.css" data-turbolinks-track="reload">
<link rel="stylesheet" type="text/css" href="stylesheets/fixes.css" data-turbolinks-track="reload">
<link href="images/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<script src="javascripts/syntaxhighlighter.js" data-turbolinks-track="reload"></script>
<script src="javascripts/turbolinks.js" data-turbolinks-track="reload"></script>
<script src="javascripts/guides.js" data-turbolinks-track="reload"></script>
<script src="javascripts/responsive-tables.js" data-turbolinks-track="reload"></script>
<meta property="og:title" content="액티브 레코드 기본 — Ruby on Rails Guides" />
<meta name="description" content="액티브 레코드 기본이 가이드는 액티브 레코드에 대한 소개이다.이 가이드를 읽은 후 아래의 내용을 알게 될 것이다. 객체 관계 매핑(ORM)과 액티브 레코드는 무엇이고 레일스에서 어떻게 사용되는지. 액티브 레코드가 모델-뷰-컨트롤러 패러다임에 어떻게 적용되는지 액티브 레코드 모델을 사용하여 관계형 데이터베이스에 저장된 데이터를 다루는 방법 액티브 레코드 스키마 명명 규칙. 데이터베이스 마이그레이션, 유효성 검사 및 콜백의 개념" />
<meta property="og:description" content="액티브 레코드 기본이 가이드는 액티브 레코드에 대한 소개이다.이 가이드를 읽은 후 아래의 내용을 알게 될 것이다. 객체 관계 매핑(ORM)과 액티브 레코드는 무엇이고 레일스에서 어떻게 사용되는지. 액티브 레코드가 모델-뷰-컨트롤러 패러다임에 어떻게 적용되는지 액티브 레코드 모델을 사용하여 관계형 데이터베이스에 저장된 데이터를 다루는 방법 액티브 레코드 스키마 명명 규칙. 데이터베이스 마이그레이션, 유효성 검사 및 콜백의 개념" />
<meta property="og:locale" content="en_US" />
<meta property="og:site_name" content="Ruby on Rails Guides" />
<meta property="og:image" content="https://avatars.githubusercontent.com/u/4223" />
<meta property="og:type" content="website" />
</head>
<body class="guide">
<div id="topNav">
<div class="wrapper">
<strong class="more-info-label">공식 웹사이트 <a href="https://rubyonrails.org/">rubyonrails.org:</a> </strong>
<span class="red-button more-info-button">
루비온레일스 웹사이트
</span>
<ul class="more-info-links s-hidden">
<li class="more-info"><a href="https://weblog.rubyonrails.org/">블로그</a></li>
<li class="more-info"><a href="https://guides.rubyonrails.org/">영문가이드</a></li>
<li class="more-info"><a href="https://api.rubyonrails.org/">레일스API</a></li>
<li class="more-info"><a href="https://stackoverflow.com/questions/tagged/ruby-on-rails">질문하기</a></li>
<li class="more-info"><a href="https://github.com/rails/rails">GitHub에서 기여하기</a></li>
</ul>
</div>
</div>
<div id="header">
<div class="wrapper clearfix">
<h1><a href="index.html" title="Return to home page">Guides.rubyonrails.org</a></h1>
<ul class="nav">
<li><a class="nav-item" href="index.html">홈</a></li>
<li class="guides-index guides-index-large">
<a href="index.html" id="guidesMenu" class="guides-index-item nav-item">가이드 인덱스</a>
<div id="guides" class="clearfix" style="display: none;">
<hr />
<div class="guides-section-container">
<div class="guides-section">
<dt>시작하면서</dt>
<dd><a href="getting_started.html">레일스로 시작하기</a></dd>
</div>
<div class="guides-section">
<dt>모델</dt>
<dd><a href="active_record_basics.html">액티브 레코드 기본</a></dd>
<dd><a href="active_record_migrations.html">액티브 레코드 마이그레이션</a></dd>
<dd><a href="active_record_validations.html">액티브 레코드 유효성 검증</a></dd>
<dd><a href="active_record_callbacks.html">액티브 레코드 콜백</a></dd>
<dd><a href="association_basics.html">Active Record Associations</a></dd>
<dd><a href="active_record_querying.html">Active Record Query Interface</a></dd>
</div>
<div class="guides-section">
<dt>Views</dt>
<dd><a href="layouts_and_rendering.html">Layouts and Rendering in Rails</a></dd>
<dd><a href="form_helpers.html">Action View Form Helpers</a></dd>
</div>
<div class="guides-section">
<dt>Controllers</dt>
<dd><a href="action_controller_overview.html">Action Controller Overview</a></dd>
<dd><a href="routing.html">Rails Routing from the Outside In</a></dd>
</div>
<div class="guides-section">
<dt>Other Components</dt>
<dd><a href="active_support_core_extensions.html">Active Support Core Extensions</a></dd>
<dd><a href="action_mailer_basics.html">Action Mailer Basics</a></dd>
<dd><a href="active_job_basics.html">Active Job Basics</a></dd>
<dd><a href="active_storage_overview.html">Active Storage Overview</a></dd>
<dd><a href="action_cable_overview.html">Action Cable Overview</a></dd>
</div>
<div class="guides-section">
<dt>Digging Deeper</dt>
<dd><a href="i18n.html">Rails Internationalization (I18n) API</a></dd>
<dd><a href="testing.html">Testing Rails Applications</a></dd>
<dd><a href="security.html">Securing Rails Applications</a></dd>
<dd><a href="debugging_rails_applications.html">Debugging Rails Applications</a></dd>
<dd><a href="configuring.html">Configuring Rails Applications</a></dd>
<dd><a href="command_line.html">The Rails Command Line</a></dd>
<dd><a href="asset_pipeline.html">The Asset Pipeline</a></dd>
<dd><a href="working_with_javascript_in_rails.html">Working with JavaScript in Rails</a></dd>
<dd><a href="autoloading_and_reloading_constants.html">Autoloading and Reloading Constants (Zeitwerk Mode)</a></dd>
<dd><a href="autoloading_and_reloading_constants_classic_mode.html">Autoloading and Reloading Constants (Classic Mode)</a></dd>
<dd><a href="caching_with_rails.html">Caching with Rails: An Overview</a></dd>
<dd><a href="api_app.html">Using Rails for API-only Applications</a></dd>
</div>
<div class="guides-section">
<dt>Extending Rails</dt>
<dd><a href="rails_on_rack.html">Rails on Rack</a></dd>
<dd><a href="generators.html">Creating and Customizing Rails Generators & Templates</a></dd>
</div>
<div class="guides-section">
<dt>Contributions</dt>
<dd><a href="contributing_to_ruby_on_rails.html">Contributing to Ruby on Rails</a></dd>
<dd><a href="api_documentation_guidelines.html">API Documentation Guidelines</a></dd>
<dd><a href="ruby_on_rails_guides_guidelines.html">Guides Guidelines</a></dd>
</div>
<div class="guides-section">
<dt>Policies</dt>
<dd><a href="maintenance_policy.html">Maintenance Policy</a></dd>
</div>
<div class="guides-section">
<dt>Release Notes</dt>
<dd><a href="upgrading_ruby_on_rails.html">Upgrading Ruby on Rails</a></dd>
<dd><a href="6_0_release_notes.html">Version 6.0 - August 2019</a></dd>
<dd><a href="5_2_release_notes.html">Version 5.2 - April 2018</a></dd>
<dd><a href="5_1_release_notes.html">Version 5.1 - April 2017</a></dd>
<dd><a href="5_0_release_notes.html">Version 5.0 - June 2016</a></dd>
<dd><a href="4_2_release_notes.html">Version 4.2 - December 2014</a></dd>
<dd><a href="4_1_release_notes.html">Version 4.1 - April 2014</a></dd>
<dd><a href="4_0_release_notes.html">Version 4.0 - June 2013</a></dd>
<dd><a href="3_2_release_notes.html">Version 3.2 - January 2012</a></dd>
<dd><a href="3_1_release_notes.html">Version 3.1 - August 2011</a></dd>
<dd><a href="3_0_release_notes.html">Version 3.0 - August 2010</a></dd>
<dd><a href="2_3_release_notes.html">Version 2.3 - March 2009</a></dd>
<dd><a href="2_2_release_notes.html">Version 2.2 - November 2008</a></dd>
</div>
</div>
</div>
</li>
<li><a class="nav-item" href="contributing_to_ruby_on_rails.html">기여하기</a></li>
<li class="guides-index guides-index-small">
<select class="guides-index-item nav-item">
<option value="index.html">가이드 인덱스</option>
<optgroup label="시작하면서">
<option value="getting_started.html">레일스로 시작하기</option>
</optgroup>
<optgroup label="모델">
<option value="active_record_basics.html">액티브 레코드 기본</option>
<option value="active_record_migrations.html">액티브 레코드 마이그레이션</option>
<option value="active_record_validations.html">액티브 레코드 유효성 검증</option>
<option value="active_record_callbacks.html">액티브 레코드 콜백</option>
<option value="association_basics.html">Active Record Associations</option>
<option value="active_record_querying.html">Active Record Query Interface</option>
</optgroup>
<optgroup label="Views">
<option value="layouts_and_rendering.html">Layouts and Rendering in Rails</option>
<option value="form_helpers.html">Action View Form Helpers</option>
</optgroup>
<optgroup label="Controllers">
<option value="action_controller_overview.html">Action Controller Overview</option>
<option value="routing.html">Rails Routing from the Outside In</option>
</optgroup>
<optgroup label="Other Components">
<option value="active_support_core_extensions.html">Active Support Core Extensions</option>
<option value="action_mailer_basics.html">Action Mailer Basics</option>
<option value="active_job_basics.html">Active Job Basics</option>
<option value="active_storage_overview.html">Active Storage Overview</option>
<option value="action_cable_overview.html">Action Cable Overview</option>
</optgroup>
<optgroup label="Digging Deeper">
<option value="i18n.html">Rails Internationalization (I18n) API</option>
<option value="testing.html">Testing Rails Applications</option>
<option value="security.html">Securing Rails Applications</option>
<option value="debugging_rails_applications.html">Debugging Rails Applications</option>
<option value="configuring.html">Configuring Rails Applications</option>
<option value="command_line.html">The Rails Command Line</option>
<option value="asset_pipeline.html">The Asset Pipeline</option>
<option value="working_with_javascript_in_rails.html">Working with JavaScript in Rails</option>
<option value="autoloading_and_reloading_constants.html">Autoloading and Reloading Constants (Zeitwerk Mode)</option>
<option value="autoloading_and_reloading_constants_classic_mode.html">Autoloading and Reloading Constants (Classic Mode)</option>
<option value="caching_with_rails.html">Caching with Rails: An Overview</option>
<option value="api_app.html">Using Rails for API-only Applications</option>
</optgroup>
<optgroup label="Extending Rails">
<option value="rails_on_rack.html">Rails on Rack</option>
<option value="generators.html">Creating and Customizing Rails Generators & Templates</option>
</optgroup>
<optgroup label="Contributions">
<option value="contributing_to_ruby_on_rails.html">Contributing to Ruby on Rails</option>
<option value="api_documentation_guidelines.html">API Documentation Guidelines</option>
<option value="ruby_on_rails_guides_guidelines.html">Guides Guidelines</option>
</optgroup>
<optgroup label="Policies">
<option value="maintenance_policy.html">Maintenance Policy</option>
</optgroup>
<optgroup label="Release Notes">
<option value="upgrading_ruby_on_rails.html">Upgrading Ruby on Rails</option>
<option value="6_0_release_notes.html">Version 6.0 - August 2019</option>
<option value="5_2_release_notes.html">Version 5.2 - April 2018</option>
<option value="5_1_release_notes.html">Version 5.1 - April 2017</option>
<option value="5_0_release_notes.html">Version 5.0 - June 2016</option>
<option value="4_2_release_notes.html">Version 4.2 - December 2014</option>
<option value="4_1_release_notes.html">Version 4.1 - April 2014</option>
<option value="4_0_release_notes.html">Version 4.0 - June 2013</option>
<option value="3_2_release_notes.html">Version 3.2 - January 2012</option>
<option value="3_1_release_notes.html">Version 3.1 - August 2011</option>
<option value="3_0_release_notes.html">Version 3.0 - August 2010</option>
<option value="2_3_release_notes.html">Version 2.3 - March 2009</option>
<option value="2_2_release_notes.html">Version 2.2 - November 2008</option>
</optgroup>
</select>
</li>
</ul>
</div>
</div>
<hr class="hide" />
<div id="feature">
<div class="wrapper">
<h2 id="active-record-basics">액티브 레코드 기본</h2><p>이 가이드는 액티브 레코드에 대한 소개이다.</p><p>이 가이드를 읽은 후 아래의 내용을 알게 될 것이다.</p>
<ul>
<li>객체 관계 매핑(ORM)과 액티브 레코드는 무엇이고 레일스에서 어떻게 사용되는지.</li>
<li>액티브 레코드가 모델-뷰-컨트롤러 패러다임에 어떻게 적용되는지</li>
<li>액티브 레코드 모델을 사용하여 관계형 데이터베이스에 저장된 데이터를 다루는 방법</li>
<li>액티브 레코드 스키마 명명 규칙.
데이터베이스 마이그레이션, 유효성 검사 및 콜백의 개념</li>
</ul>
<div id="subCol">
<h3 class="chapter"><img src="images/chapters_icon.gif" alt="" />Chapters</h3>
<ol class="chapters">
<li>
<a href="#what-is-active-record?">액티브 레코드란?</a>
<ul>
<li><a href="#the-active-record-pattern">액티브 레코드 패턴</a></li>
<li><a href="#object-relational-mapping">객체 관계 매핑</a></li>
<li><a href="#active-record-as-an-orm-framework">ORM으로서 액티브 레코드 사용하기</a></li>
</ul>
</li>
<li>
<a href="#convention-over-configuration-in-active-record">액티브 레코드에서 COC 원칙</a>
<ul>
<li><a href="#naming-conventions">명명 규칙</a></li>
<li><a href="#schema-conventions">스키마 규칙</a></li>
</ul>
</li>
<li><a href="#creating-active-record-models">액티브 레코드 모델 생성하기</a></li>
<li><a href="#overriding-the-naming-conventions">명명 규칙 변경하기</a></li>
<li>
<a href="#crud:-reading-and-writing-data">CRUD: 데이터를 읽고 쓰기</a>
<ul>
<li><a href="#create-method">Create 메소드</a></li>
<li><a href="#read-method">Read 메소드</a></li>
<li><a href="#update-method">Update 메소드</a></li>
<li><a href="#delete-method">Delete 메소드</a></li>
</ul>
</li>
<li><a href="#validations">유효성 검증</a></li>
<li><a href="#callbacks">콜백</a></li>
<li><a href="#migrations">마이그레이션</a></li>
</ol>
</div>
</div>
</div>
<div id="container">
<div class="wrapper">
<div id="mainCol">
<h3 id="what-is-active-record?"><a class="anchorlink" href="#what-is-active-record?">1 액티브 레코드란?</a></h3><p>액티브 레코드는 <a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller">MVC</a>의 M (모델)에 해당하며, 비즈니스 데이터 및 로직를 나타내는 시스템 계층이다. 액티브 레코드는 데이터베이스에 데이터를 지속적으로 저장해야 하는 비즈니스 객체의 작성 및 사용을 용이하게 한다. 이것은 Object Relational Mapping(ORM: 객체와 관계형 데이터베이스를 연결하는 작업) 시스템을 기술해 놓은 것으로 액티브 레코드 패턴을 구현한 것이다.</p><h4 id="the-active-record-pattern"><a class="anchorlink" href="#the-active-record-pattern">1.1 액티브 레코드 패턴</a></h4><p><a href="https://www.martinfowler.com/eaaCatalog/activeRecord.html">마틴 파울러(Martin Fowler)는 그의 저서 <em>Patterns of Enterprise Application Architecture</em> 에서 액티브 레코드를 기술했다</a>. 액티브 레코드에서 객체란 영구 데이터와 그 데이터를 다루는 동작을 모두 가지고 있다. 데이터 액세스 로직이 액티브 레코드 객체 내에 포함되어 있기 때문에, 그 객체를 사용하는 사람들은 객체내에 포함된 로직에 따라 데이터베이스로부터 읽고 쓰는 법을 알게 될 것이다.</p><h4 id="object-relational-mapping"><a class="anchorlink" href="#object-relational-mapping">1.2 객체 관계 매핑</a></h4><div class="note"><p>객체를 관계형 데이터베이스로 연결하는 것을 말한다.(역주)</p></div><p>일반적으로 ORM이라는 약자로 일컫는 <a href="https://en.wikipedia.org/wiki/Object-relational_mapping">객체 관계 매핑</a>은 애플리케이션 내의 객체를 관계형 데이터베이스 관리 시스템의 테이블에 연결하는 기술이다. ORM을 사용하면 SQL 문을 직접 작성하지 않고 전체 데이터베이스 액세스 코드를 적게 사용하고도 애플리케이션 내 객체의 특성 및 관계를 데이터베이스에서 쉽게 저장하고 검색 할 수 있다.</p><div class="note"><p>관계형 데이터베이스 관리 시스템 (RDBMS) 및 구조적 쿼리 언어 (SQL)에 대한 기본 지식은 액티브 레코드를 완전히 이해하는 데 도움이 된다. 더 많은 내용을 배우고자 할 경우, <a href="https://www.w3schools.com/sql/default.asp">이 튜토리얼</a> (또는 <a href="http://www.sqlcourse.com/">이것</a>)을 참조하거나 다른 방법으로 학습하기 바란다.</p></div><h4 id="active-record-as-an-orm-framework"><a class="anchorlink" href="#active-record-as-an-orm-framework">1.3 ORM으로서 액티브 레코드 사용하기</a></h4><p>액티브 레코드가 제공해 주는 여러가지 기전 중에서 가장 중요한 기능은 아래와 같다.</p>
<ul>
<li>모델과 해당 데이터를 나타낸다.</li>
<li>모델 간의 연관성을 나타낸다.</li>
<li>모델 간의 연관성을 통해서 상속 계층을 나타낸다.</li>
<li>데이터베이스로 저장되기 전에 모델의 유효성 검증을 한다.</li>
<li>객체지향 방식으로 데이터베이스 작업을 수행한다.</li>
</ul>
<h3 id="convention-over-configuration-in-active-record"><a class="anchorlink" href="#convention-over-configuration-in-active-record">2 액티브 레코드에서 COC 원칙</a></h3><div class="note"><p>Convention Over Configuration를 COC라는 약자로 말하기도 함. 설정보다는 관례를 우선시 함.</p></div><p>다른 프로그래밍 언어나 프레임워크를 사용하여 애플리케이션을 작성할 때 설정을 위한 많은 코드를 작성해야 할 수도 있다. 이것은 일반적으로 ORM 프레임워크에 적용된다. 그러나 레일스에서 채택한 관례를 따르는 경우 액티브 레코드 모델을 작성할 때 설정을 위한 코드를 거의 작성하지 않아도 된다(일부 경우에는 설정 코드가 전혀 필요 없음). 동일한 방식으로 애플리케이션을 설정하는 대부분의 경우 이런 방식이 기본이 되어야 한다. 따라서 표준 관례을 준수 할 수 없는 경우에만 명시적 설정이 필요하다.</p><h4 id="naming-conventions"><a class="anchorlink" href="#naming-conventions">2.1 명명 규칙</a></h4><p>기본적으로 액티브 레코드는 몇 가지 명명 규칙을 사용하여 모델과 데이터베이스 테이블 간의 매핑을 만드는 방법을 찾는다. 레일스는 각 데이터베이스 테이블을 찾기 위해 클래스 이름을 복수화한다. 따라서 <code>Book</code> 클래스의 경우 <strong>books</strong>라는 데이터베이스 테이블이 있어야 한다. 레일스의 복수형 기전은 매우 강력하여 규칙적인 단어와 불규칙적 인 단어를 모두 복수화 (및 단일화) 할 수 있다. 둘 이상의 단어로 구성된 클래스 이름을 사용하는 경우 모델 클래스 이름은 CamelCase 형태를 사용하여 루비 규칙을 따라야 하며 테이블 이름은 밑줄로 구분 된 단어를 포함해야 한다. 예:</p>
<ul>
<li>모델 클래스 - 단수형, 각 단어의 첫글자는 대문자로 시작 (예: <code>BookClub</code>).</li>
<li>데이터베이스 테이블 - 복수형, 밑줄 문자로 단어를 구분 (예: <code>book_clubs</code>).</li>
</ul>
<table>
<thead>
<tr>
<th>모델 / 클래스</th>
<th>테이블 / 스키마</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Article</code></td>
<td><code>articles</code></td>
</tr>
<tr>
<td><code>LineItem</code></td>
<td><code>line_items</code></td>
</tr>
<tr>
<td><code>Deer</code></td>
<td><code>deers</code></td>
</tr>
<tr>
<td><code>Mouse</code></td>
<td><code>mice</code></td>
</tr>
<tr>
<td><code>Person</code></td>
<td><code>people</code></td>
</tr>
</tbody>
</table>
<h4 id="schema-conventions"><a class="anchorlink" href="#schema-conventions">2.2 스키마 규칙</a></h4><p>액티브 레코드는 컬럼의 사용 목적에 따라 데이터베이스 테이블의 컬럼 명명 규칙을 사용한다.</p>
<ul>
<li>
<strong>Foreign keys</strong> - <code>singularized_table_name_id</code> 패턴에 따라 명명되어야 한다(예: <code>item_id</code>, <code>order_id</code>). 모델 간 관계 설정시 액티브 레코드에서 찾는 필드이다.</li>
<li>
<strong>Primary keys</strong> - 기본적으로 액티브 레코드는 테이블 프라이머리 키로 정수형 컬럼인 <code>id</code>를 사용한다 (PostgreSQL과 MySQL용으로는 <code>bigint</code>, SQLite용으로는 <code>integer</code> 데이터형을 사용함). 테이블를 생성하기 위해 <a href="active_record_migrations.html">액티브 레코드 마이그레이션</a>을 사용할 경우 이 컬럼들은 자동으로 추가될 것이다.</li>
</ul>
<p>액티브 레코드 인스턴스에 특별한 기능을 추가 할 수 있는 선택적 컬럼 이름도 있다.</p>
<ul>
<li>
<code>created_at</code> - 레코드를 처음으로 생성할 때 현재 날짜와 시간으로 자동 설정된다.</li>
<li>
<code>updated_at</code> - 레코드를 생성하거나 업데이트할 때마다 현재 날짜와 시간으로 자동 설정된다.</li>
<li>
<code>lock_version</code> - 모델에 <a href="https://api.rubyonrails.org/6-0-stable/classes/ActiveRecord/Locking.html">optimistic locking</a>을 추가한다.</li>
<li>
<code>type</code> - 모델이 <a href="https://api.rubyonrails.org/6-0-stable/classes/ActiveRecord/Base.html#class-ActiveRecord::Base-label-Single+table+inheritance">Single Table Inheritance</a>를 사용하도록 지정한다.</li>
<li>
<code>(association_name)_type</code> - <a href="association_basics.html#polymorphic-associations">polymorphic associations</a>의 형태를 저장한다.</li>
<li>
<code>(table_name)_count</code> - 모델간의 관계상 belonging 객체 수를 캐시하는 데 사용된다. 예를 들어, 다수의 <code>Comment</code> 인스턴스를 가지는 <code>Article</code> 클래스의 <code>comments_count</code> 컬럼은 각 기사에 올라 온 댓글 수를 캐시한다.</li>
</ul>
<div class="note"><p>이와 같은 컬럼 이름은 옵션이지만 실제로는 액티브 레코드에 의해 예약되어 있다. 특별한 추가 기능을 필요하지 않으면 예약 키워드를 사용하지 않도록 한다. 예를 들어, <code>type</code>은 STI (Single Table Inheritance)를 사용하여 테이블을 지정하는 데 사용되는 예약 키워드이다. STI를 사용하지 않는 경우에는 "context"와 같은 유사한 키워드를 사용하더라도 모델링 중인 데이터를 정확하게 설명 할 수 있을 것이다.</p></div><h3 id="creating-active-record-models"><a class="anchorlink" href="#creating-active-record-models">3 액티브 레코드 모델 생성하기</a></h3><p>액티브 레코드 모델을 생성하는 것은 매우 쉽다. <code>ApplicationRecord</code> 클래스를 상속하여 하위 클래스를 만들기만 하면 되며 아래와 같은 모습을 하게 된다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class Product < ApplicationRecord
end
</pre>
</div>
<p>이것은 <code>Product</code> 모델을 생성하여 데이터베이스의 <code>products</code> 테이블로 매핑할 것이다. 이로써 테이블의 각 컬럼을 모델 인스턴스의 각 속성과 매핑할 수 있게 된다. 아래와 같은 SQL문(또는 SQL 확장문 중의 하나)으로 <code>products</code> 테이블을 생성했다고 가정해 보자.</p><div class="code_container">
<pre class="brush: sql; gutter: false; toolbar: false">
CREATE TABLE products (
id int(11) NOT NULL auto_increment,
name varchar(255),
PRIMARY KEY (id)
);
</pre>
</div>
<p>위의 스키마는 두 개의 컬럼 <code>id</code>와 <code>name</code>을 가지는 테이블을 선언한다. 이 테이블의 각 레코드는 두 개의 파라미터를 가진 product를 나타낸다. 따라서, 아래와 같이 코드를 작성할 수 있을 것이다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
p = Product.new
p.name = "Some Book"
puts p.name # "Some Book"
</pre>
</div>
<h3 id="overriding-the-naming-conventions"><a class="anchorlink" href="#overriding-the-naming-conventions">4 명명 규칙 변경하기</a></h3><p>다른 종류의 명명 규칙이 필요하거나 예전 데이터베이스로 연결하는 레일스 애플리케이션이 필요한 경우에는 어떻게 해야 할까? 별다른 어려움 없이 기본 명명 규칙을 쉽게 변경할 수 있다.</p><p><code>ApplicationRecord</code>는 <code>ActiveRecord::Base</code>를 상속 받는데, 이것은 다수의 도움되는 메소드를 정의한다. <code>ActiveRecord::Base.table_name=</code> 메소드를 사용하여 테이블 이름을 아래와 같이 지정할 수 있다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class Product < ApplicationRecord
self.table_name = "my_products"
end
</pre>
</div>
<p>이런 경우에는, 테스트 정의 클래스에서 <code>set_fixture_class</code> 메소드를 사용하여 픽스쳐(my_products.yml)를 호스팅하는 클래스명을 직접 정의해 주어야 할 것이다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class ProductTest < ActiveSupport::TestCase
set_fixture_class my_products: Product
fixtures :my_products
...
end
</pre>
</div>
<p>또한 <code>ActiveRecord::Base.primary_key=</code> 메소드를 사용하여 테이블의 프라이머리 키를 사용할 컬럼 이름을 변경할 수 있다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class Product < ApplicationRecord
self.primary_key = "product_id"
end
</pre>
</div>
<div class="note"><p>액티브 레코드는 일반 컬럼명으로 <code>id</code>를 사용하는 것을 지원하지 않는다.</p></div><h3 id="crud:-reading-and-writing-data"><a class="anchorlink" href="#crud:-reading-and-writing-data">5 CRUD: 데이터를 읽고 쓰기</a></h3><p>CRUD는 데이터 조작을 위해서 사용하는 4개의 동사(<strong>C</strong>reate,
<strong>R</strong>ead, <strong>U</strong>pdate and <strong>D</strong>elete)의 첨두어이다. 액티브 레코드는 테이블로부터 데이터를 불러 들이고 조작할 수 있는 메소드를 자동으로 생성한다.</p><h4 id="create-method"><a class="anchorlink" href="#create-method">5.1 Create 메소드</a></h4><p>액티브 레코드 객체는 해시, 블록으로 부터 만들거나 만들어 진 후에 각 속성을 수동으로 설정할 수 있다. <code>new</code> 메소드는 새 객체를 리턴하지만 <code>create</code> 메소드는 객체를 리턴하여 데이터베이스에 저장한다.</p><p>예를 들어, 속성이 <code>name</code>과 <code>occupation</code>인 모델 <code>User</code>가 주어지면 <code>create</code> 메소드 호출은 데이터베이스에 새 레코드를 작성하고 저장한다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
user = User.create(name: "David", occupation: "Code Artist")
</pre>
</div>
<p><code>new</code> 메소드를 사용하면 빈 객체를 생성할 수 있다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
user = User.new
user.name = "David"
user.occupation = "Code Artist"
</pre>
</div>
<p><code>user.save</code> 메소드를 호출하면 레코드를 데이터베이스로 커밋할 것이다.</p><p>마지막으로, 블록을 지정할 경우 <code>create</code>와 <code>new</code> 메소드는 둘 다 새로운 객체를 블록으로 넘겨 주어 초기화할 수 있다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
user = User.new do |u|
u.name = "David"
u.occupation = "Code Artist"
end
</pre>
</div>
<h4 id="read-method"><a class="anchorlink" href="#read-method">5.2 Read 메소드</a></h4><p>액티브 레코드는 데이터베이스 내의 데이터로 접근하기 위한 다수의 API를 제공한다. 아래에는 액티브 레코드에서 제공하는 다양한 데이터 접근 메소드의 예를 보여 준다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# 모든 사용자를 컬렉션으로 반환한다.
users = User.all
</pre>
</div>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# 첫번째 사용자를 반환한다.
user = User.first
</pre>
</div>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# David 라는 이름을 가진 첫번째 사용자를 반환한다.
david = User.find_by(name: 'David')
</pre>
</div>
<div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# Code Artist 라는 직업을 가지면서 David 라는 이름을 가진 모든 사용자를 찾아 created_at 속성의 시간 역순으로 반환한다.
users = User.where(name: 'David', occupation: 'Code Artist').order(created_at: :desc)
</pre>
</div>
<p><a href="active_record_querying.html">Active Record Query Interface</a> 가이드에서 액티브 레코드 모델 쿼리에 대한 자세한 내용을 볼 수 있다.</p><h4 id="update-method"><a class="anchorlink" href="#update-method">5.3 Update 메소드</a></h4><p>액티브 레코드 객체를 검색하여 찾게 되면 해당 속성을 수정하여 데이터베이스에 저장할 수 있다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
user = User.find_by(name: 'David')
user.name = 'Dave'
user.save
</pre>
</div>
<p>이에 대한 간략한 설명은 아래와 같이 속성 이름을 원하는 값으로 매핑하는 해시를 사용하는 것이다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
user = User.find_by(name: 'David')
user.update(name: 'Dave')
</pre>
</div>
<p>이와 같은 방법은 한 번에 여러 속성을 업데이트 할 때 가장 유용하다. 반면에 여러 레코드를 대량으로 업데이트하려면 <code>update_all</code> 클래스 메소드가 유용 할 수 있다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
User.update_all "max_login_attempts = 3, must_change_password = 'true'"
</pre>
</div>
<h4 id="delete-method"><a class="anchorlink" href="#delete-method">5.4 Delete 메소드</a></h4><p>마찬가지로, 검색으로 찾은 액티브 레코드 객체를 삭제하므로써 데이터베이스에서 제거 할 수 있다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
user = User.find_by(name: 'David')
user.destroy
</pre>
</div>
<p>여러 레코드를 대량으로 삭제하려면 <code>destroy_by</code> 또는<code>destroy_all</code> 메소드를 사용할 수 있다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
# David 라는 이름을 가진 모든 사용자를 찾아 삭제한다.
User.destroy_by(name: 'David')
# 모든 사용자를 삭제한다.
User.destroy_all
</pre>
</div>
<h3 id="validations"><a class="anchorlink" href="#validations">6 유효성 검증</a></h3><p>액티브 레코드를 사용하면 모델이 데이터베이스에 기록되기 전에 모델의 상태를 확인할 수 있다. 모델을 확인하고 속성 값이 비어 있지 않고 유일하며 데이터베이스에 아직 미등록된 자료인지, 특정 형식을 따르는 지 등을 검증하는 데 사용할 수 있는 몇 가지 방법이 있다.</p><p>유효성 검사는 데이터베이스에 지속될 때 고려해야 할 매우 중요한 문제이므로, <code>save</code> 및 <code>update</code> 메소드는 실행할 때 이를 고려한다. 유효성 검사에 실패하면 <code>false</code>를 반환하고 실제로는 데이터베이스에 아무런 작업을 수행하지 않는다. 이 메소드는 모두 각각 뱅(!) 버전 (즉, <code>save!</code> 및 <code>update!</code>)을 가지며, 이는 유효성 검사에 실패할 경우 <code>ActiveRecord :: RecordInvalid</code> 예외를 발생시켜 더 엄격하게 검증을 한다. 아래에 예시를 위한 간단한 예문을 보여 준다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class User < ApplicationRecord
validates :name, presence: true
end
user = User.new
user.save # => false
user.save! # => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank
</pre>
</div>
<p>유효성 검사에 대한 자세한 내용은 <a href="active_record_validations.html">Active Record Validations</a> 가이드에서 확인할 수 있다.</p><h3 id="callbacks"><a class="anchorlink" href="#callbacks">7 콜백</a></h3><p>액티브 레코드 콜백을 사용하면 모델 수명주기의 특정 이벤트에 코드를 첨부 할 수 있다. 이를 통해 새 레코드 작성, 업데이트, 삭제 등의 이벤트가 발생할 때 코드를 투명하게 실행하여 모델에 동작을 추가 할 수 있다. 콜백에 대한 자세한 내용은 <a href="active_record_callbacks.html">Active Record Callbacks</a> 가이드에서 확인할 수 있다.</p><h3 id="migrations"><a class="anchorlink" href="#migrations">8 마이그레이션</a></h3><p>레일스는 마이그레이션이라는 데이터베이스 스키마를 관리하기 위한 도메인 언어(DSL)를 제공한다. 마이그레이션은 파일로 저장되며 <code>rake</code> 명령을 사용하여 액티브 레코드가 지원하는 모든 데이터베이스에 대해 실행된다. 테이블을 생성하는 마이그레이션 코드는 아래와 같다.</p><div class="code_container">
<pre class="brush: ruby; gutter: false; toolbar: false">
class CreatePublications < ActiveRecord::Migration[5.0]
def change
create_table :publications do |t|
t.string :title
t.text :description
t.references :publication_type
t.integer :publisher_id
t.string :publisher_type
t.boolean :single_issue
t.timestamps
end
add_index :publications, :publication_type_id
end
end
</pre>
</div>
<p>레일스는 데이터베이스에 커밋된 파일을 추적하고 롤백 기능을 제공한다. 실제로 테이블을 생성하려면 <code>rails db:migrate</code>를 실행하고 <code>rails db:rollback</code> 명령을 실행하여 롤백한다.</p><p>위 코드는 데이터베이스에 구애받지 않으며 MySQL, PostgreSQL, Oracle 등에서 실행된다. <a href="active_record_migrations.html">Active Record Migrations</a> 가이드에서 마이그레이션에 대해 자세히 알아볼 수 있다.</p>
<h3>피드백</h3>
<p>
이 가이드의 품질을 향상시키기 위해 여러분의 도움이 필요하다.
</p>
<p>
오타나 실제 오류를 발견시 여러분의 기여를 권고한다. 시작하려면 본 <a href="https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html#contributing-to-the-rails-documentation">가이드의 기여</a> 섹션을 읽어보기 바란다.
</p>
<p>
미완성된 컨텐츠나 업데이트되지 않은 내용을 발견할 수도 있다. 누락된 문서는 master 브랜치에 추가한다. 제시된 이슈들이 master 브랜치 상에서 이미 해결되었는지 여부를 확인하려면 먼저 <a href="https://edgeguides.rubyonrails.org">Edge Guides</a>를 확인한다. 스타일과 규칙에 대해서는 <a href="ruby_on_rails_guides_guidelines.html">Ruby on Rails Guides Guidelines</a>을 확인한다.
</p>
<p>
어떤 이유로든 고칠 수 있지만 직접 패치 할 수 없는 경우 <a href="https://github.com/rails/rails/issues">이슈를 새로 오픈</a>하면 된다.
</p>
<p>
그리고 마지막으로, 루비온레일스 문서에 관한 모든 논의는 <a href="https://groups.google.com/forum/#!forum/rubyonrails-docs">rubyonrails-docs 메일링 리스트</a> 상에서 언제든지 가능하다.
</p>
</div>
</div>
</div>
<hr class="hide" />
<div id="footer">
<div class="wrapper">
<p>본 결과물은 <a href="https://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License</a> 를 준수한다. </p>
<p>"Rails", "Ruby on Rails", 그리고 레일스 로고는 David Heinemeier Hansson의 등록상표이다. 판권 소유.</p>
</div>
</div>
</body>
</html>