Using Ruby on Rails for Web Development on Mac OS X

OSXDEV

Jump to: navigation, 찾기

2006년 3월 20일 번역중 westside

루비 온 레일스(Ruby on Rails)는 web application framework으로 지난해에 괄목할 만한 성장을 이루었습니다. 몇 가지 의미있는 잇점들과 이미 만들어진 현실 세계의 어플리케이션(real-world application)의 인상적인 포트폴리오의 지원을 받으면서, Rails는 2006년에도 의미있는 발전을 지속적으로 추진하고자 합니다. 간단히 요약하면, 루비 온 레일스는 웹의 속도를 유지하면서 SQL 데이터베이스를 바탕으로 한 대규모의 웹응용프로그램 재빠르게 개발하는데 잇점이 있는 오픈소스 도구입니다. 그리고 새해에 Rails 1.0가 나오면서, 더욱 더 나아질 것입니다.

Mac OS X가 Rails 개발을 위한 매력적인 플랙폼이라는 것은 그리 놀라운 일이 아닙니다. Rails과 그것의 지원하는 웹서버 그리고 데이터베이스들은 Mac OS X 환경에서 풍부하게 지원됩니다. 많은 Rails 프로그래머들이 대중적으로 사용하는 텍스트 편집기 TextMate는 Cocoa 응용프로그램입니다. 그리고 Rails 핵심 개발 팀(Rails core development)의 모든 멤버들은 맥으로 작업을 합니다.

여기서는 Ruby on Rails로 당신이 평범한 웹응용프로그램을 단계별로 개발할수 있게 도와줍니다. 혹시 급행 열차로 탈것으로 고려합니까? Rails로 무엇을 할수 있는지, Rails 1.0 의 새로운것들을 본다면 결과적으로 당신은 Rails로 웹응용프로그램을 강화하는 더 나은 이득을 얻을것입니다.

목차

[편집] Why Ruby on Rails?

당신은 의아해 할지도 모릅니다.웹 응용프레임워크는 주위에 흔배빠진 것입니다. 그런데 Rails는 무엇이 다른지? 그 흔한것들중에서 Rails가 그 중에 하나로 꼽게되는 이유가 여기에 있습니다

■ Full-Stack Web Framework.

Rails는 model,view,controller들이 빈틈없이 구현된 완벽한 MVC 웹 프레임워크입니다. 그것은 당신이 다른 사람들과 함께 작업하는데 있어서 자동적으로 각각의 구성요소를 명백히 구성하고, 혼란 없이 MVC 디자인의 모든 이점을 얻는다는 것을 의미합니다.

■ Real-World Usage.

Rails 프레임워크는 실제 real-world 웹응용프로그램들로 부터 추출해 낸것들입니다. 즉, Rails는 진짜의 필요한것들만이 있습니다. 무엇이 필요한지에 대해 예상할 필요도 없습니다. 그 결과는 편리한 사용과 기능성이 풍부한 프레임워크 그리고 동시에 그것은 당신의 선택한 것이 최고의 것이 되게 해줍니다.

■ One Language: Ruby.

비지니스로직에서 설정파일까지 모든것이 Ruby로 작성이 됩니다. 한 언어로, 당신이 원하는 모든 작업을 할수 있습니다. 그리고 Ruby는 실망시키지 않습니다. Ruby는 깔끔한 문법을 한 완전한 객체지향언어이며, 프로그래밍을 즐겁게 해줍니다. 한 언어를 사용함으로써 당신은 다중의 언어와 당신의 응용프로그램 만을 위한 특정 언어를 섞어 쓸 필요가 없음을 뜻합니다.

■ Convention over Configuration.

Rails works hard to take care of all the repetitive and error-prone chores associated with starting to build a web application, and maintaining it over time. Rails는 간략한 명명법과 near-zero 구성상에서 작업이 더욱 쉽게 하기 위해서 reflection을 사용합니다.

■ It's Productive!

