레일스 따라하기 1

Posted by 大山 Fri, 28 Jul 2006 08:08:00 GMT

[참고: 레일스 튜토리얼을 몇 번에 나누어서 연재하려고 합니다. 특정 주제에 대한 요청이 있으면 반영을 할 예정이니 피드백 바랍니다. 이 작업은 서민구님의 제안으로 시작되었습니다.]

레일스는 루비로 만들어진 웹개발 프레임워크이다. 루비만의 강력함과 몇 가지 획기적인 아이디어로 인해 레일스에서의 웹 개발은 정말로 편리하다. 여기서는 루비와 레일스를 설치하고, 간단한 전화번호부 애플리케이션을 만들어 보면서 레일스의 강력함을 직접 경험해 보기로 한다.

레일스로 개발을 하려면 우선 루비를 설치해야 한다. 윈도우에서 루비를 설치할 때 반드시 'Enable RubyGems' 옵션을 선택해서 루비젬도 같이 설치하도록 한다. (맥 OS X나 리눅스 사용자라면 이곳에서 루비젬을 다운로드 받아 별도로 설치해야 한다.)

루비젬은 루비의 각종 라이브러리를 쉽게 설치하고 관리하게 해주는 유틸리티 프로그램이다. 루비와 루비젬의 설치가 끝나면, 명령 프롬프트(DOS) 창에 다음을 입력한다. (맥 OS X나 리눅스에서는 sudo를 사용해야 한다.)

c:\> gem install rails --include-dependencies
 

레일스와 레일스가 필요로 하는 몇가지 라이브러리가 설치되는 과정이 보여질 것이다. 다음에는 데이터베이스 프로그램을 설치할 차례이다. 이곳에서 MySQL 5.0을 다운로드 받아 설치한다.

MySQL Command Line Client로 데이터베이스에 접속해서 이번 전화번호부 프로젝트를 위한 phonebook 데이터베이스를 만든다.

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.27-standard

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database phonebook default charset utf8;
Query OK, 1 row affected (0.00 sec)
 

다음에는 인명정보를 담을 people이란 이름을 가진 테이블을 만든다.

mysql> use phonebook;
mysql> create table people (
mysql>   id int auto_increment primary key,
mysql>   name varchar(20),
mysql>   phone_number varchar(20),
mysql>   note text
mysql> );
Query OK, 0 rows affected (0.03 sec)
 

이제 레일스 애플리케이션을 만들 차례이다. 프로젝트를 위한 폴더를 하나 만들어야 하는데, 레일스에서는 새로운 프로젝트의 폴더 구조를 자동으로 생성해주는 rails란 이름의 유틸리티 프로그램이 있다. 다음을 실행해 보자.

c:\>rails phonebook
      create  
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      create  components
      create  db
        .        .
        .        .
 

꽤나 많은 서브 폴더와 파일이 생성되는 것이 보일 것이다. 여기서는 핵심적인 몇개의 폴더만 설명하고 넘어간다.

  • app: 대부분의 애플리케이션 코드가 들어갈 폴더
  • config: 애플리케이션의 각종 설정 파일이 들어 있는 폴더
  • public: 이미지, 자바스크립트, CSS 파일 등이 저장되는 폴더로 웹 애플리케이션의 루트에 해당됨
  • script: 웹 애플리케이션을 개발을 편리하게 해주는 각종 스크립트가 들어있는 폴더

이제 초기 상태의 레일스 애플리케이션을 한 번 구동해 보자.

c:\> cd phonebook
c:\phonebook> ruby script/server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
 

웹 브라우저에서 주소창에 'http://127.0.0.1:3000/'을 입력하면, 다음과 같은 화면이 나올 것이다.

레일스 애플리케이션이 잘 작동되는 것을 확인했으면, Ctrl-C를 눌러 서버를 종료시킨다.

이제는 우리의 새 레일스 애플리케이션이 MySQL 데이터베이스에 접근할 수 있도록 설정을 할 차례이다. 'config/database.yml' 파일을 열고, 'development:' 섹션에 다음과 같이 입력한다.

development:
  adapter: mysql
  database: phonebook
  username: root
  password: your_mysql_password
  host: localhost
  encoding: utf8
 

'test:'와 'production:' 부분의 설정은 아직 신경쓰지 않아도 된다. 이제 우리의 애플리케이션은 DB 연결이 필요할때 마다 이 설정을 이용해서 자동으로 DB에 접속하게 된다.

이번에는 DB의 people 테이블을 객체 레벨에서 접근할 수 있게 해주는 모델 클래스를 생성해보자.

c:\phonebook> ruby script/generate model Person
 

