2008. 5. 28. 05:51

Ruby on Rails

프로그래밍/Ruby 2008. 5. 28. 05:51
정말 간만에 쓰는 포스팅이다 -_-;

최근 한동안 말려서 숙제고 시험공부고 예습복습이고 다 때려치고 삽질에 삽질을 거듭했던 Ruby on Rails에 대해 간단하게 포스팅해보려고 한다.

개인적으로 두 개의 사이트를 RoR로 만들어보았다.

이 때 정말 뼈저리게 느꼈던 것이... RoR에 대한 단편적인 정보나 사전적 정의가 실린 곳은 많지만, 실제로 처음 접하는 사람이 할 수 있는 정보가 실린 곳은 거의 전무했다. 그래서, 여기다가 쓸 RoR관련 글은 내가 실제로 만들어봤던 두 개의 홈페이지를 만들면서 느꼈던 것에 대해서 쓸 것 같다.

  1. Ruby on Rails란?
    사실, 이 파트에는 뭘 써도 도움이 되지 않는다. 가장 완벽하고 가장 정확한 정의는 여기저기를 다녀보면 쏟아져 나올 것이다 -_-;
    그런 의미에서, 여기다가는 간단하게 몇 마디만 적는 것으로 하겠다.
    일단 Ruby는 프로그래밍 언어이고, Rails는 홈페이지 프레임워크이다. 그리고 Rails는 DB에 레코드를 추가, 수정, 삭제, 조회하는 홈페이지를 만들 때 최적화되어 있는, 그리고 Model-View-Controller 구조를 가진 프레임워크이다. 실제로, 간단한 BBS를 만들 생각이라면 ”마치 Zeroboard 등과 같은 게시판 프로그램을 가지고 홈페이지를 만드는 듯한 기분으로” 만들 수도 있다.

  2. Ruby on Rails의 준비
    일단 루비에서 돌아가는 레일스라는 단어 그대로, Ruby와 Rails를 모두 설치해 줄 필요가 있다.
    공식 홈페이지(Ruby: http://www.ruby-lang.org/ko/, Ruby on Rails: http://www.rubyonrails.org/)에서 다운받을 수도 있고, ubuntu와 같은 Debian 계열이라면 apt-get install ruby, apt-get install rails로 설치할 수 있을 것이다. 그리고 루비 쓸 때 자주 필요하게될 gem도 같이 깔면 좋을 것이다.

  3. Ruby on Rails 시작
    적당한 디렉토리로 이동한 뒤 rails 사이트-이름 을 수행하게 되면 rails 사이트가 생기게 된다. 그리고 무언가 알 수 없는 목록이 주룩주룩 지나가는데, 이것은 rails 사이트에 필수적인 골격 파일들을 생성하는 과정이다.
    생성이 끝났으면 앞서 지정했던 사이트 이름과 동일한 이름의 디렉토리가 생겨 있다. 테스트를 위해서는 그 안에 들어 있는 script/server 를 실행하면 된다. 단, 이 경우에는 리스닝 소켓이 127.0.0.1에 바인드되는 것인지, 로컬에서는 접속이 가능하지만 외부에서는 접속이 불가능해 귀찮아진다. 그렇다고 아파치를 쓰기에는, 써 보면 알겠지만 정상적으로 서비스하기엔 너무 느리다.
    그래서, 조금 이르지만 mongrel을 설치해준다. 우분투의 경우 apt-get install mongrel로 설치가 가능하다. 관리자 권한으로 사이트 디렉토리에서 다음과 같이 타이핑해준다.
    $ mongrel_rails start -e development -d -p 원하는-포트
    일단은 개발버전으로 실행을 시켜준다. 이렇게 하면 상당히 빠른 속도로 돌아가는 rails를 볼 수 있다. 단지 단점은, 새로운 컨트롤러나 모델을 추가시켰을 경우 갱신이 되지 않는다는 문제가 있긴 하지만, 이건 서버를 재시작해줌으로써 해결이 가능하다.

    이제 서버로 접속해 보면 다음과 같은 화면을 볼 수 있을 것이다.
    사용자 삽입 이미지

  4. 디렉토리 구조
    site/
    • app/ - 이 아래에 실제 프로그램들이 들어간다.
      • controllers/ - 액션 컨트롤러 객체들이 들어간다. (Controller에 해당)
      • helpers/ - 액션 헬퍼 객체들이 들어간다. (View에 해당)
      • models/ - 액티브 레코드 객체들이 들어간다. (Model에 해당)
      • views/ - 액션 뷰의 스킨? 비슷한 파일들이 들어간다. (View에 해당)
    • config/ - 이 아래에는 rails 어플리케이션의 설정들이 들어있다.
      • database.yml - DB에 대한 설정들이 들어있다.
      • routes.rb - rewrite rule 비슷한 것이 들어가 있다. 즉, request 받은 주소를 어떻게 분석해서 controller에게 넘겨줄지를 결정한다.
    • db/ - migration과 현재 db scheme이 들어간다.
      • migrate/ - migration들이 들어간다.
      • scheme.rb - 아마도 migration을 통해 변경된 db scheme이 저장되는 듯하다.
    • log/ - 각종 로그가 들어간다.
    • public/ - 웹사이트의 root가 된다. 기본적으로 여기에 파일이 있으면 ActiveController는 호출되지 않는다. ActiveController를 통하지 않고 직접 파일을 내려받는다면 이쪽에 올려서 받게 하면 된다.
    • script/ - 여러가지 스크립트가 들어있다.
      • console - 콘솔 모드에서 rails 어플이 돌아간다. 쉽게 말해, 열심히 만들어놓은 액션 컨트롤러, 헬퍼, 액티브 레코드 등의 객체를 테스트해볼 수 있는 콘솔을 띄워준다.
      • destroy - 생성시킨 controller, view, model, scaffold, migration 등을 제거할 수 있다.
      • generate - controller, view, model, scaffold, migration 등을 생성할 수 있다.
      • server - 테스트용 WEBrick 서버를 실행시킬 수 있다.
    다른 부분은 사실 별 알 필요가 없는듯하다.
  5. MVC 소개
    • ActionController
      • 기본적으로 rails 어플리케이션에 속한 각각의 홈페이지는 이 ActionController와 연결이 되어 있다. 일정한 URL을 request하면 그 URL을 파싱하여 해당하는 ActionController의 action method를 호출한다. 보통은 다음과 같은 URL을 요청했을때
        http://www.example.com:3000/aaa/bbb/n
        rails는 app/controllers/aaa_controller.rb의 AaaController 클래스의 bbb method를 실행시킨다. 그리고 params 배열에 :id => n 쌍을 추가시켜준다. n이 생략된 경우는 이 쌍이 추가되지 않고 bbb가 생략된 경우 index인 것으로 한다. aaa까지도 생략하려면 routes.rb 파일을 수정해주면 된다.
    • ActionView
      • action method를 수행시킨 다음에 app/views/aaa/bbb.html.erb (Rails 2.0.2 기준. 예전 버전은 bbb.rhtml 이었던 것 같음) 파일을 처리해서 클라이언트에 돌려준다. 이 부분이 ActionView와 관련이 있다.
      • 이 녀석은 딱히 상속받는 객체는 없는 것 같다. 실제로도, helpers와 views에 있는 파일들이 관여하긴 하지만 ActionView 클래스를 직접 건드리지는 않는다.
      • include를 통해 helpers에 있는 매칭되는 모듈을 삽입하는듯하다. 그 덕분에 views에 있는 html.erb 파일에는 로직을 하나도 넣을 필요가 없다. 애초에 그렇게 디자인 되어있기도 하고.
      • erb 모듈을 이용해서 처리하는 듯 하지만 확인해보지 않았다. 아마도 확실할 것이다. 확장자가 그모양이니...
    • ActiveRecord
      • 굉장히 편리한 녀석이다.
      • 상속받은 클래스의 이름의 복수형과 같은 이름의 테이블과 연관된다. 일단 모두 소문자로 되는 것으로 보아, 낙타등 표기법에서 소문자와 언더바로 바뀌는듯하다.
      • 새로운 레코드를 만들 때는 레코드 객체를 생성한 뒤 save 메소드를 실행시키는 것으로 DB에 등록할 수 있다.
      • 레코드를 조회할 때에는 find 메소드를 정적으로 불러주면 된다. :all를 패러미터로 넣으면 모든 레코드가 조회되고 :first를 넣게 되면 첫 번째 하나의 레코드만 조회되어 배열이 아닌 상태로 넘겨진다.
      • 레코드를 업데이트 할 때에는 find나 new로 얻어진 레코드에 적절한 처리를 한 뒤 save를 호출하면 된다.
      • 레코드 내부의 각 컬럼에 접근하고 싶으면 그 컬럼 이름의 멤버변수에 접근하듯이 해주면 된다.
      • 각 레코드간 소유 관계를 설정해 줄 수 있다. has_one, has_many, belongs_to 이 세 가지로 처리가 가능하다.
아마 이 정도만 보면, ruby를 할 수 있는 사람이라는 가정 하에 간단하게 분석해 보는 것 정도는 가능할 것이다. 다음에 시간 나면 좀 더 자세히 써서 올려보겠다:)

'프로그래밍 > Ruby' 카테고리의 다른 글

Ruby-GNOME2 0.18 One-Click Installer for Windows  (0) 2009.10.20
rubyscript2exe 로 ruby-gnome2를 이용한 어플 패킹하기  (0) 2009.02.02
GMemRB 공개  (0) 2009.02.01
Ruby-GD2 in WIN32  (0) 2008.12.23
Ruby-GNOME2  (0) 2008.12.09
Ruby on Rails  (0) 2008.05.28