At the end of the day, Rails is all about helping you stay productive. And in a world where being the first to market and keeping customers happy adds up to increased revenues for you, it pays to pick a tool aligned with those goals. Many real-world applications are already reaping the benefits.


All that being said, the best way to judge Rails is to experience it while building an application. So let's get right to it...

[편집] Installing Rails

Mac OS X Tiger에 제공되는Ruby의 버전은 1.8.2이지만, Rails만큼 잘 동작하지는 않습니다. 그래서, 당신은 Ruby를 Rails (이글이 쓰여진 시점에 1.8.4버전이 사용되고있습니다.)의 가장 최근 새로운 버전을 설치할 필요가 있을 것입니다. 그리고 어떤 심각한 Rails 개발을 한다면 , production-quality 웹서버, 데이타베이스 서버, 그리고 약간의 새로운 제품들의 설치를 원할것입니다. 고맙게도 , golden-path 설치 안내는 이미 사용가능합니다.

"Building, Ruby, Rails, LightTPD, and MySQL on Tiger".의 단계별 지시를 따라 해 보십시오

Ruby 1.8.4 는 기존 시스템상 설치되어진곳에 덮어 쓰지 않구 (새로운 버전의 설치경로는 /usr/local) 설치되어집니다 그런 식으로, 그 기본적 시스템은 다른 사용자나 시스템상에 설치된 루비 코드로 프로그램 작업을 합니다. 그것은 또한 RubyGems 패키지 메니져, Rails, LightTPD 웹서버 , 그리고 MySQL 데이타베이스 서버를 설치하며, 이 모든것이 우리가 이 듀트리얼에서 사용할 것들입니다. 당신이 이미 Ruby와 RubyGems의 사용가능한 버전이 있다면, 아주 손쉽게 Rails의 새로운 버전으로 갱신할수 있습니다.

$ gem install rails –include-dependencies

마지막으로, 이 튜터리얼을 잘 사용하기 위해서 30일간 사용가능한 TextMate를 다운 받아 설치하기를 권합니다. TextMate는 Mac OS X를 사용하는 Rails 개발자들이 사용하는 대중적인 편집기입니다.

[편집] Creating a New Rails Application

우리는 온라인 지출 추적 응용프로그램을 작성할 것입니다. 당신의 개인적인 예산, 작은 회사, 그룹이나 클럽에 대한 지출을 추적하기 위해 이것을 사용할 수 있습니다. 종이와 와 연필을 이용한 오래된 시스템은 지난달에 폐기 되었고 우리는 모든 사람이 공유할 수 있는 온라인 어플리케이션이 필요로 한다는 결정했습니다.

첫번째, 우리는 어플리케이션을 새로 만들 필요가 있습니다.

모든 Rails 어플리케이션들은 특별히 말할필요가 없을만큼 찾기 쉬운 디렉토리 구조로 구성되어져 있습니다. 타이핑을 통해 우리 지출 어플리케이션을 위한 디렉토리구조와 파일들을 새로 만드십시오.

$ rails expenses	

다음, 새 프로젝트 디렉토리를 열고 TextMate를 타이핑 하십시오

$ mate expenses

Figure 1에 TextMate Project Drawer에서 rails 명령으로 만들어진 디렉토리 구조를 볼수 있습니다.

그림:Using_Ruby_on_Rails_for_Web_Development_on_Mac_OS_X_1.jpg

Figure 1: 어플리케이션 디렉토리구조(TextMate)

이 디렉토리의 구성을 한번 살펴보겠습니다. 먼저, 우리는 어플리케이션을 처음 실행시킬 준비가 되었습니다. 그럼 해당 프로젝트(지출 응용프로그램) 디렉토리로 변경후에 다음과 같이 입력하십시오

$ script/server

위의 명령을 통해 당신의 웹 서버를 구동했습니다. 당신이 LightTPD 웹 서버를 설치되어 있다면, Rails는 기본 설정으로 그것을 사용하기 위해 시도할 것입니다. 이 외에도 WEBrick, pure-Ruby 웹서버등이 사용되어지며, 이러한 웹서버들은 개발목적으로 사용되어집니다.