여러가지 파일이 생성되는게 보이는데, 지금 시점에서는 개별 파일에 신경을 쓸 필요는 없다.

이번에는 사용자가 웹 브라우저를 통해 우리의 전화번호부 애플리케이션에 접근했을때 이를 처리해줄 컨트롤러 클래스를 생성한다.

c:\phonebook> ruby script/generate controller PhoneBook
 

이번에도 여러 파일이 생성되는데, 'app/controllers/phonebookcontroller.rb' 파일이 가장 중요하다. 이 파일에는 PhoneBook 컨트롤러 클래스가 정의되어 있는데, 바로 이곳에서 웹 브라우저와 애플리케이션간의 교신이 일어나게 된다.

마지막으로 'app/controllers/phonebookcontroller.rb' 파일을 열어 'scaffold :person' 라인을 추가한다.

class PhoneBookController < ApplicationController
  scaffold :person
end
 

이제 우리가 만든 애플리케이션을 한 번 사용해 보도록 하자. 다시 명령 프롬프트 창에서 'ruby script/server'이라고 입력해서 웹서버를 시작한 다음, 웹 브라우저의 주소창에 'http://127.0.0.1:3000/phone_book/'이라고 입력한다.

'New person' 링크를 눌러 사람을 추가할 수 있다.

정보가 입력된 후에는 열람, 수정 및 삭제가 가능하다.

이로써 간단한 전화번호부 애플리케이션을 만드는 작업이 모두 끝났다. 세부적으로 궁금한 사항은 답글로 질문 바람!

업데이트(07/3/15): 레일스 1.2에 맞게 튜토리얼 내용을 수정합니다. (기본적으로 'app/controllers/application.rb' 파일에서 수동으로 UTF-8 인코딩 설정을 해주던 부분이 빠졌습니다.)

Posted in  | Tags , ,  | 24 comments | 2 trackbacks

