1. 어플리케이션 생성

아래와 같이 rails를 실행하여 루비온레일즈 어플리케이션을 생성할 수 있습니다.

rails application_name (-d database)

  • application_name: 생성될 어플리케이션이름(패스)입니다. 상위 디렉토리의 생성이 필여하면 자동으로 생성합니다.
  • -d database: 사용할 데이터베이스를 설정합니다. 입력하지 않으면 sqlite3가 기본 데이터베이스로 설정합니다.
이제 서버의 적당한 패스에서 아래와 같이 입력하여 www란 어플리케이션을 생성합니다. 실행되면 새로 생성되는 디렉토리와 파일들의 목록이 출력됩니다.

> rails www -d mysql

완료되면 어플리케이션이 생성된 디렉토리로 들어 갑니다. 아래와 같이 파일과 디렉토리들이 생성되어 있습니다.
 

README 파일에는 레일즈 어플리케여션에 대한 소개와 전반적인 사용방법에 대한 간단한 설명이 있습니다. 처음 사용하시는 분들은 한번씩 읽어 보시는 것이 좋습니다.


2. Rails 프레임워크 디렉토리 구조
생성된 각각의 디렉토리는 아래의 용도로 사용됩니다. 아래의 내용들은 위의 README 파일과 아주 잠깐 살펴 보았던 경험을 참조하였습니다.

[?] 로 되어 있는 부분은 아직 한번도 살펴 본적이 없어 용도를 정확히 모르는 곳입니다. 부족하고 틀린 내용들은 조금씩 해 보고 배우면서 계속 보완해 나가고 [?] 를 제거해 나가겠습니다.

/app
어플리케이션의 model, view, controller가 위치하는 폴더 입니다. 사용자가 작성하는 대부분의 코드는 이곳에 위치합니다.

/controller

컨트롤러들이 위치하는 곳 입니다. 컨트롤은 ApplicationController의 서브클래스이며 *_controller.rb와 같은 파일명으로 저장됩니다.

/helpers [?]
핼퍼들이 위치하는 곳입니다. 핼퍼들은 *_helper.rb와 같은 파일명으로 저장되어 있습니다. 핼퍼는 아직 정확한 용도를 모르며 존재여부와 뷰와 연관이 있다고 짐작만 하고 있습니다.

/models
모델들이 위치하는 곳입니다. 모델은 대부분 ActiveRecord의 서브클래스이며, 데이터베이스와 연동하여 데이터에 접근하고 관리하는 역활을 합니다.

/views

HTML 출력을 위한 템플릿 파일들이 위치하는 곳입니다. 각각의 템플릿 파일들은 views 밑에 연관된 컨트롤러 이름으로 된 서브 디텍토리에 위치하며, *html.erb와 같은 파일명으로 저장됩니다.

/layouts

뷰에서 사용하는 header, footer등의 일반적인 레이아웃 템플릿 파일들이 위치하는 곳입니다.

/config

Rails 환경하의 속성, 라우팅, 데이터베이스, 배포등의 설정에 관한 파일들이 위치합니다.

/environments
[?]
배포모드에 따른 설정 파일들이 위치해 있는 것 같습니다.

/initializers
[?]
초기 설정들이 위치해 있는 것 같습니다.

/db
DB 테이블을 생성하는 schema.rb가 위치하는 곳입니다.

/migrate

DB 스키마의 모든 마이그레이션 정보를 가진 파일들이 위치하는 곳입니다.

/doc
[?]
자동으로 생성되는 문서들이 위치하는 곳 같습니다.

/lib
내부적으로 사용되는 라이브러리들이 위치하는 곳이며, 실행시에 기본으로 path내에 포함되어 있습니다.

/tasks
[?]

/log
실행로그들이 위치하는 곳입니다.

/public
document root에 해당하는 웹환경에서 기본이 되는 폴더 입니다. 사이트의 일반적인 구성요소인 html, javascript, stylesheet, 이미지 파일들이 위치합니다.

/images

사용하는 이미지들이 위치하는 곳입니다.

/javascripts

자바스크립트파일(*.js)들이 위치하는 곳입니다.

/stylesheets

스타일쉬트파일(*.css)들이 위치하는 곳입니다.

/script
rails 프레임워크에서 사용하는 각종 스크립트들이 위치하는 곳입니다.

/performance
[?]
성능측정 도구들이 위치하는 곳 같습니다.

/process
[?]
프로세서들을 관리하는 도구들이 위치하는 곳 같습니다.

/test [?]
유닛, 기능, 통합 테스트등에서 사용되는 곳 같습니다.

/fixtures
[?]
·····················

/functional
[?]
기능 테스트시 사용되는 곳 같습니다.

/intergration
[?]
통합 테스트시 사용되는 곳 같습니다.