웹브라우저 상에서 http://localhost:3000을 열어보면 당신이 Rails 사용을 반기는 웹페이지를 볼 수 있습니다.

그것은 우리에게 그 어플리케이션이 실행되고 있다는 것을 보여줍니다. 하지만 그것은 어플리케이션 개발에 아무 도움이 되지 않는 것입니다.

[편집] Jump-Starting the Application

지금, 우리는 그 생성된 디렉토리 구조위에 뼈와 살을 덧붙일 준비가 되었습니다. 궁극적으로, (조만간) 우리는 각계정당 지출을 추적하는 웹인터페이스를 만들기 원할 것입니다. 그 첫단계로 , 우리는 해당 계정과 그것들의 지출내역들을 위해 데이터베이스를 생성시키고 구성하여야 합니다.

Setting Up the Database Rails에 어떤 데이타베이스를 연결하고 하용하기 위해서는 설정파일을 손볼 필요가 있습니다. config/database.yml 파일에서 ,Rails의 세가지 실행환경에 대한 데이터베이스 연결들-development, test, 그리고 production-의 pre-configured를 볼수 있습니다. 우리는 지금 개발을 하고 있고 그래서 config/database.yml 화일의 그 특정 부분을 살펴보겠습니다.

development:
   adapter: mysql
   database: expenses_development
   username: root
   password:
   socket: /tmp/mysql.sock

기본적으로 , Rails는 우리가 개발하고자하는 어플리케이션이 MySQL 데이터베이스 서버를 이용하고, expenses_development 데이터베이스를 사용한다고 가정하겠습니다. 만약 당신의 MySQL의 루트 패스워드가 초기 설정과 다르다면, 실제 사용하고 있는 값을 패스워드 필드에 설정하시고, 당신의 mysqld.sock의 값이 설정값과 사이하다면 실제 경로를 소켓필드에 명확히 입력해 주십시오.

database.yml 파일에는 기본적으로 다른 데이터베이스들과의 연동을 위한 구성 예제들이 포함되어있습니다. 다음의 데이타베이스 서버들은 Rails에 의해 현재 지원되고 있습니다.: MySQL, PostgreSQL, SQLite, SQL Server, DB2, Firebird, 그리고 Oracle

우리는 실제 개발을 위해서 expenses_development 데이타베이스를 생성해야 합니다. 당신이 사용하기 편한 어떠한 도구를 이용하셔도 관계 없습니다. 여기서는 mysqladmin comand-line 도구로 새로운 데이타베이스를 생성시켜 보겠습니다.

$ mysqladmin -u root -p create expenses_development

이후에 생성된 데이터 베이스의 연결성을 검사할 것입니다.

[편집] Creating the Database Schema

우리는 새로운 데이타베이스를 만들었지만, 그것은 아직 어떤 테이블도 가지고 있지 않습니다. 우리는 계정 테이블에 계정을 저장할 필요가 있습니다. 그럼 이것부터 시작해 보겠습니다. 순수 DDL이나 SQL 관리도구를 사용하기도 하지만, 우리는 계정테이블 생성을 위해 Rails migration를 사용할 것입니다.Migrations은 필요하다면 쉽게 다른 데이타베이스 서버와 교환을 할 수 있다는 것을 의미하는 데이타베이스 스키마의 database-agnostic 표현입니다. 오히려 migrations은 우리에게 더 편하게 schema를 생성시켜줍니다.

먼저, Rails migration 생성기를 사용하기위해 migration 을 생성해야 합니다.

$ script/generate migration accounts

위 명령은 비어있는 migration을 정의하는 db/migrate/001_accounts.rb 화일을 새로 만듭니다.

우리는 두 컬럼을 가진 계정 테이블을 만들어 채워야 합니다.: 그 계정을 식별할 수 있는 name(텍스트 스트링)과 예산 (플로트형) 다음과 같이 db/migrate/001_accounts.rb 화일을 갱신하세요.

