Model(모델)의 기본
Controller와 View의 기본을 다졌으니 이제 Model 부분만 남았습니다.
Model은 데이터베이스 or 외부 서비스에 접근하기 위한 비지니스 로직을 담당하는 부분입니다.
Rails에서는 모듈 지향이 발전하여 모델을 만들 때 다양한 것들을 이용할 수 있습니다.
하지만 책에서는 초보자를 위주로 설명을 해주기 때문에 O/R 맵퍼를 사용하는 액티브 레코드를 이용하는 것이 좋다고 말하고 있습니다.
저도 매우매우 초보자이기 때문에 책을 따라서 액티브 레코드를 사용합니다.
Active Record는 Rails의 초기부터 표준적인 모델 컴포넌트로 제공되는 라이브러리라고 합니다.
O/R 맵퍼란?
그렇다면 O/R 맵퍼는 무엇일까요...?
O/R(Object/Relational) 맵퍼란 관계형 게이터베이스와 객체 지향 언어의 객체 사이를 연결해주는 라이브러리 라고 합니다.
즉, 우리가 사용할 Rails 라는 객체 지향 언어의 객체와 관계형 데이터베이스인 SQLite3 혹은 MySQL, PostgreSQL 같은 것들을 쉽게 연결시켜주는 라이브러리라고 할 수 있습니다.
원래는 데이터베이스로부터 추출하고 싶은 데이터를 수동을 뽑아서 객체 속성에 일일이 접근해서 하나하나 뽑아야했습니다...
이런 작업이 단순헀지만 그 당시에는 코드의 절반 이상을 차지해버리는 사태가 있었다고 합니다.
이런 작업은 개발의 생산성을 현저히 떨어트리는 원인이 됩니다. 이러한 현상을 객체 관계 불일치(impedance mismatch)라고 부른다고 합니다.
O/R 맵퍼가 이러한 잘못된 매칭을 제거하기 위한 라이브러리라고 합니다.
액티브 레코드에서는 데이터베이스의 테이블 한 개로! 모델 클래스 한 개를 생성합니다.
모델 클래스의 인스턴스는 레코드 한 개를 나타내는 객체로 객체의 속성은 테이블의 필드를 그대로 갖게 됩니다.
그리고 O/R 맵퍼를 사용하게 되면 기본적인 SQL 구문을 작성할 필요가 없습니다.
SQL에도 다양한 문법이 있지만 O/R 앱퍼를 사용하면 이러한 문법에 구애받지 않고 개발이 가능하기 때문에 만약에 데이터베이스를 바꾸게 되더라고 애플리케이션이 받는 영향을 최소화할 수 있습니다.
액티브 레코드를 사용해 데이터베이스에 연결하려면 config/database.yml에 연결과 관련된 설정을 해줘야 합니다.
Rails는 애플리케이션을 생성할 때 자동적으로 이 부분을 생성해줍니다.
database.yml
default: &default
adapter: sqlite3
pool: 5
timeout: 5000
development:
<<: *default
database: db/development.sqlite3
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: db/test.sqlite3
production:
<<: *default
database: db/production.sqlite3
YAML(.yml)은 구조화된 데이터를 작성하기 위한 파일 형식의 일종입니다.
YAML 이름의 뜻은 Ain't Markup Language 라는 뜻, 즉 마크업 언어가 아니라 들여쓰기로 구조를 표현하는 파일 형식입니다.
큰 구조를 나타낼 때는 불편하다는 단점이 있지만, 가독성이 뛰어나다는 장점으로 인해서 다양한 프레임워크에서 쓰인다고 합니다.
YAML는 다음과 같이 매개 변수를 표현합니다.
<매개 변수 이름>: <값>
그리고 들여쓰기로 계층을 표현할 수 있습니다.
EX)
production:
adapter: sqlite3
라는 것은 production라는 매개 변수의 하위 매개 변수로 adapter라는 값이 sqlite3라는 것을 나타내는 것입니다.
처음 보는 사람들도 읽기 쉽고 간단하다는 장점이 여기서 드러납니다.
저도 처음 보고 한번에 이해했습니다.
그리고 하위 계층을 표현할 때는 탭이 아닌 들여쓰기 두번 이라는 것에 주의해야 합니다.
그리고 database.yml을 보면 각각의 매개 변수가 있는 것을 볼 수 있습니다.
default, development, test, production 이렇게 4가지가 있습니다.
이렇게 각각의 환경에 맞는 것들을 따로따로 준비해서 사용합니다.
그리고 database.yml에서 사용하는 매개 변수들의 자세한 설명은 다음과 같습니다.
매개 변수 이름 | 설명 |
adapter | 접속할 데이터베이스의 종류 |
database | 데이터베이스의 이름(SQLite는 데이터베이스 파일 경로를 나타냅니다.) |
host | 호스트의 이름 또는 IP 주소 |
port | 포트 번호 |
pool | 확보할 접속 풀 |
timeout | 접속 타임아웃 시간(단위: ms) |
encoding | 사용할 문자 코드 |
username | 사용자 이름 |
password | 비밀번호 |
socket | 소켓 |
이렇게 있습니다.
모델 클래스의 생성
그리고 이제 모델 클래스를 직접 생성해보도록 합시다.
모델 클래스를 생성하는 명령어는 그리 어렵지 않습니다.
rails generate model name field:type [..] [options]
이렇게 생성하시면 됩니다.
이렇게 입력을 하게 되면 모델 클래스를 생성하신 겁니다!
그렇게 되면 파일들이 자동 생성됩니다.
그건 나중에 알기로 하고 여기서는 CoC 법칙에 따른 규칙을 알아봅시다.
종류 | 설명 | 예시 |
모델 클래스 | 첫 글자는 대문자로, 단수형 사용 | Car |
모델 클래스의 파일 이름 | 첫 글자는 소문자로 , 단수형 사용 | car.rb |
테이블 | 첫 글자는 소문자로, 복수형 사용 | cars |
테스트 스크립트 | xxxx_test.rb(첫 글자는 소문자로, 단수형 사용) | book_test.rb |
이러한 규칙들이 존재합니다.
항상 Rails의 설계 원칙인 CoC와 DRY에 따라 개발을 진행할 수 있도록 노력해야 좋은 개발자가 될 수 있다고 생각합니다.
여기서 끝이 아닙니다.
Migration으로 테이블 생성
rails generate만으로는 데이터베이스를 원하는 대로 생성할 수 없습니다. 그렇다면 어떻게 해야하는지 지금부터 알아보겠습니다.
Rails는 테이블의 수정 및 생성에 마이그레이션(Migration)이라는 것을 사용합니다.
※ Migration이란? 테이블 레이아웃을 생성 또는 변경하기 위한 구조 라고 할 수 있습니다.
마이그레이션을 사용하면 테이블 관련 작업이 매우 쉬워집니다.
따라서 레이아웃을 변경하는 일이 발생하더라도 쉽게쉽게 진행할 수 있습니다.
만약에 마이그레이션이라는 기능을 사용하지 않았더라면 복잡한 일이었을듯 합니다.
마이그레이션을 진행하기 위해서도 파일이 하나 필요합니다.
마이그레이션을 담당하는 마이그레이션 파일은 rails generate 명령어를 사용할 때 자동 생성되었습니다.
EX) 20160222220911_create_books.rb
이런 식으로 자동 생성됩니다.
그리고 이러한 마이그레이션 파일들읋 실행하는 명령어는 다음과 같습니다.
rake db:migrate
다음과 같이 입력하게 되면 마이그레이션 파일이 실행됩니다.
이런 식으로 데이터베이스쪽을 만질 수 있습니다.
아직은 제가 공부가 부족해서 이 정도뿐이지만 다음에는 더 나은 포스팅을 찾아뵙겠습니다.
그러기 위해서는 이 포스팅을 기점으로 좀 더 심도있는 Rails 공부를 해볼까합니다.
블로그 신경쓰면서 Rails를 같이 공부하는데는 무리가 있는듯합니다.
그래서 당분간은 하드웨어쪽만 따로 포스팅을 하도록 하겠습니다.
더 나은 포스팅으로 돌아오겠습니다.
읽어주셔서 감사합니다 :)
'Ruby > Ruby on Rails' 카테고리의 다른 글
유용한 Gem 소개 (0) | 2016.05.19 |
---|---|
Ruby on Rails Study 1회차! (0) | 2016.03.31 |
View(뷰)의 기본 (0) | 2016.02.19 |
Controller(컨트롤러)의 기본 (0) | 2016.02.16 |
12 weeks 12 projects (0) | 2016.02.15 |