/unit
[?]
유닛 테스트시 사용되는 곳 같습니다.

/tmp [?]
레일즈에서 사용하는 임시파일들이 저장되는 곳입니다. 아직 어떤 용도로 사용되는지 확인하지 못했습니다.

/cache
[?]
캐쉬가 저장되는 곳 같습니다.

/pids
[?]
프로세스아이디와 관계된 곳 같습니다.

/sessions
[?]
세션이 저장되는 곳 같습니다.

/sockets
[?]
소켓에서 사용하는 곳 같습니다.

/vendor
어플리케이션에서 사용하는 외부 라이브러리 위치하는 곳입니다.

/plugins
[?]
플러그인이 위치하는 곳 같습니다.

부실한 내용과 곳곳에 위치한 [?] 를 보시면 현재 저의 상태(?)와 많은 관심과 애정이 필요하다는 것을 아실 수 있습니다. 많은 지도 부탁 드리겠습니다. ^^;;

'기타' 카테고리의 다른 글

구글 안드로이드 소스 공개와 마켓 오픈  (2) 2008.10.23
3. Rails 어플리케이션 기본 설정  (4) 2008.10.21
1. Ruby on Rails 설치 및 설정  (4) 2008.10.15
아이팟 터치 2세대  (8) 2008.10.10
OS X 루트계정 활성화  (6) 2008.10.08
AND

Ruby on Rails로 회사 홈페이지를 만들어 보기로 했습니다. Ruby는 몇가지 예제만 만들어 보았고 Rails 역시 간단한 샘플만 따라 해 본 정도입니다.

현재 'rails www'로 프로젝트를 만들어 놓고 관망중인 상태입니다. 실질적으로 만들어 볼려고 하니 경험이 없어 막히는 부분도 많고 진도가 잘 나가지 않네요.

주위에 편하게 물어 볼 사람도 없고 혼자서 계속 삽질만 하고 있습니다. 잘 쓰시는 분들로 부터 지도편달도 받고 배워가는 것을 정리도 하고 동기부여도 할겸 공개적으로 삽질과정을 블로그에 올릴려고 합니다.

제가 설치한 환경은 아래와 같습니다.

  • 리눅스(CentOS 5)
  • Apache 2
  • MySQL 5

아래의 관련 사이트들에서 자료와 문서들을 구할 수 있습니다.


필요한 설치 파일들은 루비온레일즈 다운로드 페이지에 소개되고 링크되어 있습니다. 아래의 방법외에 사용하시는 리눅스 배포본예 따라 yum이나 apt-get을 이용하여 간편하게 설치할 수 있습니다.


1. ruby 설치
루비의 다운로드 페이지에서 최신버젼을 다운로드 받습니다. 현재 안정된 최신 버젼은 1.8.7입니다.

1) 설치
> wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p22.tar.bz2
> tar -xvjf ruby-1.8.7-p22.tar.bz2
> cd ruby-1.8.7-p22
> ./configure
> make
> make test
> make install

2) 확인
쉘상에서 irb를 실행하여 확인할 수 있습니다. irb는 대화형 루비쉘입니다.

> irb
irb> puts "hello"
hello
=> nil
irb> quit


2. RubyGems 설치
RubyGems는 루비 패키지 관리툴입니다. RubyGmes로 루비 프로그램이나 라이브러리등을 손쉽게 설치할 수 있습니다.

> wget http://rubyforge.org/frs/download.php/43985/rubygems-1.3.0.tgz
> tar -xvzf rubygems-1.3.0.tgz
> cd rubygems-1.3.0
> ruby setup.rb


3. Rails 설치
Rails는 위에 설치한 RubyGems로 아래와 같이 간편하게 설치할 수 있습니다.

> gem install rails --include-dependencies


4. MySQL/Ruby 설치
루비에서 MySQL을 사용할 수 있도록 사용할 수 있게 해주는 모듈입니다. 루비에서 공식적으로 지원하는 다른 방법이 있는지는 모르겠습니다.

1) 설치
> wget http://tmtm.org/downloads/mysql/ruby/mysql-ruby-2.8.tar.gz
> tar -xvzf mysql-ruby-2.8.tar.gz
> cd mysql-ruby-2.8pre4
> ruby extconf.rb --with-mysql-dir=/usr/local/mysql
> make
> make install

2) 확인
아래와 같이 test_db.rb 파일을 만들고 쉘상에서 ruby test_db.rb로 실행하여 확인하실 수 있습니다.

require "mysql"
db = Mysql::new("HOST", "USER_ID", "PASSWORD", "DATABASE")
res = db.query("select * from TABLE_NAME")
res.each_hash do |row|
  puts row['FIELD_NAME']
end 


