[Ruby on Rails] 시작하기 2

LeeHanna·2021년 4월 28일
0

RoR

목록 보기
2/5
post-thumbnail

1. rails 설치

ruby gem 을 통해 rails를 설치한다.

$ gem install rails

new 명령어를 통해 새로운 앱 디렉토리 test1를 생성한다.

$ rails new test1

test1 디렉토리는 생겼으나, 생기던 도중 다음과 같은 에러가 발생하였다.

생성된 디렉토리를 확인해보니 몇몇 개의 파일들이 생성되지 않은 것을 볼 수 있었다.

bundler 설치 관련 오류인 것 같아 gem install bundler 명령어를 통해 bundler 설치하고 다시 실행해 보았으나 같은 에러가 났다.
기존에 응용프로그램 디렉토리에서 rails 프로젝트를 생성했었는데 Desktop에서 프로젝트를 생성하니 이와 같은 오류가 난 부분이 의문이었다.
우선 생성되다 만 test1 디렉토리를 삭제하였다.
혹시 몰라 rails를 다시 설치 해보았는데 다음과 같은 에러가 발생하였다.

찾아보니 권한에 관한 오류였고 root 유저 권한으로 실행되어야 하는데 Desktop 경로의 권한이 root가 아니어서 접근이 제한되었던 것 같았다.

$sudo gem install rails

위 명령어를 입력한 후 다시 test1 디렉토리를 만들어보니 잘 생성되었다.
문제 없이 디렉토리가 생성되면 다음과 같은 파일이 모두 포함되어 있어야 한다.

아래는 test 작업 디렉토리 생성 시 레일즈가 기본적으로 생성한 각각의 폴더가 어떤 기능을 가지는지 설명되어 있다.

test 앱을 만들고 난 후 해당 폴더 작업을 위해 해당 폴더로 이동한다.

$ cd test1

2. 필요한 gem 설치

앞서 말했듯이, 레일즈의 어플리케이션 잼의 의존성을 기본적으로 번들러를 통해 관리되기 때문에

다음의 명령어를 통해 필요한 gem을 모두 설치할 수 있다.

bundle install

모든 필요한 gem이 bundler에 의해 잘 설치된 것을 볼 수 있다.

3. 데이터베이스 설정

모든 레일즈 앱은 데이터베이스와 통신한다.
데이터페이스의 사용을 위해 config/database.yml 설정 파일이 필요하다.
새로운 레일즈 앱에서 이 파일을 열어보면 SQLite3이 기본 데이터베이스로 설정되어 있고, 이 파일은 세가지의 환경 설정으로 구성되어 있다.

  • development(개발)환경 : 개발 컴퓨터에서 사용
  • test(테스트)환경 : 자동화된 데이터 테스트를 위해 사용
  • production(제품)환경 : 어플리케이션을 실제 서비스에 배포할 때 사용

SQLite3와 MySQL 두 데이터베이스를 설정하는 방법 모두에 대해 알아본다.

3.1 SQLite3 데이터베이스 설정하기

레일즈는 가볍고 별도의 서버가 필요하지 않은 SQLite3 내장해서 배포된다.
새로운 프로젝트를 생성할 때 레일즈는 SQLite를 기본값으로 설정하지만 언제든지 나중에 변경할 수 있다.
기본 설정 파일 (config/database.yml)의 개발 환경 접속 정보가 있다.

3.2 MySQL 데이터베이스 설정하기

레일즈의 데이터베이스를 MySQL로 사용하려면 기본 설정 파일을 아래와 같이 약간 변경해야 한다.

development:
  adapter: mysql2
  encoding: utf8
  database: blog_development
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock

개발 컴퓨터의 MySQL 설치본이 root 사용자를 가지고 암호가 비어 있다면, 이 설정은 유효하게 동작한다.
그렇지 않다면 username과 password를 환경에 맞게 변경해주면 된다.

4. 데이터베이스 생성

데이터베이스 설정은 완료되었고 레일즈로 빈 데이터베이스를 생성할 차례이다.
다음 명령어로 데이터베이스를 생성한다.

$ rake db:create

rake 는 레일즈가 여러 목적으로 사용하는 범용 명령 실행 도구이다.

5. Hello, Rails!

위 과정을 통해 레일즈 앱 설정은 모두 마쳤고, 레일즈 앱서버를 실행해본다.

$ rails server

위 명령어를 통해 기본적으로 WEBrick 웹서버 인스턴스를 실행한다.
앱의 동작을 확인하려면 브라우저를 실행해서 http://localhost:3000 에 접속해보면 된다.
그럼 다음과 같은 페이지를 볼 수 있다. 웹서버를 중단하고 싶다면 Ctrl+C를 통해 중단할 수 있다.

http://localhost:3000 에 접속하면 가장 먼저 뜨는 화면이다.

6. "Hello", Rails 띄우기

레일즈가 "Hello"라고 말하게 하려면, 최소한 컨트롤러와 뷰정도는 필요하다.
다음 명령어을 통해 뷰와 컨트롤러를 생성한다.

$ rails generate controller home index

다음과 같이 잘 생성되면 레일즈는 app/views/home/index.html.erb를 포함한 몇가지 파일을 만들 것이다.
이 파일은 home컨트롤러의 index 액션(메소드)를 위한 템플릿으로 이용된다. 이 파일을 텍스트 에디터로 열어 다음의 코드를 포함시킨다.

<h1>Hello, Rails!</h1>

7. 어플리케이션 홈페이지 설정

컨트롤러와 뷰를 생성했다. "Hello Rails"를 보기위해 레일즈에게 요청 할 차례이다.
http://localhost:3000 에서 나타나게 해보기 위해 기존에 있던 rails 페이지를 다음 명령어를 통해 삭제한다.