Comments

  1. 1.
    codian said about 6 hours later:

    안녕하세요. :)

    PersonBookController 클래스에 scaffold :person 까지 입력하고서 페이지(http://127.0.0.1:3000/phone_book)을 열어보면 다음과 같은 오류(500)가 발생합니다.

    ActiveRecord::StatementInvalid in Phone bookController#index SQLite3::SQLException: unsupported file format: PRAGMA table_info(people)

    환경은 아래와 같습니다.
    rails 1.1.4
    sqlite3-ruby 1.1.0
    sqlite3 3.3.5
    osx 10.4.7

    ps) 웹2.0 비즈니스 워크샾에서 물어 봤던 그 내용입니다. 구글에서 열심히 찾아봤지만 해결책을 못찾고 있습니다.


  2. 2.
    서민구 said about 7 hours later:

    대단하십니다;;;;


  3. 3.
    大山 said about 7 hours later:

    @codian: 음, SQLite은 버젼마다 파일 포맷 호환이 안되는 경우가 많은 걸로 알고 있습니다. 에러 메세지는 파일 포맷이 안맞다는 내용이네요. 제 생각엔 SQLite3를 최신 버전인 3.3.6으로 업그레이드 해보시는 게 어떨까 싶습니다. 어쩌면 sqlite3-ruby 1.1.0과 SQLite 3.3.5가 서로 호환이 안되는 문제일 수 있을 것 같거든요.

    @서민구: 뭘요~ ^^;; 전 민구님의 루비 메타프로그래밍편이 정말 기대됩니다~~


  4. 4.
    wookay said about 17 hours later:

    좋은 글 감사합니다. ^^


  5. 5.
    大山 said about 17 hours later:

    @wookay: 링크 걸어 주셔서 감사합니다~ ^^


  6. 6.
    정목 said 1 day later:

    와우~ 좋은글 감사합니다 .^-^

    조금 첨언을 하자면, DB를 만들때 직접 SQL문으로 만들기 보다는 migration을 사용하는 것이 작성하기도 쉽고 관리하기도 편리합니다.

    그리고, database.yml 파일에 encoding: utf8 이라고 첨가해주면 header를 따로 처리하지 않으셔도 됩니다. encoding 옵션을 사용할 경우 DB 연결시 "SET NAMES UTF8" 퀴리를 보내주기 때문에 한글을 latin1 인코딩으로 넣어버리는 우를 피할 수 있다는 장점이 있습니다. 더욱이 truncate 명령어를 사용할 경우 한글 등의 multibyte 문자에서 깨지는 경우가 생기는 것을 막아줍니다. ^-^


  7. 7.
    大山 said 1 day later:

    @정목: 답글 감사합니다~

    저도 Migration 팬입니다~ ^^ 레일스가 편리하긴 한데, 새로운 개념이 조금 많아서 처음 시작하는 사람이 기능을 다 소화하긴 무리일 것 같아서요. Migration을 설명하려면, 루비 코드도 많이 보여야 하고 rake도 소개해야 하고, 등등. 차차 후속편에서 다루도록 하겠습니다~ :)

    인코딩 부분은 조금 착각하신 것 같습니다. database.yml 파일에서의 encoding 옵션은 레일스와 MySQL간의 연결에서만 사용됩니다.

    위에서 'app/controllers/application.rb'에 삽입된 코드는 HTTP 헤더의 인코딩을 지정해주는 목적입니다. 브라우저에게 전송된 HTML 문서의 인코딩을 알려 주는 목적이죠. (PHP에서는 HTTP 헤더를 직접 손대지 못하기 때문에 보통 HTML에서 메타 태그를 사용하여 해결합니다.) 양쪽에서 모두 설정을 해주어야 합니다~


  8. 8.
    이삼구 said 1 day later:

    레일즈 온 루비라는 놈은 매우 직관적이로군요. IIS에 세팅이 가능하다면, 바로 작업해 보고 싶네요.

    그런데, 스크린샷으로 보면 맥을 쓰시는 것 같네요. 아니면 맥 테마?


  9. 9.
    大山 said 1 day later:

    @이삼구: 바로 보셨습니다. 레일스도 루비도 상당히 직관적입니다. 개발자의 사랑을 받는 이유가 있죠~ :)

    위에서 설명한데로 'ruby script/server'라고만 입력하면, 포트 3000번에 루비로 만들어진 웹서버인 webrick이 돌아갑니다. 프로덕션으로 쓰기엔 무리겠지만, 개발용으로는 충분한 녀석입니다. 따로 IIS나 아파치를 돌리지 않아도 됩니다.

    옙, 2002년 스위처입니다~


  10. 10.
    정목 said 2 days later:

    앗~ 인코딩 부분은 제가 착각했군요. wiki.rubyonrails.org에서 유니코드 문자열을 다루는 것에 관한 페이지를 보다가 예문을 잘못 보고 착각하고 있었습니다. 당시에는 '오오~ DB만 인코딩을 잡아주면 다 알아서 해주는 군~ 참 직관적인걸?' 이러고 있었는데 말이죠. ㅎㅎ

    좀 쉽게 한글 환경을 잡아주는 방법이 있는지 한번 다시 찾아봐야겠습니다.


  11. 11.
    大山 said 2 days later:

    @정목: 인코딩 이슈는 어디서나 복잡한 것 같습니다. ^^ 그래도 UTF-8을 지원하기엔 레일스가 자바나 PHP 보다는 훨씬 더 편리하지요~


  12. 12.
    yser said about 1 month later:

    루비는 파이썬과 함께 매력적이라 관심만 조금 가졌지만 지금 당장 쓸 필요성을 느끼지 못하여 배우지 않았군요. 제게 당장 필요한 지식이라면 c++ 과 비주얼 스튜디오 사용법입니다. ^^

    p.s

    PHP에서는 HTTP 헤더를 직접 손대지 못하기 때문에 보통 HTML에서 메타 태그를 사용하여 해결합니다.

    php에서는 header('Content-Type: text/html; charset=utf-8'); 로 헤더를 지정할 수 있습니다. 저 함수를 이용해서 브라우저로 보내는 헤더를 손댈 수 있습니다.


  13. 13.
    大山 said about 1 month later:

    @yser: 루비는 꼭 필요해서가 아니더라도, 한번 익혀두면 의외로 쓸모가 많답니다~

    아, header 함수가 있었군요. 다들 메타태그를 사용하길래 헤더 변경을 못한다고 생각했네요. ^^;;


  14. 14.
    deidritlove said about 1 month later:

    오늘 첨 와봤는데.. 오호 이런 것일 줄이야 지금 데모 끝네고 감동중입니다.. 엄청 강력하네요.. 이번에 프로젝트 하나 하는데 Ajax로 웹툴 하나 만들려고 하거든요.. 여기저기 뒤적이다보니까 외국 유명 사이트들이 요즘 루비를 기반으로 Ajax를 추가 하더라고요.. 그래서 이게 뭐지 하고 링크 따라들어와서 들왔는데.. 덧글을 읽어보니 대단하다라는 생각뿐.. 좀 깊이있게 알고 싶은데 좋은 싸이트나 책 추천해주시면 감사히 읽겠습니다~ ㅋ~ 수고 하세요..


  15. 15.
    大山 said about 1 month later:

    @deidritlove: 아직은 레일스와 관련한 한글 자료가 많이 부족한 상황입니다. 영문 자료는 구글에서 검색하시면 될 것 같구요. 연말쯤에는 국내에서도 책이 몇 권 나올 것 같습니다만.. ;)


  16. 16.
    이진석 said 3 months later:

    발표하신 동영상/자료를 보면서, 직접 실습해보고 있습니다. 우선 노고에 감사드립니다. ;)

    처음부터 난관에 부딪혔네요.

    발표자료의 24페이지의 "rake migrate"명령이 계속 실패합니다. ;-( 구글링해보니 db설정이 틀리면 저런 에러가 뜬다고 하는데, db설정에는 이상이 없어 보입니다.

    rake aborted! No such file or directory - /tmp/mysql.sock (See full trace by running task with --trace)

    도움 부탁드립니다. ㅠ_ㅠ


  17. 17.
    이진석 said 3 months later:

    부끄럽군요. gem install mysql 한방으로 드라이버를 깔아줘야 하는 것을 ;-(

    앞으로도 좋은 글 부탁드립니다. ^^)m


  18. 18.
    大山 said 3 months later:

    @이진석: 도움이 되셨다니 다행이네요. :)


  19. 19.
    bamchi said 4 months later:

    database.yml을 편집하고나서 WEBrick(ruby script/server)을 다시 한번 실행해줘야 정상적으로 페이지가 열리네요. 작은 부분이지만 초보분들에게 도움이 될까 해서 적어봅니다.^^;


  20. 20.
    大山 said 4 months later:

    @bamchi: 본문에서 WEBrick을 다시 실행해주고 있습니다만, 아마도 인과관계가 불명확했나 봅니다. 꼼꼼한 지적 감사합니다. :)


  21. 21.
    우유니 said 5 months later:

    안녕하세요.

    최근 루비에 관심이 생겨서 대산님의 블로그에서 좋은 글을 보고 있는 우유니입니다.

    레일스 따라하기 1 까지는 잼있게 따라했는데...

    레일스 따라하기 2편은 언제쯤 나오게 되나요?

    그리고 질문 하나 있습니다. 저렇게 만든 전화번호부를 수정하려면 어디를 수정해야 하나요? app/views/layouts app/views/phone_book 폴더 두 곳을 봐도 view파일이 안보여서요.

    그럼 새해복 많이 받으십시오.


  22. 22.
    大山 said 5 months later:

    @우유니: 이 튜토리얼에서 사용한 방법은 동적 스캐폴딩이라고 해서, 실제로 view 파일이 생성되지는 않습니다. view 파일이 생성되게 하려면, 위의 방법 대신에 스캐폴딩 generator를 사용하는 방법이 있습니다.

    위에서 모델 및 컨트롤러 파일을 생성하기 전단계에서 다음을 입력하시면 됩니다.

    c:\phonebook>ruby script/generate scaffold Person PhoneBook

    스캐폴딩 generator를 사용하면, 컨트롤러 파일에 추가된 액션 메소드와 view 파일 등을 직접 살펴볼 수 있습니다. (최종 결과물은 같지만, 이제 파일을 수정하는 것도 가능하지요.)

    레일스 따라하기 2편은 이번달 중에는 써보려고 합니다. :)


  23. 23.
    SG said 8 months later:

    안녕하세요? 이 튜터에서 적어도 테이블을 지정하는 구문이 보이지 않네요? 어디에서 지정이 된 것인가요? 그리고 어떤 원리로 이런 것이 가능한 것 입니까?


  24. 24.
    大山 said 8 months later:

    @SG: 여기에서는 Person 모델을 사용하고 있는데, Person 모델은 자신이 "people" 테이블에 매핑되고 있다는 것을 압니다. 바로 Person의 복수형이 people이기 때문이죠. 레일스에서는 이러한 관례를 활용하여 설정을 상당 부분 줄여주고 있습니다.

    질문하신 원리는 루비라는 언어의 동적 특성때문에 가능하다고 말씀드릴 수 있겠네요. 제가 이전에 쓴 글을 참고하세요~


Trackbacks

Use the following link to trackback from your own site:
http://beyond.daesan.com/articles/trackback/551

  1. From
    Ruby Tutorial: Keeping you posted
    레일스 따라하기 1 대산님이 rails를 작성하고 계십니다. 1편을 끝내셨네요. 음 저에게도 3편 메타프로그래밍 작성의 압박이 오는군요;; 그런데 메타프로그래밍은 매번 봐도봐도 잊어버리
  2. From
    누구나 만들어보는 Rails 데모
    버전이 좀 오래되었지만 예전에 만들어둔 게 있어서 주소를 남깁니다. http://nohmad.sub-port.net/tmp/rails-demo/

Comments are disabled