5. passenger 설치
rails는 자체 웹서버를 구동할 수 있지만 아파치와 연동해서 가상 호스트로 사용하는 것이 편하기 때문에 passenger를 설치합니다. passenger외에도 다양한 웹서버가 존재하지만 설치가 가장 간편하기 때문에 passenger를 선택했습니다.

개발시에는 로그나 오류메시지를 친절하게 보여주는 Webrick이나 Mongrel을 사용하는 것이 더 편할 것 같습니다.

1) 설치
현재 버젼은 2.0.3이며 gem으로 설치할 수 있습니다.

> gem install passenger
> passenger-install-apache2-module

2) httpd.conf 파일 수정
메시지를 확인해 보시고 엔터를 입력합니다. 아파치 httpd.conf에 아래의 내용을 추가합니다. (서버의 환경과 버젼에 따라 수정해야될 부분이 있을 수도 있습니다)

LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.3/ext/apache2/mod_passenger.so

PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.3
PassengerRuby /usr/local/bin/ruby

3) 가상 호스트 등록
httpd-vhosts.conf에 사용할 호스트를 추가하고 아파치를 재시작 합니다. 도메인과 디렉토리는 환경에 맞게 수정합니다.

<VirtualHost *:80>
    ServerName DOMAIN
    DocumentRoot /home/zzerr/www/public
</VirtualHost>


6. 테스트

1) 프로젝트 생성
이제 적당한 디렉토리에서 아래와 같이 실행하여 rails 프로젝트를 생성합니다.

> rails www -d mysql

2) 확인
웹브라우져에서 아파치에 가상호스트로 등록했던 도메인을 입력하여 아래와 같은 메시지가 나오는지 확인합니다.



이제 본격적으로 삽질할 준비를 완료했습니다. 루비온레일즈 초보자의 설치기를 올려 보았는데, 뭐 좋은 거(?) 알고 계신 분들은 많은 조언 부탁드리겠습니다.

'기타' 카테고리의 다른 글

3. Rails 어플리케이션 기본 설정  (4) 2008.10.21
2. Rails 어플리케이션 생성  (0) 2008.10.20
아이팟 터치 2세대  (8) 2008.10.10
OS X 루트계정 활성화  (6) 2008.10.08
nib 파일 둘러보기  (7) 2008.09.01
AND

PickerView, ImageView, TableView를 이용한 간단한 예제입니다. 좌측의 테이블뷰나 하단의 피커뷰에서 moveIn, push, reveal, fade 효과를 선택하면 우측의 이미지가 해당 효과로 다음 이미지와 변환되는 간단한 샘플입니다. 피커뷰의 2번째 컴퍼넌트에서는 효과가 진행되는 방향을 설정합니다. fade 효과에서는 이 방향이 적용되지 않습니다.

(사용한 샘플 이미지에 대해선 사과 드립니다)

이 샘플은 애플의 아이폰 DevCenter의 샘플코드중에서 UICatalogView Transitions 를 참조하였습니다.

1. 프로젝트 생성

Xcode의 메뉴에서 File / New Project를 클릭합니다. iPhone OS / Application을 선택하고 View-Based Application 템플릿을 선택하고 Choose..를 클릭합니다.


적당한 프로젝트명을 입력하고 Save를 클릭하여 프로젝트를 생성합니다. 여기서는 Control2로 생성하였습니다.


2. 소스코드 수정
Control2ViewController의 소스와 헤더 파일에 아래의 푸른색으로 되어 있는 부분을 입력합니다. 설명은 간단한 주석으로 대체하겠습니다.

1) Control2ViewController.h
#import <UIKit/UIKit.h>

@interface Control2ViewController : UIViewController {

    IBOutlet UITableView *myTableView;
    IBOutlet UIPickerView *myPickerView;
    IBOutlet UIView *myView;
   
    UIImageView *imageView1;
    UIImageView *imageView2;
   
    NSArray *effectArray;
    NSArray *directionArray;
}

@end

2) Control2ViewController.m
#import "Control2ViewController.h"
#import <QuartzCore/QuartzCore.h>

@implementation Control2ViewController

static NSString *kCellIdentifier = @"MyIdentifier";
static NSString *kAnimationKey = @"transitionViewAnimation";