class Accounts < ActiveRecord::Migration

  def self.up
    create_table :accounts do [table]
      table.column :name, :string
      table.column :budget, :float
    end
  end

  def self.down
    drop_table :accounts
  end
end

우리는 모든 Rails 어플리게이션에서 수행가능한 Rake (Ruby's equivalent of Make)를 사용할 수 있습니다..

$ rake migrate

expenses_development 데이타베이스는 지금 계정테이블을 가지고 있습니다. ("rake migrate"을 수행하는 것은 데이타베이스 연결을 테스트 할수 있습니다. 만약 migration이 실패했다면 아마 당신의 데이타베이스가 적절하게 구성되지 않았기 때문입니다.)

Migrations은 그 반대로도 가능합니다. 예를 들면, 당신이 독자적인 형태의 schema로 옮기기를 원한다면, 'rake migrate VERSION=0'만 수행해 주시면 됩니다.

Putting Up Scaffolding 계정을 저장하기위한 데이터베이스와 스키마를 가지고 있으니까, 이제 계정을 생성해 보겠습니다. scaffolding을 호출하는 Rails 웹 인터페이스를 이용해서 데이타베이스 스키마로 부터 옮기것이 가장 빠른 방법입니다. Scaffolding은 기본적인 CRUD(create,read,update,delete)명령을 제어하는 database-backed 웹어플리케이션의 모델,컨트롤 뷰를 제공해 줍니다.


Unlike tools that generate code that's never intended to be modified by humans, Rails scaffolding is generated with the express intent of encouraging you to tweak it.

And just like scaffolding used to support the construction of a building, gradually the application scaffolding disappears.


타이핑으로 scaffolding을 생성합니다.

$ script/generate scaffold account expenses

위의 명령을 통해 몇가지 파일들이 생성됩니다. 첫번째 매개변수 (account)는 그 모델의 이름을 명시하며, app/models/account.rb로 생성됩니다. 두번째 매개변수 (expenses)는 그 컨트롤러의 이름을 명시하며, app/controllers/expenses_controller.rb로 생성됩니다. scaffold generator 우리가 만들고가 하는 어플리케이션의 뷰의 템플릿 파일들 역시 생성합니다. 잠시후 우리는 이 구성요소들이 어떻게 함께 사용되어지는지 알아볼 것입니다.

scaffolding을 통해 생성된 계정관리를 위한 웹인터페이스 한번 살펴 보겠습니다. 만약 어플리케이션이 아직 구동중이라면 실행중인 터미널 상에서 CTRL-C를 눌러주십시오. 당신이 데이터베이스의 연결을 변경했다면 재기동을 필요로 하며, 어플리케이션의 재시작을 위해 다음을 수행해야 합니다.

$ script/server

웹브라우저상에서 http://localhost:3000/expenses을 보실수 있습니다. 새로운 계정생성을 위해서 웹페이지를 봐야합니다. 계정을 새로 만드세요. 그 "Create" 버튼을 클리하면, 새로운 계정이 계정 리스트상에 보일것입니다. 거기로 부터, 당신은 계정보기,편집 혹은 삭제를 할수 있습니다. Figure 2에서 fund-raising 켐폐인을 위한 계정들의 예제를 수 있습니다

그림:Using_Ruby_on_Rails_for_Web_Development_on_Mac_OS_X_2.jpg

Figure 2: scaffolding을 사용한 계정관리

[편집] Tiptoeing Through the Generated Code

모든 작업은 어떻게 이루어집니까? 대부분의 구성들을 제거하기 위해 코어에서 간단한간 네이밍 컨벤션을 이용합니다. 1이란 아이디를 가지는 계정에 대한 "Show"의 하이퍼링크를 예를 들면 그 링크를 위한 URL은 다음과 같습니다.

http://localhost:3000/expenses/show/1

URL 경로의 첫번째 부분 "expenses"은 들어오는 요청을처리하기 위한 Control의 이름입니다. 두번째 "show"는 "Control"에 의해 정의된 액션의 이름입니다. The last part of the path, 1, is the id (in this case, the database primary key) of the account to be shown. 마지막으로 "1"은 보여지는 그 계정의 아이디입니다. Figure 3 은 MVC 컴포넌트간의 구성과와 파일들과의 연관성을 보여줍니다.


그림:Using_Ruby_on_Rails_for_Web_Development_on_Mac_OS_X_3.jpg

Figure 3: MVC 컴포넌트들과 파일들

위에서 보여진 URL경로의 각 부분들을 경로를 통해서 ExpensesController의 "Show" 함수를 호출하고, HTTP 요청 파라메터의 계정 ID값을 넘겨줍니다.

컨트롤러의 코드는 app/controllers/expenses_controller에서 찾으실수 있습니다.

class ExpensesController < ApplicationController

  def show
    @account = Account.find(params[:id])
  end

  # plus other action methods for creating, reading,
  # updating, and deleting accounts
end

Account 모델 객체는 @account 인스턴스변수에 의해 참조됩니다.(Ruby에서 @심볼로 시작하는 문자열을 인스턴스 변수를 나타냅니다.) Account 모델 클래스는 app/models/account.rb 파일입니다.

class Account < ActiveRecord::Base
end

먼저 살펴보면, 이 클래스에서 아무것도 나타나 있지 않습니다. 하지만, 부모(상위)클래스 ActiveRecord::Base 로 부터 많은 기능들을 이미 상속 받고 있습니다. Account 모델은 데이타베이스에서의 계정 테이블에 대한 접근을 보호하고 있습니다. Account 모델 클래스의 객체는 계정테이블의 행들을 표시해주며,Account 객체의 속성들과 데이블 열들을 연결해 줍니다.

Account모델 객체를 생성시키고, @account 인스턴스 변수로 한당한뒤에 app/views/expenses/show.rhtml에서 템플릿의 show 액션을 찾아 렌더링합니다.

<% for column in Account.content_columns %><br><p><br>$nbsp;$nbsp;<b><%= column.human_name %>:</b> <br>$nbsp;$nbsp;<%=h @account.send(column.name) %><br></p><br><% end %><br><%= link_to 'Edit', :action => 'edit', :id => @account %> |<br><%= link_to 'Back', :action => 'list' %>

그 템플릿은 HTML과 Ruby 코드의 혼합입니다. 사이에 표현들은 Ruby 코드인지되고, 그 결과는 그 표현들로 교체됩니다. show 템플릿은 show 액션이 지정된 컨트롤러의 인스턴스변수 @account 접근하는것을 알수 있습니다. show 템플릿은 @account 객체의 컬럼이름과 연관된 속성을 간단하게 보여줍니다. 하이퍼 링크의 편집과 액션의 리스트들은 내장된 link_to 헬퍼를 사용해서 생성합니다. 그 결과로 웹 view는 Figure 4와 같이 보여집니다.

그림:Using_Ruby_on_Rails_for_Web_Development_on_Mac_OS_X_4.jpg

Figure 4: 'show' 액션 렌더러와 'show' 템플릿

다시, 이 템플릿들은 시각적인 인터페이스를 출력하지 않습니다, 하지만 은 가장 시각적으로 간청하는 그 인터페이스를 출력하지 않습니다. 그러나 그것은 당신의 그 연결을 변경하기에는 충분합니다.

그림:Using_Ruby_on_Rails_for_Web_Development_on_Mac_OS_X_5.jpg

그림:Using_Ruby_on_Rails_for_Web_Development_on_Mac_OS_X_6.jpg

그림:Using_Ruby_on_Rails_for_Web_Development_on_Mac_OS_X_7.jpg

그림:Using_Ruby_on_Rails_for_Web_Development_on_Mac_OS_X_8.jpg