$ rm public/index.html

레일즈는 컨트롤러가 생성하는 동적인 내용들보다, public 디렉토리내의 정적인 파일을 보여주는 것을 우선시 하기 때문에 이 페이지를 삭제하는 것이다.

이제 홈페이지의 위치를 레일즈에게 알려주어야 한다.

먼저, config/routes.rb를 에디터로 연다. 이 파일은 외부 요청과 컨트롤러와 액션을 연결하는 방법이 기술된 어플리케이션의 라우팅 파일이다. DSL로 작성되어 있다. 많은 예제 라우팅 명령어들을 포함하고 있다.

이들 중 하나인 root와 정해진 컨트롤러와 액션을 연결하는 예제인 root :to 를 포함한 줄을 찾아 주석을 해제하고 다음과 같이 변경한다.

Rails.Application.routes.draw do
 
  root :to => "home#index"

end

root :to ⇒ "home#index" 이 명령어는 레일즈에게 root 액션을 home 컨트롤러의 index 액션과 연결하는 것을 의미한다. 이제 http://localhost:3000 에 브라우저로 접속하면 "Hello, Rails!" 를 볼 수 있다.

8. Scaffolding을 이용해서 Post 시작하기

보통 rails는 rails g controller ctr_name, rails g model model_name의 명령어로 각각의 모델과 컨트롤러를 생성해주고, routes.rb에서 url패턴을 잡아줘야한다.

하지만 scoffold를 이용하면 rails g scaffold name_sapce[options]의 명령어 한번으로 모델과 컨트롤러 그리고 컨트롤러 안에 CRUD의 7가지 기능(index, show, new, create, edit, update, destroy)을 자동으로 생성한 후, routes.rb 설정까지 모두 끝내준다. scaffold는 상당히 간편하지만 어디에서나 사용되지는 않는다.

주로, 프로토타입에서 사용되곤 하는데 설명, 홍보를 위해 데모버전을 빠르게 개발하기 위해 사용되곤 한다. 하나하나 controller 설정과 routes 설정을 해주지 않아도 돼서 편리하지만 타 gem들을 사용하거나 할 때 충돌이 종종 발생하는 경우도 있다.

blog앱을 scaffolding을 사용해 Post(게시판)를 빠르게 만들어 본다.

rails g scaffold Post name:string title:string content:text

Scaffold generator는 어플리케이션내에 각 디렉토리에 15개의 파일을 생성한다. 생성되는 파일들에 대한 간단한 설명은 다음과 같다.

9. 마이그레이션 실행하기

rails generate scaffold 명령이 생성하는 결과물로 데이터베이스 마이그레이션이 있다.
마이그레이션은 데이터베이스 테이블을 간단하게 생성하고 수정할 수 있도록 설계된 루비 클래스이다.

레일즈는 rake 명령을 이용해 마이그레이션을 실행한다.
데이터베이스의 적용한 뒤에 취소(undo) 마이그레이션을 만드는 것도 가능하다.
마이그레이션 파일들은 생성될 시점의 타임 스탬프 값을 가진다.

db/migrate/2021032605344_create_posts.rb 파일을 살펴보면 다음과 같은 내용을 발견할 수 있다.

class CreatePosts < ActiveRecord::Migration[6.1]
  def change
    create_table :posts do |t|
      t.string :name
      t.string :title
      t.text :content

      t.timestamps
    end
  end
end

위 마이그레이션 파일은 마이그레이션 작업을 수행하는 up과 나중에 적용된 마이그레이션을 되돌리는 down 이렇게 두가지의 메소드를 가진다.
이 경우에 up 명령은 두개의 문자열(string)컬럼과 하나의 텍스트(text) 컬럼을 가지는 posts 테이블을 생성한다.
이 테이블은 생성(creation)과 업데이트(updating)시점을 기록하는 두개의 타임스탬프 컬럼도 가진다.

다음의 rake 명령을 통해 마이그레이션을 실행할 수 있다.

$ rake db:migrate

레일즈는 이 마이그레이션 명령을 실행하고 posts 테이블 생성을 보여준다.

기본적으로 개발(development)환경에서 작업하기 때문에, 이 명령어는 config/database.yml 파일내의 development 부분에 있는 데이터베이스에 적용된다.
다른환경, 예를 들어 제품(production)환경에 적용하려면 반드시 환경 변수 값을 명시적으로 넘겨주어야 한다.

$rake db:migrate RAILS_ENV=production.

10. 링크 추가

생성된 홈페이지에 posts 쓰기를 추가하려면, 링크를 추가해야 한다.
app/views/home/index.html.erb 를 열고 다음과 같이 수정한다.

<h1>Hello, Rails!</h1> <%= link_to "My Blog", posts_path %>

link_to는 레일즈의 뷰 헬퍼로 내장된 메소드이다.
이 메소드는 텍스트 기반으로한 링크를 생성한다. 이 경우에는 posts의 경로로 이동한다.

11. 브라우저에서 Posts 작업

이제 Posts 작업을 할 준비가 되었으므로 http://localhost:3000 로 이동한 후에 "My Blog" 링크를 클릭한다.

레일즈는 Posts를 위한 index 뷰를 보여준다.
현재 데이터베이스에는 post가 저장되어 있지 않지만, New Post를 클릭하고 하나 만들 수 있다.
그 후 수정하거나, 자세한 내용을 조회하거나, 삭제할 수 있는 Posts(글)을 볼 수 있다.
모든 로직과 HTML은 단지 rails g scaffold 명령어 한 줄로 생성된다.

0개의 댓글