- (void)viewDidLoad {
    [super viewDidLoad];
   
    // 에니메이션 효과들을 배열로 저장
    effectArray = [[NSArray arrayWithObjects:kCATransitionMoveIn, kCATransitionPush,
                    kCATransitionReveal, kCATransitionFade, nil] retain];
   
    // 에니메이션 시 진행방향을 배열로 저장
    directionArray = [[NSArray arrayWithObjects:kCATransitionFromLeft, kCATransitionFromRight,
                       kCATransitionFromTop, kCATransitionFromBottom, nil] retain];
   
    // 이미지 뷰 생성
    imageView1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"no1.png"]];
    imageView2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"no2.png"]];
   
    // 이미지 뷰 크기 설정
    CGRect rect;
   
    rect.origin = CGPointZero;
    rect.size = [myView frame].size;
       
    [imageView1 setFrame:rect];
    [imageView2 setFrame:rect];

    // 첫번째 이미지 뷰 추가
    [myView addSubview:imageView1];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
    // Release anything that's not essential, such as cached data
}


- (void)dealloc {
    [imageView1 release];
    [imageView2 release];
   
    [effectArray release];
    [directionArray release];
   
    [super dealloc];
}

#pragma mark Animation methods

/** 에니메이션 실행 */
- (void)transitionView:(NSUInteger)effect
{
    UIView* newView;
    UIView* oldView;
   
    // 나올 뷰와 사라질 뷰를 설정
    if ([imageView1 superview] == myView) {
        newView = imageView2;
        oldView = imageView1;
    } else {
        newView = imageView1;
        oldView = imageView2;
    }
   
    // 이전 뷰를 삭제하고 새로운 뷰를 등록
    [oldView removeFromSuperview];
    if (newView && ([newView superview] == nil)) {
        [myView insertSubview:newView atIndex:1];
    }
   
    // 에니메이션 효과와 방향을 설정
    NSString *transition = [effectArray objectAtIndex:effect];
    NSString *direction = [directionArray objectAtIndex:[myPickerView selectedRowInComponent:1]];
   
    // 에니메이션
    CATransition *animation = [CATransition animation];
   
    // 변환효과 설정
    if (transition == kCATransitionFade) {
        [animation setType:kCATransitionFade];
    } else {
        [animation setType:transition];
        [animation setSubtype:direction];
    }
   
    // 변환속도 설정
    [animation setDuration:0.75];
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
   
    [[myView layer] addAnimation:animation forKey:kAnimationKey];
}   


#pragma mark TableView delegate/dataSource methods

/** 테이블뷰의 선택이 변경되었을 경우 */
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // PickerView의 효과 컴포넌트 선택 변경
    [myPickerView selectRow:[indexPath row] inComponent:0 animated:TRUE];
   
    // 에니메이션 실행
    [self transitionView:[indexPath row]];
}

/** 테이블뷰 섹션 수 */
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

/** 테이블뷰 row count */
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [effectArray count];
}

/** 테이블뷰 각 항목 타이틀 설정 */
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:kCellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:kCellIdentifier] autorelease];
    }
   
    cell.text = [effectArray objectAtIndex:indexPath.row];
   
    return cell;
}

/** 색션 해더 타이틀 설정 */
- (NSString *)tableView:(UITableView *)aTableView titleForHeaderInSection:(NSInteger)section
{
    return @"Effect";
}


#pragma mark PickerView delegate/dataSource methods

/** 피커뷰의 선택이 변경되었을 경우 */
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    // componet가 0(첫번째 컴퍼넌트)일 경우에만 처리
    if (component == 0) {
        // 테이블뷰의 선택된 row 변경
        [myTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:component]
                                 animated:NO
                           scrollPosition:UITableViewScrollPositionTop];
   
        // 에니메니션 실행
        [self transitionView:row];
    }
}

/** 피커뷰의 컴퍼넌트 수 설정 - 2(효과, 방향) */
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
    return 2;
}

/** 피커뷰의 각 컴퍼넌트의 row count */
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    if (component == 0)
        return [effectArray count];
    else
        return [directionArray count];
}

/** 피커뷰의 각 컴퍼넌트의 항목 타이틀 설정 */
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (component == 0)
        return [effectArray objectAtIndex:row];
    else
        return [directionArray objectAtIndex:row];
}

@end


3. 인터페이스 빌더

이제 인터페이스 빌더에서 UI를 생성하고 속성들을 연결해 보겠습니다.

Groups & Files의 Resources 폴더에서 Control2ViewController.xib를 더블클릭하여 인터페이스 빌더를 오픈 합니다.

1) 컨트롤 배치
라이브러리 윈도우에서 View, TableView, PickerView를 각각 드래그 해서 아래와 같이
View에 배치합니다.

2) Outlet 연결
xib 윈도우에서 File's Owner를 우클릭 합니다. 여기서 File's Owner는 Control2ViewController 입니다. 각 Outlet들을 위에서 생성한 컨트롤들과 연결합니다. myPickerView를 PickerView와 myTableView를 TableView와 myView를 View로 연결합니다.
 

이제 작업이 완료되었습니다. 빌드를 하고 테스트를 하여 봅니다. 아래는 전체 프로젝트를 압축한 파일입니다.


AND